網路接收器播放器串流通訊協定

Web Receiver SDK 目前支援三種串流通訊協定:

DASHHTTP 即時串流 流暢串流

本文件列出我們對各項串流通訊協定的支援。請注意,相較於詳細的通訊協定規格,各通訊協定支援的標記只是簡略。我們的目標是快速一覽並瞭解各種通訊協定的使用方式,以及支援 Cast 的裝置支援哪些通訊協定功能,藉此提供串流體驗。

透過 HTTP 進行動態自動調整串流 (DASH)

ISO 的 DASH 詳細規格

DASH 是可自動調整的位元率串流通訊協定,可讓您透過 HTTP(S) 伺服器串流播放高畫質影片。以 XML 組成的資訊清單,包含大部分的中繼資料資訊,說明如何初始化及下載影片內容。Web Receiver Player 支援的重要概念包括 <Period><AdaptationSet><Representation><SegmentTemplate><SegmentList><BaseUrl><ContentProtection>

DASH 資訊清單以根 <MPD> 標記開頭,內含一或多個代表一個串流內容的 <Period> 標記。<Period> 標記可排序不同的串流內容,通常用於分隔主要內容與廣告,或多個連續影片內容。

<MPD> 底下的 <AdaptationSet> 是一組類型媒體串流 (在大多數情況下為影片、音訊或字幕) 的表示法。最常見的支援的 MIME 類型為「video/mp4」、「audio/mp4」和「text/vtt」。選用的 <ContentComponent contentType="$TYPE$"> 可以納入 <AdaptationSet> 下方。

每個 <AdaptationSet> 內都應包含 <Representation> 標記的清單,網路接收端播放器會使用 codecs 資訊初始化 MSE 來源緩衝區,bandwidth 資訊則會自動選擇合適的表示法/位元率。

針對每個 <Representation>,使用 <BaseURL> 代表單一區隔表示法、<SegmentList> 用於區隔清單 (類似 HLS) 或 <SegmentTemplate>

針對 <SegmentTemplate>,它會指出初始化區隔和媒體區隔透過範本呈現的方式。在以下範例中,$Number$ 表示 CDN 提供的區隔編號。因此,在播放過程中,這項功能會轉譯為 seg1.m4s、seg2.m4s 等等。

<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>

如果是 <SegmentTemplate>,通常會使用 <SegmentTimeline> 標記來表示每個片段的時間長度,以及哪些片段重複。timescale (代表一秒的單位) 通常會包含在 <SegmentTemplate> 的屬性中,以便根據這個單位計算片段時間。在下方範例中,<S> 標記代表區段標記,d 屬性會指定區段的時間長度,而 r 屬性會指定相同時間長度的重複區段,以便 $Time$ 正確計算,以便下載 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>

如需使用 <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>

如果是單一片段檔案,<SegmentBase> 通常會與位元組範圍要求搭配使用,以指定 <BaseURL> 檔案的哪個部分包含索引,並在播放持續或跳轉時依需求擷取其餘內容。這裡的 Initialization 範圍會指定 init 中繼資料範圍,而 indexRange 會指定媒體區隔的索引。請注意,目前我們僅支援連續的位元組範圍。

<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>

無論使用何種表示法,如果串流受到保護,<ContentProtection> 區段即可顯示在 <AdaptationSet> 底下,其中 schemeIdUri 可明確識別要使用的 DRM 系統。您可以設定選用的金鑰 ID 來進行一般加密。

<!-- 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>

如需更多範例與詳細資料,請參閱 MPEG-DASH 規格。 以下是我們目前支援的標記中未提及的其他 DASH 屬性清單:

屬性名稱 屬性函式
mediaPresentationDuration 影片內容的時間長度。
minimumUpdatePeriod <MPD> 標記的屬性;指定需要重新載入資訊清單的頻率。
類型 <MPD> 標記的屬性;「動態」表示這是直播。
presentationTimeOffset <SegmentBase> 標記的屬性;指定從時段開頭的顯示時間偏移。
startNumber 指定簡報中第一個媒體片段的數目。經常用於直播。

我們也支援在 DASH 的 MP4 片段中識別 EMSG 方塊,並為開發人員提供 EmsgEvent

雖然我們目前的 Web Receiver Player 支援主要的 DASH 用途,但以下所列常見屬性是我們目前在實作 DASH 時忽略或不使用的常見屬性。也就是說,無論資訊清單是否包含這類元素,都不會影響內容的播放體驗。

  • availabilityStartTime
  • segmentAlignment

HTTP 即時串流 (HLS)

您可以前往這裡取得 HTTP 即時串流的總覽和完整規格。

網路接收器播放器的主要優勢之一,就是能夠支援在 MSE 播放 HLS。不同於 DASH,資訊清單位於單一檔案時,HLS 會傳送內含所有變化版本串流清單的主要播放清單,以及各自的網址。變化版本播放清單就是媒體播放清單。Web Receiver Player 目前在主要播放清單中支援的兩個主要 HLS 標記如下:

代碼名稱 功能
#EXT-X-STREAM-INF 指定位元率/變化版本串流。BANDWIDTH 屬性為必要屬性,支援可自動調整位元率串流選項。強烈建議您使用 CODECS 屬性初始化 MSE,例如 "avc1.42c01e,mp4a.40.2"。如未指定,系統會將預設情況設為 H264 主要設定檔 3.0 視訊和 "mp4a.40.2" 音訊編碼內容。
#EXT-X-MEDIA 指定代表內容的媒體播放清單 (在 URI 屬性中)。通常是其他格式 (5.1 環場音效) 或語言的替代音訊串流。允許使用包含 VIDEOAUDIOSUBTITLESCLOSED-CAPTIONSTYPE 屬性。將 DEFAULT 屬性設為 YES 表示預設選擇這個額外串流。

以下是 Web Receiver Player 目前在媒體播放清單中支援的 HLS 標記清單:

代碼名稱 功能
#EXTINF 串流資訊,通常接著是區段的持續時間 (秒),以及下一行網址的網址。
#EXT-X-TARGETDURATION 每個片段的時間長度 (以秒為單位),這也會決定直播活動下載/重新整理播放清單資訊清單的頻率。網路接收器播放器不支援長度短於 0.1 秒。
#EXT-X-MEDIA-SEQUENCE 這個播放清單中第一個區段代表的序號 (通常是直播活動的序號)。
#EXT-X-KEY DRM 金鑰資訊。METHOD 屬性會告訴我們要使用哪一個金鑰系統。目前我們支援 AES-128SAMPLE-AES
#EXT-X-BYTERANGE 要擷取片段網址的位元組範圍。
#EXT-X-DISCONTINUITY 指定連續區段之間的不連續。這種情況通常出現在伺服器端廣告插播中,而廣告區隔出現在主串流中間。
#EXT-X-PROGRAM-DATE-TIME 下一個區段第一個樣本的絕對時間,例如「2016-09-21T23:23:52.066Z」。
#EXT-X-ENDLIST 說明是 VOD 或直播。

對於直播,我們會使用 #EXT-X-PROGRAM-DATE-TIME#EXT-X-MEDIA-SEQUENCE 做為關鍵因素,判斷如何合併新重新整理的資訊清單。如果顯示的話,#EXT-X-PROGRAM-DATE-TIME 會用來比對經過重新整理的區隔。否則會使用 #EXT-X-MEDIA-SEQUENCE 號碼。請注意,根據 HTTP 即時串流規格,我們不會使用檔案名稱比較進行比對。

我們的 HLS 實作支援選取替代音訊串流 (例如 5.1 環場音效),做為主要音訊播放。方法是使用具有替代轉碼器的 #EXT-X-MEDIA 標記,並在串流設定中提供區隔格式

網路接收器播放器會預期特定規格行為。舉例來說,在 #EXT-INF 標記之後,我們預期有 URI。如果不是 URI,例如 #EXT-X-DISCOUNTINUITY 會導致播放清單剖析失敗。

#EXT-X-TARGETDURATION 秒,我們會重新載入播放清單/資訊清單以取得新的區隔清單,並將所有區隔的新內部表示法更新為新區隔。每次提出搜尋要求時,我們只會在搜尋的範圍內搜尋。針對直播,我們僅允許從最新清單的「起始時間」開始搜尋,直到從結束開始到三個目標持續時間為止。舉例來說,如果您有 10 份區隔清單,且位於區隔 6,則最多只能搜尋 7 份,而非 8 份。

區隔格式支援

CAF SDK 支援播放多種格式提供的內容,如 HlsSegmentFormat 中音訊及影片 HlsVideoSegmentFormat 所參照。這包括支援封裝音訊 (例如 AAC 和 AC3 播放),加密和未加密。您必須在 LoadRequestDataMediaInformation 中指定這項資訊,才能向玩家正確描述內容。如未指定,預設的播放器設定會嘗試以傳輸串流封裝內容的形式播放內容。這個屬性可透過載入要求資料 (AndroidiOS網路) 中的任一寄件者設定,或透過訊息攔截器在接收端中設定。

如要進一步瞭解如何在 Web Receiver 準備內容,請參閱下方的程式碼片段或使用 contentId、contentUrl 和實體載入媒體指南。

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

內容保護

如上方 #EXT-X-KEY 標記部分所述,Cast SDK 支援 SAMPLE-AESSAMPLE-AES-CTR,其中指定金鑰的 URI 代表初始化向量:

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

現在我們支援的 KEYFORMAT 為 Widevine,且 URI 包含 BASE64 編碼的 DRM 資訊 XXXXXXX,在解碼時包含金鑰 ID:

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

第 1 版定義了下列屬性:

屬性 範例 說明
KEYFORMATVERSIONS "1" 本提案定義金鑰格式第 1 版
KEYFORMAT "urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" UUID 是 DASH IF IOP 中的 Widevine UUID。搭配 Widevine 加密串流使用 MPD 時,系統使用完全相同的字串。
URI "data:text/plain;base64, <base64 encoded PSSH box>" 含有資料類型和 PSSH 方塊的串流 URI。
METHOD SAMPLE-AES-CTR 指出加密內容時使用的加密加密方式。SAMPLE-AES 表示內容使用「cbcs」加密。SAMPLE-AES-CTR 表示內容是使用其中一種 AES-CTR 防護配置 (也就是「普查」) 進行加密。

對應至 DASH MPD 的屬性:

屬性 說明
KEYFORMAT ContentProtection 元素的 schemeIdUri 屬性。
URI cenc:pssh 元素的內容。
KEYID 將金鑰 ID 編碼為 16 位元組的十六進位字串,這個金鑰 ID 的角色與 MPEG DASH 中的 default_kid 相同。如果使用階層式金鑰配置,這會是「根」鍵。

含有 V2 信號的 HLS 播放清單範例:

#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

以下列出我們目前尚未使用或支援的 HLS 功能和標記。無論是否處於在家狀態,都不會對串流行為造成影響。

  • 系統會忽略 #EXT-X-STREAM-INF 中的 RESOLUTION= 屬性。
  • 未使用 #EXT-X-MEDIA 中的 AUTOSELECT= 屬性。而是仰賴 DEFAULT=
  • 系統會忽略主要播放清單中的 #EXT-X-I-FRAME-STREAM-INF
  • 已忽略「#EXT-X-DISCONTINUITY-SEQUENCE
  • #EXT-X-PLAYLIST-TYPE:EVENT 可以出現在直播中,#EXT-X-PLAYLIST-TYPE:VOD 也能出現在 VOD 串流中,但目前我們的網路接收器播放器只會使用 #EXT-X-ENDLIST 來判斷直播 VOD。

流暢串流播放

Microsoft 的官方流暢串流規格

流暢串流透過 HTTP (類似 DASH) 提供自動調整串流通訊協定和 XML 規格。與 DASH 不同,流暢串流建議只為媒體區隔採用 MPEG-4 封裝。

以下表格列出 Web Receiver Player 目前支援的 Smooth Streaming 標記和屬性。上方的 DASH 部分已說明許多概念。

標記/屬性 使用方法
<SmoothStreamingMedia> 資訊清單的主要標記,包含以下屬性:
  • TimeScale:代表一秒的單位數,通常以 10,000,000 為單位遞增。
  • 持續時間:內容長度 (以時間比例表示)。網路接收器播放器不支援長度短於 0.1 秒。
  • IsLive:資訊清單是否為直播媒體。
<StreamIndex> 一組串流,與 DASH 的 AdaptationSet 類似。類型通常是「text」、「影片」或「音訊」。Url 屬性通常包含使用位元率或開始時間等資訊的範本片段網址。
<QualityLevel> 每個 QualityLevel 標記都會指定其位元率和 FourCC 轉碼器。F4CC 代碼通常為「H264」、「AVC1」、「AACL」等。如果是影片,則會透過 MaxWidth 和 MaxHeight 指定解析度。如果是音訊,則會透過 SamplingRate 和通道數指定頻率 (例如 44100)。
<c> 串流片段元素。包含:
  • d:片段的時間長度。
  • t:片段的媒體時間。
<安全防護> 具有選用的 SystemID 屬性的標記,該屬性會列出系統 DRM 的 ID,以便在 <SmoothStreamingMedia> 標記下使用。
<ProtectionHeader> 在 <Protection> 底下,可包含 SystemID 和自訂資料的屬性,通常採用 Base64 編碼。如果是 Widevine,則會含有金鑰 ID、金鑰長度、演算法 ID,例如 AESCTR、LA_URL (授權取得網址)、LUI_URL (授權使用者介面網址) 和 DS_ID (網域服務 ID)。

內容保護

為確保保護措施系統 ID 正確編碼,請使用下列對應項目:

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

對於 <ProtectionHeader>,以下是包含 Base64 編碼資料的示例。解碼時,資料必須符合上述 DASH 內容保護支援中所述的解碼格式。

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

以下是內容長度為 3000 秒的即時流暢串流資訊清單範例:

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

在上述影片串流的範例中,網址範本為:

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

因此,前兩個片段 (假設我們位於索引 2 品質等級) 如下,從 t="80649401378125" 擷取到 Video StreamIndex 下方的初始時間,以及每個片段 4 秒 * 10000000 的時間增量:

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

以下是我們目前忽略的「流暢串流」屬性清單,無論提供是否提供串流體驗,這些屬性都不會受到任何影響:

  • <SmoothStreamingMedia> 標記中的 CanSeekCanPause
  • <StreamIndex> 標記中的 ChunksQualityLevels。相反地,我們會根據 <StreamIndex> 內提供的資訊 (例如實際的 QualityLevel 標記和 <c> 標記) 計算區隔數量和品質等級。
  • 未使用 <QualityLevel> 中的 BitsPerSamplePacketSize

檢查顯示類型

canDisplayType 方法會驗證傳入的媒體參數並傳回布林值,藉此檢查網路接收端裝置的影片和音訊功能。除了第一個參數外,第一個是選用參數,加入的參數越多,檢查結果就越精確。

其簽名為 canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)

例如:

以下列特定的轉碼器、尺寸和畫面速率,檢查網路接收器裝置和顯示是否支援影片/mp4 MIME 類型:

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

將 3840 寬度和高度設為 2160,檢查網路接收器裝置和顯示是否支援 4K 影片格式:

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

檢查網路接收器裝置和螢幕是否支援 HDR10,這個轉碼器、尺寸和畫面更新率:

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

檢查網路接收端裝置和螢幕是否支援 Dolby Vision (DV) 以針對這個轉碼器、尺寸和畫面更新率:

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

數位版權管理

部分媒體內容需要數位版權管理 (DRM) 機制。如果媒體內容的 DRM 授權 (和金鑰網址) 儲存在資訊清單 (DASH 或 HLS) 中,Cast SDK 會為您處理這種情況。該內容的子集需要 licenseUrl,以取得解密金鑰。在網路接收器中,您可以使用 PlaybackConfig 視需要設定 licenseUrl

下列程式碼片段說明如何設定授權要求 (例如 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;
});

如果您整合了 Google 助理,則部分 DRM 資訊 (例如內容所需的憑證) 可能會透過 OAuth/SSO 等機制直接連結至您的 Google 帳戶。在這種情況下,如果媒體內容是透過語音或雲端載入,系統會從雲端叫用 setCredentials,並投放到提供該憑證的投放裝置。編寫 Web Receiver 應用程式的應用程式之後,即可視需要使用 setCredentials 資訊執行 DRM。以下舉例說明如何使用憑證建構媒體。

提示:另請參閱使用 contentId、contentUrl 和實體載入媒體一文。

音訊頻道處理

當投放播放器載入媒體時,會設定單一音訊來源緩衝區。同時,也會根據主要音軌的 MIME 類型,選取緩衝區要使用的適當轉碼器。已設定新的緩衝區和轉碼器:

  • 開始播放時
  • 以及顯示內容
  • 每次主要內容恢復播放時

由於緩衝區使用單一轉碼器,並依據主要音軌選擇轉碼器,因此在某些情況下,次要軌跡可能會遭到篩除且無法辨識。如果媒體程式的主要音軌採用環場音效,但次要音軌使用立體聲音效,就可能發生這種情況。由於次要音軌經常使用以其他語言提供內容,提供包含不同數量的媒體可能會帶來重大影響,例如大量觀眾無法以自己母語聆聽內容。

以下情境說明提供程式設計的重要性,且其中主要和次要測試群組含有相同數量的管道:

情境 1 - 主要和次要音軌的媒體串流缺少管道一致性:

  • 英文 - AC-3 5.1 頻道 (主要)
  • swedish - AAC 2 頻道
  • french - AAC 2 頻道
  • german - AAC 2 頻道

在這種情況下,如果玩家的語言設為英文以外的語言,使用者就無法聽到您希望聽到的曲目,因為播放期間系統會篩除所有兩個頻道音軌。唯一可以播放的曲目是主要 AC-3 5.1 頻道,而且只有在語言設為英文時才能播放。

情境 2 - 在主要和次要測試群組中,管道完全相同的媒體串流:

  • 英文 - AC-3 5.1 頻道 (主要)
  • swedish - AC-3 5.1 頻道
  • french - AC-3 5.1 頻道
  • german - AC-3 5.1 頻道

由於這個串流的音軌數量都相同,因此無論所選語言為何,觀眾都會聽到曲目。

Shaka 音訊聲道處理

Shaka 播放器 (DASH) 的偏好聲道數預設為兩個,因為當遇到的媒體無法跨次要音軌同步時,這是緩解措施。

如果主要音軌並非環場音效 (例如雙頻道立體聲音軌),Shaka 播放器會預設為兩個頻道,並自動篩除擁有超過兩個頻道的次要媒體音軌。

也能透過在 cast.framework.PlaybackConfig 上的 shakaConfig 屬性設定 preferredAudioChannelCount,設定 Shaka 偏好的音訊頻道數量。

例如:

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount 設為 6 時,Shaka Player 會檢查其是否支援環場音效轉碼器 (AC-3EC-3),並自動篩除不符合偏好聲道數的任何媒體音軌。