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

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> 標記清單,而 Web Receiver 播放器會使用 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 屬性會指定相同時間長度的重複片段數量,以便正確計算 <S> 以按照 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 屬性清單:

屬性名稱 屬性函式
媒體簡報時間長度 影片內容的長度。
最小值更新週期 <MPD> 標記的屬性;指定我們需要重新載入資訊清單的頻率。
type <MPD> 標記的屬性;「 dynamic」(動態) 表示這是即時串流。
演示時間關閉 <SegmentBase> 標記的屬性;指定期間的偏移值。
開始編號 指定特定時段中簡報的第一個媒體片段數量。通常用於直播中。

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

雖然目前的 Web Receiver 播放器支援主要的 DASH 用途,但以下列舉目前 DASH 忽略或未使用的常見屬性清單。因此無論資訊清單是否包含這些資訊,都不會影響內容的播放體驗。

  • 供應情形開始時間
  • 區隔對齊

HTTP 即時串流 (HLS)

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

網路接收器播放器的主要優點之一,就是能支援在 MSE 中播放 HLS。與 DASH 不同,資訊清單的資訊清單位於單一檔案中,HLS 會傳送含有所有變體串流清單的主要播放清單,以及各自的網址。變化版本播放清單是媒體播放清單。網路接收器播放器目前在主要播放清單中支援的兩個主要 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 環場音效) 或語言的替代音訊串流。系統允許 TYPE 包含 VIDEOAUDIOSUBTITLESCLOSED-CAPTIONS 的屬性。根據預設,將 DEFAULT 屬性設為 YES 表示選擇此替代串流。

網路接收器播放器目前支援媒體播放清單中的 HLS 標記清單如下:

代碼名稱 功能
#EXTINF 串流資訊,通常接在區隔的持續時間 (以秒為單位),並在下一行顯示區隔的網址。
#EXT-X-TARGETDURATION 每個片段的秒數。這也決定了我們下載/重新整理直播影片播放清單資訊清單的頻率。Web Receiver Playerer 不支援短於 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 號碼。請注意,依據 HLS 規格,我們不會使用檔案名稱比較來比對。

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

Web Receiver 播放器會預期每個規格的特定行為。例如,在 #EXT-INF 標記之後,我們會預期 URI。如果不是 URI,例如 #EXT-X-DISCOUNTINUITY 會導致播放清單剖析失敗。

我們每 #EXT-X-TARGETDURATION 秒就會重新載入播放清單/資訊清單以取得新的區隔清單,並將所有片段的新內部表示法更新為新的區隔。每當有人要求搜尋時,我們只尋找可搜尋的範圍。在直播中,我們只允許從最新的清單開頭搜尋到結束的三個目標持續時間。舉例來說,假設您有 10 個區隔清單,而且您在區隔 6 裡,那麼您只能找到最多 7 個,但不能尋找 8 個。

區隔格式支援

CAF SDK 支援播放多種格式的內容,如 HlsSegmentFormat 音訊和 HlsVideoSegmentFormat 影片中所述。這包括對經過封裝的音訊 (例如 AAC 和 AC3 播放) 的支援功能 (無論經過加密或未加密)。您必須在 LoadRequestDataMediaInformation 中指定這項資訊,才能正確向玩家描述您的內容。如未指定,預設播放器設定會嘗試以 Transport Stream 封裝內容來播放內容。這個屬性可透過載入要求資料 (AndroidiOSWeb) 中的任何傳送者,或在接收端透過訊息攔截器設定。

如要進一步瞭解如何在 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 如 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 保護架構,也就是「cenc」。

對應至 DASH MPD 的屬性:

屬性 說明
KEYFORMAT ContentProtection 元素的 schemeIdUri 屬性。
URI cenc:pssh 元素的內容。
KEYID 由金鑰 ID 組成的 16 位元組十六進位字串,其角色與 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 提供自動調整串流通訊協定和 XML 規格 (類似 DASH)。與 DASH 不同的是,Smooth Streaming 只建議媒體區隔使用 MPEG-4 封裝。

下列是網路接收器玩家目前支援的流暢串流標記和屬性表格。上方的 DASH 章節已說明許多概念。

標記/屬性 使用方式
<SmoothStreamingMedia> 資訊清單的主要標記包含以下屬性:
  • TimeScale:代表 1 秒的單位數,通常以 10,000,000 為單位遞增。
  • 時間長度:時間長度的內容長度。Web 接收器播放器不支援少於 0.1 秒的持續時間。
  • IsLive:資訊清單是否為即時媒體。
<串流索引> 一組串流,類似於 DASH 的 AdaptationSet。類型通常為「text」、「video」或「audio」。「網址」屬性通常包含使用片段或開始時間等資訊的資訊。
<品質等級> 每個 QualityLevel 標記都會指定其位元率和 FourCC 轉碼器。FourCC 代碼通常為「H264」、「AVC1」、「AACL」等。如果是影片,則會透過 MaxWidth 和 MaxHeight 指定解析度。如果是音訊,則會透過 SamplingRate 指定其頻率和聲道數 (例如 44100)。
<c> 串流片段元素。包含:
  • d:片段的持續時間。
  • t:片段的媒體時間。
<防護> 一個標記,具有選用的 SystemID 屬性,可在 <SmoothStreamingMedia> 標記下,列出要使用系統 DRM 的 ID。
<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>

以下是含有 3,000 秒內容持續時間的即時流暢串流資訊清單範例:

<?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" 和 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>)

例如:

檢查 Web Receiver 裝置與螢幕是否支援具有此特定轉碼器、尺寸和影格速率的影片/mp4 MIME 類型:

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

透過指定 3840 的寬度和 2160 的高度,檢查 Web Receiver 裝置與螢幕是否支援這個轉碼器的 4K 影片格式:

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

檢查 Web Receiver 裝置與螢幕是否支援這個轉碼器、尺寸和影格速率的 HDR10:

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

檢查 Web Receiver 裝置與螢幕是否支援這個轉碼器、尺寸和影格速率的 Dolby Vision (DV):

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

數位版權管理

注意:使用 Web Receiver SDK 的主要好處之一,就是應用程式不再需要載入 MPL 並分別處理媒體播放作業,因為 Web Receiver SDK 可以為您處理這項動作。

部分媒體內容需要數位版權管理 (DRM)。如果媒體內容的 DRM 授權 (和金鑰網址) 儲存在資訊清單 (DASH 或 HLS) 中,則 Cast SDK 會為您處理這個問題。其內容有一部分需要 licenseUrl 才能取得解密金鑰。在 Web Receiver 中,您可以使用 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 至提供該憑證的 Cast 裝置。然後,編寫 Web Receiver 應用程式的應用程式即可視需要使用 setCredentials 資訊來處理數位版權管理。以下舉例說明如何使用憑證建構媒體。

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

音訊頻道處理

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

  • 開始播放時
  • 廣告插播時間點
  • 在每次主要內容恢復播放時。

由於緩衝區使用的是單一轉碼器,而且根據主要音軌選擇轉碼器,因此可能會將篩選到的次要軌跡遭到篩除而不聽到。如果媒體程式的主要音軌採用環場音效,但次要音軌使用立體聲音效,就可能會發生這種情況。由於次要音軌通常用於提供替代語言的內容,因此提供含有不同曲目的媒體可能會帶來重大影響,例如大量觀眾無法以母語聆聽內容。

以下情境說明在為何主要和次要音軌包含相同數量的頻道時,提供程式設計的重要性:

情境 1 - 媒體串流在主要音軌和次要播放軌中皆缺乏管道一致性:

  • 中文 - AC-3 5.1 通道(主)
  • swedish - AAC 2-channel
  • 法國 - AAC 2 聲道
  • german - AAC 2 頻道

在這種情境中,如果玩家的語言設定為英文以外的任何語言,使用者就不會聽到預期的音軌,因為所有雙聲道音軌在播放時都會被篩除。唯一可以播放的曲目是主要的 AC-3 5.1 頻道,而且只有在語言設定為英文時才會播放。

情境 2 - 主要串流和次要軌道上的管道一致性。

  • 中文 - AC-3 5.1 通道(主)
  • 瑞典文 - AC-3 5.1 通道
  • 法國 - AC-3 5.1 通道
  • 德曼 - AC-3 5.1 通道

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

Shaka 音訊頻道處理

Shaka 播放器 (DASH) 會預設偏好的頻道計數為 2,做為處理次要音軌時均不匹配的媒體時,可以做為因應措施。

如果主要音軌不是環場音效 (例如雙聲道立體聲音軌),Shaka 播放器就會預設為兩個頻道,並自動篩除具有兩個以上任何頻道的次要媒體播放軌。

您也可以在 cast.framework.playConfigshakaConfig 屬性中設定 preferredAudioChannelCount,藉此設定 Shaka 偏好的音訊頻道數量。

例如:

shakaConfig = { "preferredAudioChannelCount": 6 };

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