Giao thức truyền trực tuyến trình phát bộ thu web

SDK Bộ thu trên web hỗ trợ 3 loại giao thức phát trực tuyến hiện nay:

DASH, Phát trực tuyến dựa trên HTTP Truyền phát mượt mà.

Trong tài liệu này, chúng tôi liệt kê các hoạt động hỗ trợ đối với từng giao thức truyền trực tuyến. Xin lưu ý rằng phần giải thích về các thẻ được hỗ trợ cho mỗi giao thức khá viết tắt so với thông số kỹ thuật chi tiết của giao thức. Mục tiêu là để cung cấp cho bạn cái nhìn tổng quan và hiểu biết nhanh về cách sử dụng từng giao thức cũng như những tính năng của giao thức được hỗ trợ trên các thiết bị hỗ trợ Cast để cung cấp trải nghiệm truyền trực tuyến.

Truyền phát thích ứng động qua HTTP (DASH)

Thông số kỹ thuật chi tiết về DASH của ISO.

DASH là một giao thức phát trực tuyến có tốc độ bit thích ứng cho phép phát trực tuyến video chất lượng cao thông qua máy chủ HTTP(S). Một tệp kê khai, được tạo trong XML, chứa hầu hết thông tin siêu dữ liệu về cách khởi chạy và tải nội dung video xuống. Các khái niệm chính mà Trình phát bộ thu trên web hỗ trợ là <Period>, <AdaptationSet>, <Representation>, <SegmentTemplate>, <SegmentList>, <BaseUrl><ContentProtection>.

Tệp kê khai DASH bắt đầu bằng thẻ <MPD> gốc và bên trong bao gồm một hoặc nhiều thẻ <Period>, đại diện cho một nội dung phát trực tuyến. Thẻ <Period> cho phép sắp xếp thứ tự các phần nội dung phát trực tuyến khác nhau và thường được dùng để phân tách nội dung chính và quảng cáo hoặc nhiều nội dung video liên tiếp.

<AdaptationSet> trong <MPD> là một tập hợp các đại diện cho một loại luồng nội dung đa phương tiện, trong hầu hết các trường hợp là video, âm thanh hoặc phụ đề. Các loại MIME được hỗ trợ phổ biến nhất là "video/mp4", "audio/mp4" và "text/vtt". Bạn có thể đưa <ContentComponent contentType="$TYPE$"> (không bắt buộc) vào trong <AdaptationSet>.

Bên trong mỗi <AdaptationSet>, bạn sẽ thấy một danh sách các thẻ <Representation> và Trình phát Web receiver sẽ dùng thông tin codecs để khởi động vùng đệm nguồn MSE và thông tin bandwidth để tự động chọn nội dung trình bày/tốc độ bit phù hợp để phát.

Đối với mỗi <Representation>, các phân khúc nội dung nghe nhìn được mô tả bằng cách sử dụng <BaseURL> để thể hiện một phân khúc, <SegmentList> cho danh sách phân khúc (tương tự như HLS) hoặc <SegmentTemplate>.

Đối với <SegmentTemplate>, thuộc tính này cho biết cách biểu thị phân đoạn khởi tạo và phân đoạn nội dung nghe nhìn thông qua việc tạo mẫu. Trong ví dụ bên dưới, $Number$ cho biết số phân khúc có sẵn từ CDN. Vì vậy, nó sẽ chuyển thành seg1.m4s, seg2.m4s, v.v. khi quá trình phát tiếp tục.

<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:ns2="http://www.w3.org/1999/xlink"
  profiles="urn:mpeg:dash:profile:isoff-live:2011,http://dashif.org/guidelines/dash264" type="static"
  publishTime="2016-10-05T22:07:14.859Z" mediaPresentationDuration="P1DT0H0M0.000S" minBufferTime="P0DT0H0M7.500S">
  <Period id="P0">
    <AdaptationSet lang="en" segmentAlignment="true">
      <ContentComponent id="1" contentType="audio"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="150123" audioSamplingRate="44100"
        mimeType="audio/mp4" codecs="mp4a.40.2" startWithSAP="1">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
        <BaseURL>http://www.google.com/testVideo</BaseURL>
      </Representation>
    </AdaptationSet>
    <AdaptationSet segmentAlignment="true">
      <ContentComponent id="1" contentType="video"/>
      <SegmentTemplate media="seg$Number$.m4s" initialization="seginit.mp4"
        duration="10000" startNumber="1" timescale="1000" presentationTimeOffset="0"/>
      <Representation id="1" bandwidth="212191" width="384" height="208" sar="26:27"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate1/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="366954" width="512" height="288" sar="1:1"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate2/</BaseURL>
      </Representation>
      <Representation id="1" bandwidth="673914" width="640" height="352" sar="44:45"
        frameRate="25" mimeType="video/mp4" codecs="avc1.42c01f" startWithSAP="1">
        <BaseURL>http://www.google.com/testVideo/bitrate3/</BaseURL>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

Đối với <SegmentTemplate>, bạn thường sử dụng thẻ <SegmentTimeline> để cho biết thời lượng của mỗi phân đoạn và phân đoạn nào lặp lại. timescale (đơn vị biểu thị một giây) thường được đưa vào như một phần của các thuộc tính của <SegmentTemplate> để chúng ta có thể tính thời gian của phân đoạn dựa trên đơn vị này. Trong ví dụ dưới đây, thẻ <S> biểu thị một thẻ phân đoạn, thuộc tính d chỉ định thời lượng của phân đoạn và thuộc tính r chỉ định số lượng phân đoạn có cùng thời lượng lặp lại để $Time$ có thể tính toán chính xác khi tải phân đoạn nội dung nghe nhìn xuống như đã chỉ định trong thuộc tính media.

<SegmentTemplate>
  timescale="48000"
  initialization="$RepresentationID$-init.dash"
  media="$RepresentationID$-$Time$.dash"
    startNumber="1">
    <SegmentTimeline>
      <S t="0" d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
      <S d="95232" />
      <S d="96256" r="2" />
   </SegmentTimeline>
</SegmentTemplate>

Sau đây là ví dụ về cách biểu diễn bằng <SegmentList>:

<Representation id="FirstRep" bandwidth="2000000" width="1280"
  height="720">
  <BaseURL>FirstRep/</BaseURL>
  <SegmentList timescale="90000" duration="270000">
     <RepresentationIndex sourceURL="representation-index.sidx"/>
     <SegmentURL media="seg-1.ts"/>
     <SegmentURL media="seg-2.ts"/>
     <SegmentURL media="seg-3.ts"/>
  </SegmentList>
</Representation>

Đối với tệp phân đoạn đơn, <SegmentBase> thường được dùng với các yêu cầu phạm vi byte để chỉ định phần nào của tệp <BaseURL> có chứa chỉ mục và phần còn lại có thể được tìm nạp theo yêu cầu khi quá trình phát tiếp tục hoặc tua. Ở đây, phạm vi Initialization chỉ định phạm vi siêu dữ liệu ban đầu và indexRange chỉ định chỉ mục cho các phân đoạn nội dung nghe nhìn. Xin lưu ý rằng hiện tại chúng tôi chỉ hỗ trợ các dải byte liên tiếp.

<Representation bandwidth="4190760" codecs="avc1.640028"
  height="1080" id="1" mimeType="video/mp4" width="1920">
  <BaseURL>video.mp4<BaseURL>
  <SegmentBase indexRange="674-1149">
    <Initialization range="0-673" />
  </SegmentBase>
</Representation>

Bất kể bạn sử dụng cách biểu diễn nào, nếu luồng được bảo vệ, thì phần <ContentProtection> có thể xuất hiện trong <AdaptationSet>, trong đó schemeIdUri xác định duy nhất hệ thống DRM sẽ sử dụng. Bạn có thể thêm mã khoá (không bắt buộc) để mã hoá chung.

<!-- Common Encryption -->
<ContentProtection
  schemeIdUri="urn:mpeg:dash:mp4protection:2011"
  value="cenc"
  cenc:default_KID="7D2714D0-552D-41F5-AD56-8DD9592FF891">
</ContentProtection>

<!-- Widevine -->
<ContentProtection
  schemeIdUri="urn:uuid:EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED">
</ContentProtection>

Để biết thêm ví dụ và thông tin chi tiết, vui lòng tham khảo thông số kỹ thuật MPEG-DASH. Dưới đây là danh sách các thuộc tính DASH bổ sung trên các thẻ không được đề cập ở trên mà chúng tôi hiện hỗ trợ:

Tên thuộc tính Hàm thuộc tính
mediaPresentationDuration Thời lượng của nội dung video.
minimumUpdatePeriod Thuộc tính của thẻ <MPD>; chỉ định tần suất chúng tôi cần tải lại tệp kê khai.
loại Thuộc tính của thẻ <MPD>; "động" để cho biết đây là sự kiện phát trực tiếp.
presentationTimeOffset Thuộc tính của thẻ <SegmentBase>; chỉ định độ lệch thời gian trình bày từ đầu khoảng thời gian.
startNumber Chỉ định số lượng phân đoạn nội dung nghe nhìn đầu tiên trong bản trình bày trong một khoảng thời gian. Dạng này thường được dùng trong sự kiện phát trực tiếp.

Chúng tôi cũng hỗ trợ nhận dạng hộp EMSG bên trong các mảnh MP4 cho DASH và cung cấp EmsgEvent cho nhà phát triển.

Mặc dù Trình phát Web receiver hiện tại của chúng tôi hỗ trợ các trường hợp sử dụng DASH chính, nhưng sau đây là danh sách các thuộc tính phổ biến mà cách triển khai DASH hiện tại bỏ qua hoặc không sử dụng. Điều này có nghĩa là bất kể tệp kê khai có chứa mã đó hay không, chúng đều không ảnh hưởng đến trải nghiệm phát nội dung.

  • availabilityStartTime
  • segmentAlignment

Phát trực tuyến dựa trên HTTP (HLS)

Bạn có thể xem thông tin tổng quan và thông số đầy đủ của tính năng phát trực tiếp dựa trên HTTP tại đây.

Một trong những điểm mạnh chính của Trình phát Web receiver là khả năng hỗ trợ phát lại HLS trong MSE. Khác với DASH (Truyền phát thích ứng động qua HTTP), trong đó tệp kê khai xuất hiện trong một tệp duy nhất, HLS sẽ gửi danh sách phát chính chứa danh sách tất cả các luồng biến thể cùng với URL tương ứng. Danh sách phát biến thể là danh sách phát nội dung nghe nhìn. 2 thẻ HLS chính mà Trình phát Web receiver hiện đang hỗ trợ trong danh sách phát chính là:

Tên thẻ Chức năng
#EXT-X-STREAM-INF Chỉ định một tốc độ bit/luồng biến thể. Thuộc tính BANDWIDTH là bắt buộc để hỗ trợ lựa chọn phát trực tuyến theo tốc độ bit thích ứng. Bạn nên sử dụng thuộc tính CODECS để khởi chạy MSE, chẳng hạn như "avc1.42c01e,mp4a.40.2". Nếu không được chỉ định, trường hợp mặc định sẽ được đặt thành video H264 chính của hồ sơ 3.0 và nội dung mã hoá âm thanh "mp4a.40.2".
#EXT-X-MEDIA Chỉ định danh sách phát nội dung nghe nhìn bổ sung (trong thuộc tính URI) đại diện cho nội dung. Đây thường là các luồng âm thanh thay thế ở định dạng khác (âm thanh vòm 5.1) hoặc ngôn ngữ khác. Cho phép thuộc tính của TYPE chứa VIDEO, AUDIO, SUBTITLES hoặc CLOSED-CAPTIONS. Việc đặt thuộc tính DEFAULT thành YES sẽ cho biết việc chọn luồng thay thế này theo mặc định.

Dưới đây là danh sách các thẻ HLS mà Trình phát Web receiver hiện hỗ trợ trong danh sách phát nội dung nghe nhìn:

Tên thẻ Chức năng
#EXTINF Thông tin truyền trực tuyến, thường theo sau là thời lượng của phân đoạn tính bằng giây và trên dòng tiếp theo là URL của phân đoạn.
#EXT-X-TARGETDURATION Thời lượng tính bằng giây của mỗi phân đoạn. Yếu tố này cũng xác định tần suất chúng tôi tải xuống/làm mới tệp kê khai danh sách phát cho một sự kiện phát trực tiếp. Trình phát Web receiver không hỗ trợ thời lượng ngắn hơn 0,1 giây.
#EXT-X-MEDIA-SEQUENCE Số thứ tự (thường dùng cho một chương trình phát trực tiếp) mà phân đoạn đầu tiên trong danh sách phát này đại diện.
#EXT-X-KEY Thông tin về khoá DRM. Thuộc tính METHOD cho chúng ta biết hệ thống khoá nào sẽ sử dụng. Hiện tại, chúng tôi hỗ trợ AES-128SAMPLE-AES.
#EXT-X-BYTERANGE Phạm vi byte để tìm nạp cho một URL phân đoạn.
#EXT-X-DISCONTINUITY Chỉ định gián đoạn giữa các phân đoạn liên tiếp. Điều này thường thấy với tính năng chèn quảng cáo phía máy chủ, trong đó phân khúc quảng cáo xuất hiện ở giữa luồng chính.
#EXT-X-PROGRAM-DATE-TIME Thời gian tuyệt đối của mẫu đầu tiên của phân đoạn tiếp theo, ví dụ: "2016-09-21T23:23:52.066Z".
#EXT-X-ENDLIST Cho dù đây là video theo yêu cầu hay sự kiện phát trực tiếp.

Đối với chương trình phát trực tiếp, chúng tôi sử dụng #EXT-X-PROGRAM-DATE-TIME#EXT-X-MEDIA-SEQUENCE làm yếu tố chính để xác định cách hợp nhất một tệp kê khai mới được làm mới. Nếu có, #EXT-X-PROGRAM-DATE-TIME sẽ được dùng để khớp với các phân đoạn được làm mới. Nếu không, số #EXT-X-MEDIA-SEQUENCE sẽ được sử dụng. Xin lưu ý rằng theo thông số kỹ thuật HLS, chúng tôi không sử dụng thông tin so sánh tên tệp để so khớp.

Quá trình triển khai HLS của chúng tôi hỗ trợ chọn một luồng âm thanh thay thế, chẳng hạn như âm thanh vòm 5.1 làm bản phát âm thanh chính. Bạn có thể thực hiện việc này bằng cách sử dụng thẻ #EXT-X-MEDIA với các bộ mã hoá và giải mã thay thế cũng như cung cấp định dạng phân đoạn trong cấu hình luồng.

Trình phát trình thu nhận web dự kiến một số hành vi theo thông số kỹ thuật nhất định. Ví dụ: sau thẻ #EXT-INF, chúng ta sẽ có một URI. Nếu đó không phải là URI, ví dụ: #EXT-X-DISCOUNTINUITY sẽ khiến quá trình phân tích cú pháp danh sách phát không thành công.

Cứ sau #EXT-X-TARGETDURATION giây, chúng tôi sẽ tải lại danh sách phát/tệp kê khai để lấy danh sách phân đoạn mới và cập nhật bản trình bày nội bộ mới của tất cả các phân khúc thành phân khúc mới. Bất cứ khi nào một lượt tìm kiếm được yêu cầu, chúng tôi chỉ tua trong phạm vi có thể tìm kiếm. Đối với trực tiếp, chúng tôi chỉ cho phép tìm kiếm từ đầu danh sách mới nhất cho đến 3 thời lượng mục tiêu từ cuối danh sách. Ví dụ: nếu bạn có danh sách 10 phân đoạn và đang ở phân đoạn 6, thì bạn chỉ có thể tìm kiếm tối đa 7, chứ không thể tìm kiếm 8.

Hỗ trợ định dạng phân đoạn

SDK CAF hỗ trợ phát nội dung được phân phối ở nhiều định dạng như được tham chiếu trong HlsSegmentFormat đối với âm thanh và HlsVideoSegmentFormat đối với video. Trong đó có tính năng hỗ trợ âm thanh đóng gói như phát AAC và AC3, cả được mã hoá và không mã hoá. Bạn phải chỉ định thông tin này trong MediaInformation của LoadRequestData để mô tả đúng nội dung cho người chơi. Nếu không được chỉ định, cấu hình trình phát mặc định sẽ tìm cách phát nội dung dưới dạng nội dung đóng gói Transport Stream (Truyền phát trực tuyến). Bạn có thể đặt thuộc tính này từ bất kỳ người gửi nào trong dữ liệu yêu cầu tải (Android, iOSWeb) hoặc trong trình nhận thông qua trình chặn thư.

Xem đoạn mã mẫu bên dưới hoặc hướng dẫn Tải nội dung nghe nhìn bằng contentId, contentUrl và thực thể để biết thêm thông tin về cách chuẩn bị nội dung trên Trình thu nhận trên web.

playerManager.setMessageInterceptor(
    cast.framework.messages.MessageType.LOAD, loadRequestData => {
      ...
      // Specify segment format for an HLS stream playing CMAF packaged content.
      loadRequestData.media.contentType = 'application/x-mpegurl';
      loadRequestData.media.hlsSegmentFormat = cast.framework.messages.HlsSegmentFormat.FMP4;
      loadRequestData.media.hlsVideoSegmentFormat = cast.framework.messages.HlsVideoSegmentFormat.FMP4;
      ...
      return loadRequestData;
    });

Bảo vệ nội dung

Như đã liệt kê trong phần thẻ #EXT-X-KEY ở trên, SDK truyền hỗ trợ SAMPLE-AES hoặc SAMPLE-AES-CTR, trong đó có thể chỉ định URI cho khoá mà vectơ khởi tạo:

EXT-X-KEY: METHOD=SAMPLE-AES, \
URI="data:text/plain;base64,XXXXXX", \
IV=0x6df49213a781e338628d0e9c812d328e, \
KEYFORMAT="com.widevine", \
KEYFORMATVERSIONS="1"

KEYFORMAT mà chúng tôi hỗ trợ hiện là Widevine và URI chứa thông tin DRM được mã hoá BASE64 XXXXXXX. Khi được giải mã sẽ chứa mã nhận dạng khoá:

{
   "content_id": "MTQ1NjkzNzM1NDgxNA==",
   "key_ids": [
      "xxxxxxxxxxxxxxxx"
   ]
}

Phiên bản 1 xác định các thuộc tính sau:

Thuộc tính Ví dụ: Nội dung mô tả
KEYFORMATVERSIONS "1" Đề xuất này xác định định dạng chính phiên bản 1
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID là UUID của Widevine từ DASH IF IOP. Hệ thống sử dụng cùng một chuỗi chính xác trong MPD với các luồng đã mã hoá Widevine.
URI "data:text/plain;base64, <base64 encoded PSSH box>" URI của luồng chứa loại dữ liệu và hộp PSSH.
METHOD SAMPLE-AES-CTR Cho biết thuật toán mật mã mã hoá được dùng khi mã hoá nội dung. MẪU-AES cho biết nội dung được mã hoá bằng "cbcs". Mẫu-AES-CTR báo hiệu rằng nội dung được mã hoá bằng một trong các lược đồ bảo vệ AES-CTR, cụ thể là "cenc".

Thuộc tính được ánh xạ tới DASH MPD:

Thuộc tính Nội dung mô tả
KEYFORMAT Thuộc tính schemaIdUri của phần tử ContentProtection.
URI Nội dung của phần tử cenc:pssh.
KEYID Chuỗi thập lục phân 16 byte mã hoá mã khoá có cùng vai trò với default_kid trong MPEG DASH. Nếu sử dụng lược đồ khoá phân cấp, thì đây sẽ là khoá "gốc".

Ví dụ về danh sách phát HLS có tín hiệu V2:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-TARGETDURATION:2
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MAP:URI="init_segment.mp4"
#EXTINF:1.001,
output_video-1.mp4
#EXT-X-DISCONTINUITY
#EXT-X-KEY:METHOD=SAMPLE-AES,URI="data:text/plain;base64,AAAAPXBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAB0aDXdpZGV2aW5lX3Rlc3QiDHRlc3QgY29udGVudA==",KEYID=0x112233445566778899001122334455,KEYFORMAT="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",KEYFORMATVERSION="1"
#EXTINF:1.001,
output_video-2.mp4
#EXTINF:0.734,
output_video-3.mp4
#EXT-X-ENDLIST

Dưới đây là danh sách các tính năng và thẻ trong HLS mà chúng tôi hiện không sử dụng hoặc không hỗ trợ. Sự hiện diện hay vắng mặt của họ không ảnh hưởng đến hoạt động phát trực tuyến.

  • Thuộc tính RESOLUTION= trong #EXT-X-STREAM-INF sẽ bị bỏ qua.
  • Không sử dụng thuộc tính AUTOSELECT= trong #EXT-X-MEDIA. Thay vào đó, chúng tôi dựa vào DEFAULT=
  • #EXT-X-I-FRAME-STREAM-INF trong danh sách phát chính sẽ bị bỏ qua.
  • #EXT-X-DISCONTINUITY-SEQUENCE bị bỏ qua
  • #EXT-X-PLAYLIST-TYPE:EVENT có thể xuất hiện trong luồng trực tiếp và #EXT-X-PLAYLIST-TYPE:VOD có thể xuất hiện trong luồng VOD nhưng hiện tại, Trình phát trên web của chúng tôi chỉ dựa vào sự tồn tại của #EXT-X-ENDLIST để xác định so với VOD trực tiếp.

Phát trực tuyến mượt mà

Thông số kỹ thuật chính thức của Microsoft về tính năng phát trực tuyến mượt mà.

Hoạt động phát trực tuyến mượt mà cung cấp giao thức truyền thích ứng và thông số kỹ thuật XML qua HTTP (tương tự như DASH). Khác với DASH, tính năng mượt mà phát trực tuyến đề xuất chỉ đóng gói MPEG-4 cho các phân đoạn nội dung nghe nhìn.

Sau đây là bảng gồm các thẻ và thuộc tính phổ biến nhất trong tính năng Phát trực tuyến mượt mà mà Trình phát bộ thu trên web hỗ trợ hiện nay. Nhiều khái niệm đã được giải thích trong phần DASH ở trên.

Thẻ/Thuộc tính Cách sử dụng
<SmoothStreamingMedia> Thẻ chính cho tệp kê khai, chứa các thuộc tính của:
  • Timescale: Số đơn vị đại diện cho một giây, thường là 10.000.000.
  • Thời lượng: Độ dài của nội dung theo thang thời gian. Trình phát Web receiver không hỗ trợ thời lượng ngắn hơn 0,1 giây.
  • IsLive: Liệu tệp kê khai có phải là nội dung nghe nhìn trực tiếp hay không.
<StreamIndex> Một nhóm luồng, tương tự như AdapterSet của DASH. Loại này thường là "văn bản", "video" hoặc "âm thanh". Thuộc tính Url thường chứa URL mảnh theo mẫu bằng cách sử dụng các thông tin như tốc độ bit hoặc thời gian bắt đầu.
<QualityLevel> Mỗi thẻ QualityLevel chỉ định tốc độ bit và bộ mã hoá và giải mã FourCC. Mã FourCC thường là "H264", "AVC1", "AACL", v.v. Đối với video, thẻ này chỉ định độ phân giải thông qua MaxWidth và MaxHeight. Đối với âm thanh, phương thức này chỉ định tần số (chẳng hạn như 44100) thông qua SamplingRate và số Channel.
<c> Phần tử mảnh trong luồng. Chứa:
  • d: thời lượng của một mảnh.
  • t: Thời gian truyền thông của mảnh.
<Bảo vệ> Một thẻ có thuộc tính SystemID (không bắt buộc) liệt kê mã nhận dạng của hệ thống DRM để sử dụng trong thẻ <SmoothStreamingMedia>.
<ProtectionHeader> Trong <Protection>, có thể chứa thuộc tính của SystemID và dữ liệu tuỳ chỉnh, thường là Base64 được mã hoá. Đối với Widevine, tệp này sẽ chứa mã khoá, độ dài khoá, mã thuật toán (chẳng hạn như AESCTR, LA_URL (url thu nạp giấy phép), LUI_URL (URL giao diện người dùng cấp phép) và DS_ID (mã dịch vụ miền).

Bảo vệ nội dung

Để mã hoá đúng mã hệ thống bảo vệ, vui lòng sử dụng sơ đồ liên kết bên dưới:

  • WIDEVINE: 'EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED',
  • XOÁ: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B',
  • MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'

Đối với <ProtectionHeader>, dưới đây là một ví dụ với dữ liệu được mã hoá Base64. Khi được giải mã, dữ liệu sẽ tuân theo cùng một định dạng đã giải mã như mô tả trong phần hỗ trợ bảo vệ nội dung DASH ở trên.

<Protection>
  <ProtectionHeader SystemID="9a04f079-9840-4286-ab92-e65be0885f95">
    $BASE64ENCODED_DATA
  </ProtectionHeader>
</Protection>

Dưới đây là ví dụ về một tệp kê khai phát trực tiếp mượt mà có thời lượng nội dung là 3000 giây:

<?xml version="1.0"?>
  <SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="3000000000"
    TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="600000000" CanSeek="TRUE" CanPause="TRUE">
    <StreamIndex Type="text" Name="textstream301_swe" Language="swe" Subtype="CAPT" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(textstream301_swe={start time})">
      <QualityLevel Index="0" Bitrate="20000" CodecPrivateData="" FourCC="DFXP"/>
        <c d="40000000" t="80649382288125"/>
        <c d="39980000"/>
        <c d="40020000"/>
    </StreamIndex>
    <Protection>
      <ProtectionHeader> SystemID="$BASE64ENCODEDDRMDATA$"</ProtectionHeader>
    </Protection>
    <StreamIndex Type="audio" Name="audio101_eng" Language="eng" Subtype="AACL" Chunks="0"
      TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio101_eng={start time})">
      <QualityLevel Index="0" Bitrate="128000" CodecPrivateData="1290" FourCC="AACL" AudioTag="255"
        Channels="2" SamplingRate="32000" BitsPerSample="16" PacketSize="4"/>
      <c d="40000000" t="80649401327500"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
    <StreamIndex Type="video" Name="video" Subtype="AVC1" Chunks="0" TimeScale="10000000"
      Url="QualityLevels({bitrate})/Fragments(video={start time})">
      <QualityLevel Index="0" Bitrate="400000" CodecPrivateData="000000016742E01596540C0EFCB808140000000168CE3880"
        FourCC="AVC1" MaxWidth="384" MaxHeight="216"/>
      <QualityLevel Index="1" Bitrate="800000" CodecPrivateData="00000001674D401E965281004B6020500000000168EF3880"
        FourCC="AVC1" MaxWidth="512" MaxHeight="288"/>
      <QualityLevel Index="2" Bitrate="1600000" CodecPrivateData="00000001674D401E965281B07BCDE020500000000168EF3880"
        FourCC="AVC1" MaxWidth="854" MaxHeight="480"/>
      <QualityLevel Index="3" Bitrate="2200000" CodecPrivateData="00000001674D401F96528080093602050000000168EF3880"
        FourCC="AVC1" MaxWidth="1024" MaxHeight="576"/>
      <c d="40000000" t="80649401378125"/>
      <c d="40000000"/>
      <c d="40000000"/>
    </StreamIndex>
  </SmoothStreamingMedia>

Trong ví dụ trên cho luồng video, mẫu url là:

QualityLevels({bitrate})/Fragments(video={start time})

Vì vậy, hai phân đoạn đầu tiên (giả sử chúng tôi đang ở mức chất lượng chỉ mục 2) sẽ như sau, với thời gian ban đầu được trích xuất từ t="80649401378125" trong StreamIndex video và mức tăng thời gian 4 giây * 10000000 cho mỗi phân đoạn:

QualityLevels(2)/Fragments(video=80649401378125)
QualityLevels(2)/Fragments(video=80649441378125)
...

Dưới đây là danh sách các thuộc tính Phát trực tuyến mượt mà chúng tôi hiện bỏ qua và không ảnh hưởng đến trải nghiệm truyền trực tuyến bất kể các thuộc tính đó có được cung cấp hay không:

  • CanSeek, CanPause trong thẻ <SmoothStreamingMedia>.
  • Phân đoạn, Qualitylevels trong thẻ <StreamIndex>. Thay vào đó, chúng tôi tính toán số lượng phân đoạn và số lượng mức chất lượng dựa trên thông tin được cung cấp trong <StreamIndex>, chẳng hạn như thẻ QualityLevel thực tế và thẻ <c>.
  • Không sử dụng BitsPerSample, PacketSize trong <QualityLevel>.

Kiểm tra loại màn hình

Phương thức canDisplayType kiểm tra các tính năng video và âm thanh của thiết bị Bộ nhận web, đồng thời hiển thị bằng cách xác thực các tham số nội dung nghe nhìn được truyền vào, trả về một giá trị boolean. Tất cả tham số, trừ tham số đầu tiên là không bắt buộc – bạn đưa vào càng nhiều tham số thì kết quả kiểm tra sẽ càng chính xác.

Chữ ký của trang web là canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

Ví dụ:

Kiểm tra xem thiết bị và màn hình Bộ thu web có hỗ trợ loại MIME video/mp4 với bộ mã hoá và giải mã, kích thước và tốc độ khung hình cụ thể này hay không:

canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)

Kiểm tra xem thiết bị và màn hình Bộ thu web có hỗ trợ định dạng video 4K cho bộ mã hoá và giải mã này hay không bằng cách chỉ định chiều rộng là 3840 và chiều cao là 2160:

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

Kiểm tra xem thiết bị và màn hình Bộ thu web có hỗ trợ HDR10 đối với bộ mã hoá và giải mã, kích thước và tốc độ khung hình này hay không:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

Kiểm tra xem thiết bị Bộ thu web và màn hình có hỗ trợ Dolby Vision (DV) đối với bộ mã hoá và giải mã, kích thước và tốc độ khung hình này hay không:

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

DRM (Quản lý bản quyền nội dung số)

Một số nội dung đa phương tiện yêu cầu Quản lý quyền kỹ thuật số (DRM). Đối với nội dung nghe nhìn có giấy phép DRM (và URL khoá) được lưu trữ trong tệp kê khai (DASH hoặc HLS), SDK Truyền sẽ xử lý trường hợp này cho bạn. Một tập hợp con nội dung đó yêu cầu phải có licenseUrl để lấy khoá giải mã. Trong Trình thu nhận web, bạn có thể dùng PlaybackConfig để đặt licenseUrl nếu cần.

Đoạn mã sau đây cho biết cách bạn có thể thiết lập thông tin yêu cầu cho các yêu cầu cấp phép như withCredentials:

const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
// Customize the license url for playback
playbackConfig.licenseUrl = 'http://widevine/yourLicenseServer';
playbackConfig.protectionSystem = cast.framework.ContentProtection.WIDEVINE;
playbackConfig.licenseRequestHandler = requestInfo => {
  requestInfo.withCredentials = true;
};
context.start({playbackConfig: playbackConfig});

// Update playback config licenseUrl according to provided value in load request.
context.getPlayerManager().setMediaPlaybackInfoHandler((loadRequest, playbackConfig) => {
  if (loadRequest.media.customData && loadRequest.media.customData.licenseUrl) {
    playbackConfig.licenseUrl = loadRequest.media.customData.licenseUrl;
  }
  return playbackConfig;
});

Nếu bạn có tích hợp Trợ lý Google, thì một số thông tin DRM, chẳng hạn như thông tin xác thực cần thiết cho nội dung có thể được liên kết trực tiếp với Tài khoản Google của bạn thông qua các cơ chế như OAuth/SSO. Trong những trường hợp đó, nếu nội dung nghe nhìn được tải thông qua giọng nói hoặc đến từ đám mây, thì setCredentials sẽ được gọi từ đám mây đến Thiết bị truyền để cung cấp thông tin xác thực đó. Sau đó, các ứng dụng viết ứng dụng Bộ thu trên web có thể dùng thông tin setCredentials để vận hành DRM khi cần. Dưới đây là ví dụ về cách sử dụng thông tin xác thực để tạo nội dung đa phương tiện.

Mẹo: Ngoài ra, hãy xem phần Tải nội dung nghe nhìn bằng contentId, contentUrl và thực thể.

Xử lý kênh âm thanh

Khi tải nội dung nghe nhìn, trình phát Truyền sẽ thiết lập một vùng đệm nguồn âm thanh. Đồng thời, trình này cũng chọn một bộ mã hoá và giải mã thích hợp mà vùng đệm sử dụng, dựa trên loại MIME của bản nhạc chính. Bộ mã hoá và bộ mã hoá và giải mã mới được thiết lập:

  • khi quá trình phát bắt đầu,
  • tại mỗi điểm chèn quảng cáo và
  • mỗi khi nội dung chính tiếp tục.

Vì vùng đệm sử dụng một bộ mã hoá và giải mã duy nhất và vì bộ mã hoá và giải mã này được chọn dựa trên âm thanh chính, nên có những trường hợp các âm thanh phụ có thể bị lọc ra và không nghe thấy. Điều này có thể xảy ra khi bản nhạc chính của một chương trình đa phương tiện là âm thanh vòm, nhưng các bản âm thanh phụ lại sử dụng âm thanh nổi. Vì các bản nhạc phụ thường được dùng để cung cấp nội dung bằng ngôn ngữ thay thế, nên việc cung cấp nội dung nghe nhìn chứa số lượng bản nhạc khác nhau có thể tạo ra tác động đáng kể, chẳng hạn như nhiều người xem không thể nghe được nội dung bằng ngôn ngữ bản địa của họ.

Các trường hợp sau đây minh hoạ lý do bạn cần lập chương trình trong đó các kênh chính và phụ có cùng số lượng kênh:

Trường hợp 1 – luồng nội dung nghe nhìn thiếu tính đồng nhất của kênh trên các kênh chính và phụ:

  • tiếng Anh – kênh AC-3 5.1 (chính)
  • Thụy Điển - AAC 2 kênh
  • tiếng pháp – AAC 2 kênh
  • tiếng Đức – AAC 2 kênh

Trong trường hợp này, nếu ngôn ngữ của người chơi được đặt thành bất kỳ ngôn ngữ nào khác ngoài tiếng Anh, thì người dùng sẽ không nghe thấy bản nhạc mà họ muốn nghe, vì tất cả các bản nhạc hai kênh đều bị lọc ra trong khi phát. Bản nhạc duy nhất có thể phát là kênh AC-3 5.1 chính và chỉ khi ngôn ngữ được đặt thành tiếng Anh.

Tình huống 2 – luồng nội dung nghe nhìn với tính năng đồng nhất trên kênh chính trên các kênh chính và phụ:

  • tiếng Anh – kênh AC-3 5.1 (chính)
  • Thụy Điển – AC-3 5.1 kênh
  • tiếng pháp – AC-3 5.1 kênh
  • Đức – AC-3 5.1 kênh

Vì các bản nhạc của sự kiện phát trực tiếp này đều có cùng số lượng kênh nên khán giả sẽ nghe thấy bản nhạc bất kể ngôn ngữ đã chọn là gì.

Xử lý kênh âm thanh Shaka

Trình phát Shaka (DASH) mặc định có số lượng kênh ưu tiên là 2 để giảm thiểu tác động khi gặp nội dung nghe nhìn không đồng nhất trên các bản âm thanh phụ.

Nếu bản nhạc chính không phải là âm thanh vòm (ví dụ: bản âm thanh nổi hai kênh), thì trình phát Shaka sẽ mặc định có hai kênh và sẽ tự động lọc ra mọi bản nhạc đa phương tiện phụ có nhiều hơn hai kênh.

Bạn cũng có thể định cấu hình số lượng kênh âm thanh ưu tiên của Shaka bằng cách thiết lập preferredAudioChannelCount trong thuộc tính shakaConfig trên cast.framework.PlaybackConfig.

Ví dụ:

shakaConfig = { "preferredAudioChannelCount": 6 };

Khi preferredAudioChannelCount được đặt thành 6, Shaka Player sẽ kiểm tra xem có thể hỗ trợ bộ mã hoá và giải mã âm thanh vòm (AC-3 hoặc EC-3) hay không, đồng thời tự động lọc ra mọi kênh nội dung đa phương tiện không phù hợp với số kênh ưu tiên.