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

Web receiver SDK hỗ trợ 3 loại giao thức phát trực tuyến hiện nay:

DASH, Trực tiếp HTTP Phát trực tuyến Truyền trực tuyến mượt mà.

Trong tài liệu này, chúng tôi sẽ liệt kê khả năng hỗ trợ cho từng giao thức truyền trực tuyến. Ghi chú nội dung giải thích các thẻ được hỗ trợ cho mỗi giao thức khá tóm tắt so với đặc tả giao thức chi tiết. Mục tiêu là cung cấp xem nhanh và hiểu rõ cách sử dụng từng giao thức cũng như tính năng của giao thức này được hỗ trợ trên các thiết bị hỗ trợ Cast để truyền trải nghiệm xem trực tuyến.

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

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

DASH là giao thức truyền trực tuyến tốc độ bit thích ứng, cho phép video chất lượng cao phát trực tuyến qua máy chủ HTTP(S). Một tệp kê khai, được cấu thành bằng XML, chứa hầu hết về thông tin siêu dữ liệu về cách khởi chạy và tải video xuống nội dung. 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> hơn đại diện cho một nội dung truyền trực tuyến. Thẻ <Period> cho phép sắp xếp nhiều phần nội dung phát trực tuyến và thường được dùng để tách riêng 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 biểu diễn cho một loại luồng nội dung nghe nhìn, trong hầu hết các trường hợp là video, âm thanh hoặc phụ đề. Nhiều nhất Các mimetype thường được hỗ trợ là "video/mp4", "audio/mp4" và "text/vtt". Một có thể bao gồm <ContentComponent contentType="$TYPE$"> (không bắt buộc) dưới <AdaptationSet>.

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

Đối với mỗi <Representation>, phân đoạn nội dung nghe nhìn được mô tả bằng <BaseURL> để biểu thị một phân đoạn, <SegmentList> cho danh sách phân đoạn (tương tự như HLS) hoặc <SegmentTemplate>.

Đối với <SegmentTemplate>, cột này cho biết cách phân đoạn khởi chạy và có thể được trình bày thông qua mẫu. Trong ví dụ bên dưới $Number$ cho biết số phân đoạn có sẵn từ CDN. Vậy là chuyển sang seg1.m4s, seg2.m4s, v.v. khi 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>, thông thường, bạn nên sử dụng thẻ <SegmentTimeline> để cho biết thời lượng của mỗi đoạn và những đoạn nào sẽ 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 trong 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ụ bên dưới, thẻ <S> biểu thị thẻ phân đoạn, Thuộc tính d chỉ định độ dài của đoạn đường 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 sao cho $Time$ có thể được tính toán chính xác để tải xuống phân đoạn phương tiện như được 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>

Để biểu diễn bằng <SegmentList>, sau đây là một ví dụ:

<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 một phân đoạn, <SegmentBase> thường được dùng cùng với byte các yêu cầu dải ô để chỉ định phần nào trong 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 xảy ra. Ở đây, dải ô Initialization chỉ định dải siêu dữ liệu khởi tạo và indexRange chỉ định chỉ mục cho các phân đoạn nội dung nghe nhìn. Lưu ý rằng chúng tôi hiện 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ể cách biểu diễn nào được sử dụng, nếu các luồng được bảo vệ, Phần <ContentProtection> có thể xuất hiện dưới <AdaptationSet>, trong đó schemeIdUri xác định duy nhất hệ thống DRM cần 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>; xác đị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 rằng đây là một sự kiện phát trực tiếp.
presentationTimeOffset Thuộc tính của thẻ <SegmentBase>; chỉ định chênh lệch thời gian trình bày tính từ đầu kỳ.
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 6 tháng. Thành phần này thường được sử 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 phân đoạn 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 ở đây là danh sách các thuộc tính phổ biến mà việc triển khai DASH hiện tại của chúng 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 chúng không ảnh hưởng đến trải nghiệm phát lại nội dung.

  • availabilityStartTime
  • segmentAlignment

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

Có thể lấy thông tin tổng quan và thông số đầy đủ về tính năng phát trực tiếp qua HTTP tại đây.

Một trong những điểm mạnh chính của Web receiver Player là khả năng hỗ trợ phát HLS trong MSE. Khác với DASH, trong đó tệp kê khai có trong mộ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ể 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. Hai các thẻ HLS chính mà Trình phát bộ thu trên web hiện hỗ trợ trong giao diện danh sách phát:

Tên thẻ Chức năng
#EXT-X-STREAM-INF Chỉ định luồng tốc độ bit/biến thể. Thuộc tính BANDWIDTH là bắt buộc, hỗ trợ lựa chọn truyền trực tuyến với tốc độ bit thích ứng. Chiến lược phát hành đĩa đơn Bạn nên dùng thuộc tính CODECS để khởi chạy MSE, chẳng hạn như dưới tên "avc1.42c01e,mp4a.40.2". Nếu không được chỉ định, trường hợp mặc định là đặt thành video chính H264 chính 3.0 và âm thanh "mp4a.40.2" được mã hoá nội dung.
#EXT-X-MEDIA Chỉ định danh sách phát nội dung nghe nhìn khác (trong thuộc tính URI) biểu thị nội dung. Đây thường là các luồng âm thanh thay thế trong (âm thanh vòm 5.1) hoặc ngôn ngữ. Một thuộc tính của TYPE chứa VIDEO, AUDIO, Đã cho phép SUBTITLES hoặc CLOSED-CAPTIONS. Chế độ cài đặt thuộc tính DEFAULT cho 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 bộ thu trên web hiện hỗ trợ danh sách phát nội dung nghe nhìn:

Tên thẻ Chức năng
#EXTINF Thông tin về luồng, thường theo sau là thời lượng của phân đoạn trong giây và trên dòng tiếp theo 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. Điều này cũng quyết định tần suất chúng ta 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 nhận web Trình phát không hỗ trợ các khoảng thời lượng ngắn hơn 0,1 giây.
#EXT-X-MEDIA-SEQUENCE Số thứ tự (thường cho một sự kiện phát trực tiếp) mà phân đoạn đầu tiên đại diện cho danh sách phát này.
#EXT-X-KEY Thông tin khoá DRM. Thuộc tính METHOD cho chúng ta biết khoá nào để sử dụng. Hiện nay, chúng tôi hỗ trợ AES-128SAMPLE-AES của Google.
#EXT-X-BYTERANGE Phạm vi byte để tìm nạp URL của phân đoạn.
#EXT-X-DISCONTINUITY Chỉ định sự gián đoạn giữa các phân đoạn liên tiếp. Thông tin này thường thấy có chèn quảng cáo phía máy chủ, trong đó một phân đoạn 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ụ: &quot;2016-09-21T23:23:52.066Z&quot;.
#EXT-X-ENDLIST Cho dù đó là video theo yêu cầu hay sự kiện phát trực tiếp.

Đối với sự kiện 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 hiện tại, #EXT-X-PROGRAM-DATE-TIME đượ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. Lưu ý rằng theo Thông số kỹ thuật HLS, chúng tôi không sử dụng so sánh tên tệp để so khớp.

Việc triển khai HLS của chúng tôi hỗ trợ việc chọn luồng âm thanh thay thế, chẳng hạn như Âm thanh vòm 5.1, đóng vai trò phát âm thanh chính. Điều này có thể được thực hiện bằng cách có 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 Web nhận yêu cầu một số hành vi theo từng thông số kỹ thuật nhất định. Ví dụ: sau khi #EXT-INF, chúng tôi dự kiến sẽ có URI. Nếu đó không phải là URI, ví dụ: #EXT-X-DISCOUNTINUITY sẽ khiến danh sách phát bị phân tích cú pháp.

Cứ #EXT-X-TARGETDURATION giây, chúng tôi lại tải lại danh sách phát/tệp kê khai để tải danh sách phân đoạn mới và chúng tôi cập nhật bản trình bày nội bộ mới của tất cả sang phân đoạn mới. Bất cứ khi nào có yêu cầu tìm kiếm, chúng tôi chỉ tìm kiếm trong phạm vi có thể tìm kiếm. Đối với nội dung phát 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 ba thời lượng mục tiêu kể từ cuối. Ví dụ: nếu bạn có danh sách 10 phân đoạn và bạn đang ở phân đoạn 6, bạn chỉ có thể tìm kiếm đến 7 chứ không phải 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 khi được tham chiếu trong HlsSegmentFormat cho âm thanh và HlsVideoSegmentFormat cho video. Điều này bao gồm việc hỗ trợ cho âm thanh gói gọn như phát theo AAC và AC3, cả được mã hoá và không mã hoá. Bắt buộc để chỉ định thông tin này trong MediaInformation của LoadRequestData để mô tả chính xác nội dung của bạn cho người chơi. Nếu không được chỉ định, cấu hình trình phát mặc định sẽ cố gắng phát nội dung dưới dạng Truyền tải Phát trực tuyến nội dung đóng gói. Bạn có thể thiết lập thuộc tính này từ bất kỳ người gửi nào trong tải dữ liệu yêu cầu (Android, iOSWeb) hoặc trong trình nhận thông qua các trình chặn thông báo.

Hãy xem mã mẫu đoạn mã bên dưới hoặc 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 Web receiver.

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 đó URI trỏ đến khoá vectơ khởi tạo có thể được chỉ định:

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 hiện hỗ trợ là Widevine và URI chứa một Thông tin DRM được mã hoá BASE64 XXXXXXX mà khi được giải mã chứa id 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ụ: 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" Mã nhận dạng duy nhất (UUID) là UUID của Widevine từ DASH IF IOP. Chuỗi chính xác này được dùng trong MPD với luồng được 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 mật mã mã hoá được sử 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 cho biết nội dung được mã hoá bằng một trong các biện pháp bảo vệ AES-CTR, cụ thể là "cenc".

Các thuộc tính được liên kết tới DASH MPD:

Thuộc tính 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ó vai trò tương tự như default_kid trong MPEG DASH. Nếu sử dụng lược đồ khoá phân cấp, đây sẽ là "gốc" .

Ví dụ về danh sách phát HLS (Phát trực tuyến dựa trên HTTP) 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 chưa sử dụng hoặc của Google. Sự hiện diện hay vắng mặt của họ không ảnh hưởng đến hoạt động truyền trực tuyến.

  • Thuộc tính RESOLUTION= trong #EXT-X-STREAM-INF sẽ bị bỏ qua.
  • Thuộc tính AUTOSELECT= trong #EXT-X-MEDIA không được sử dụng. 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 bị bỏ qua.
  • Bỏ qua #EXT-X-DISCONTINUITY-SEQUENCE
  • #EXT-X-PLAYLIST-TYPE:EVENT có thể xuất hiện trong một sự kiện phát 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 Web receiver chỉ dựa vào sự tồn tại của #EXT-X-ENDLIST để xác định phiên đấu trực tiếp Video theo yêu cầu.

Truyền trực tuyến mượt mà

Chính thức của Microsoft Thông số kỹ thuật về việc truyền trực tuyến mượt mà.

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

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

Thẻ/Thuộc tính Cách sử dụng
&lt;SmoothStreamingMedia&gt; Thẻ chính cho tệp kê khai, chứa các thuộc tính của:
  • TimeScale: Số đơn vị thể hiện một giây, thường gia tăng 10.000.000.
  • Thời lượng: Thời lượng 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.
&lt;StreamIndex&gt; Một nhóm luồng, tương tự như AdaptiveSet của DASH. Loại chiến dịch này thường là "text", "video" hoặc "audio". Thuộc tính Url thường chứa một mẫu URL phân đoạn bằng thông tin như tốc độ bit hoặc thời gian bắt đầu.
&lt;QualityLevel&gt; Mỗi thẻ Qualitylevel chỉ định tốc độ bit và một bộ mã hoá và giải mã FourCC. FourCC thường là "H264", "AVC1", "AACL", v.v. Đối với video, mã này chỉ định độ phân giải thông qua MaxWidth và MaxHeight. Đối với âm thanh, thuộc tính này chỉ định tần số (chẳng hạn như 44100) thông qua sampleRate và số lượng kênh.
&lt;c&gt; Phát trực tuyến phần tử mảnh. Chứa:
  • d: thời lượng của một mảnh.
  • t: Thời gian nội dung đa phương tiện của mảnh.
&lt;Protection&gt; 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 <mooStreamingMedia> .
&lt;ProtectionHeader&gt; Trong phần <Protection>, có thể chứa thuộc tính SystemID và tùy chỉnh dữ liệu, thường được mã hoá Base64. Đối với Widevine, mã này sẽ chứa mã khoá, khoá độ dài, mã thuật toán, chẳng hạn như AESCTR, LA_URL (URL thu thập giấy phép), LUI_URL (URL giao diện người dùng của giấy phép) và DS_ID (mã dịch vụ của miền).

Bảo vệ nội dung

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

  • PHÁT TRIỂN: "EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED",
  • Rõ ràng: '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. Chiến lược phát hành đĩa đơn khi được giải mã, tuân theo cùng một định dạng đã giải mã như được mô tả trong 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ề tệp kê khai truyền trực tiếp mượt mà với thời lượng 3000 giây thời lượng của nội dung:

<?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})

Do đó, 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ẽ là sau đây, với thời gian ban đầu được trích xuất từ t="80649401378125" trong video StreamIndex và thời gian tăng 4 giây * 10000000 trên mỗi phân đoạn:

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

Sau đây là danh sách các thuộc tính Truyền trực tuyến mượt mà mà chúng tôi hiện bỏ qua và không ảnh hưởng đến trải nghiệm phát trực tuyến bất kể chúng 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 số lượng phân khúc và số lượng mức chất lượng dựa trên thông tin được cung cấp bên 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

canDisplayType kiểm tra phương thức đối với khả năng video và âm thanh của thiết bị Web nhận và bằng cách xác thực các tham số đa phương tiện được truyền vào, trả về một giá trị boolean. Tất cả nhưng thông số đầu tiên là không bắt buộc — bạn càng bao gồm nhiều thông số, việc kiểm tra sẽ chính xác hơn.

Chữ ký của thiết bị 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 Nhận web có hỗ trợ video/mp4 không mimetype với bộ mã hoá, kích thước và tốc độ khung hình cụ thể này:

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

Kiểm tra xem thiết bị và màn hình Nhận web có hỗ trợ định dạng video 4K cho bộ mã hoá và giải mã này 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ị Web và màn hình có hỗ trợ HDR10 cho bộ mã hoá và giải mã này hay không, kích thước và tốc độ khung hình:

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

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

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

DRM

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 đa phương tiện có giấy phép DRM (và URL khoá) được lưu trữ trong tệp kê khai (DASH hoặc HLS), thì Cast SDK sẽ xử lý trường hợp này cho bạn. Một phần nhỏ nội dung đó cần có licenseUrl cần thiết để lấy khoá giải mã. Trong Web receiver, bạn có thể sử dụng PlaybackConfig để đặt licenseUrl nếu cần.

Đoạn mã sau đây minh hoạ cách bạn có thể đặt thông tin yêu cầu giấy phép các yêu cầu 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, một số thông tin DRM như thông tin đăng nhập 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 thông qua các cơ chế như OAuth/SSO. Trong những trường hợp đó, nếu nội dung đa phương tiện được tải qua giọng nói hoặc đến từ đám mây, setCredentials được gọi từ đám mây đến Thiết bị truyền với điều kiện thông tin xác thực. Các ứng dụng viết ứng dụng Web receiver sau đó có thể sử dụng Thông tin về setCredentials để vận hành DRM khi cần. Sau đây là ví dụ về bằng thông tin đăng nhập để tạo nội dung đa phương tiện.

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

Xử lý kênh âm thanh

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

  • khi bắt đầu phát,
  • 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 phát.

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 kênh chính, đôi khi có thể xảy ra trường hợp kênh phụ đã lọc và không nghe thấy. Điều này có thể xảy ra khi bản nhạc là âm thanh vòm, còn bản âm thanh phụ sử dụng âm thanh nổi. Vì bản nhạc phụ thường được dùng để cung cấp nội dung 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ể có tác động đáng kể, chẳng hạn như nhiều người xem không thể nghe được bằng ngôn ngữ bản địa của họ.

Các tình huống sau minh hoạ lý do tại sao việc cung cấp chương trình lại quan trọng trong đó kênh chính và phụ đều có cùng số lượng kênh:

Trường hợp 1 – luồng nội dung đa phương tiện thiếu kênh mức độ tương đương giữa kênh chính và kênh phụ:

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

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 tiếng Anh, người dùng không nghe thấy bản nhạc họ muốn nghe, vì tất cả bản nhạc hai kênh được lọc ra trong khi phát. Bản nhạc duy nhất có có thể được phát sẽ là kênh AC-3 5.1 chính và sau đó 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 có kênh mức độ tương đương giữa kênh chính và kênh phụ:

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

Vì các bản nhạc của luồng này đều có cùng số lượng kênh, nên đối tượng người xem sẽ nghe thấy một 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 số lượng kênh ưa thích là 2, dưới dạng biện pháp giảm thiểu khi gặp phải nội dung nghe nhìn không có tính đồng nhất giữa các phương tiện bản âm thanh.

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

Bạn cũng có thể thiết lập số lượng kênh âm thanh ưu tiên của Shaka bằng cách đặt 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 liệu nó có thể hỗ trợ bộ mã hoá và giải mã âm thanh vòm (AC-3 hoặc EC-3) và tự động lọc ra bất kỳ bản nhạc đa phương tiện nào không phù hợp với số lượng kênh.