Web Receiver SDK 目前支援三種串流通訊協定:
本文列出對各種串流通訊協定的支援。請注意,與詳細的通訊協定規格相比, 每個通訊協定支援的標記都有非常精簡的說明。我們的目標是提供一個簡單的總覽,讓您瞭解各項通訊協定的使用方式,以及支援 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 包含 VIDEO 、AUDIO 、SUBTITLES 或 CLOSED-CAPTIONS 的屬性。根據預設,將 DEFAULT 屬性設為 YES 表示選擇此替代串流。 |
網路接收器播放器目前支援媒體播放清單中的 HLS 標記清單如下:
代碼名稱 | 功能 |
---|---|
#EXTINF | 串流資訊,通常接在區隔的持續時間 (以秒為單位),並在下一行顯示區隔的網址。 |
#EXT-X-TARGETDURATION | 每個片段的秒數。這也決定了我們下載/重新整理直播影片播放清單資訊清單的頻率。Web Receiver Playerer 不支援短於 0.1 秒的持續時間。 |
#EXT-X-MEDIA-SEQUENCE | 此播放清單中第一個片段所代表的序號 (通常為即時串流)。 |
#EXT-X-KEY | DRM 金鑰資訊。METHOD 屬性會告知要使用的系統系統。目前我們支援 AES-128 和 SAMPLE-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 播放) 的支援功能 (無論經過加密或未加密)。您必須在 LoadRequestData
的 MediaInformation
中指定這項資訊,才能正確向玩家描述您的內容。如未指定,預設播放器設定會嘗試以 Transport Stream 封裝內容來播放內容。這個屬性可透過載入要求資料 (Android、iOS 和 Web) 中的任何傳送者,或在接收端透過訊息攔截器設定。
如要進一步瞭解如何在 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-AES
或 SAMPLE-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> | 資訊清單的主要標記包含以下屬性:
|
<串流索引> | 一組串流,類似於 DASH 的 AdaptationSet。類型通常為「text」、「video」或「audio」。「網址」屬性通常包含使用片段或開始時間等資訊的資訊。 |
<品質等級> | 每個 QualityLevel 標記都會指定其位元率和 FourCC 轉碼器。FourCC 代碼通常為「H264」、「AVC1」、「AACL」等。如果是影片,則會透過 MaxWidth 和 MaxHeight 指定解析度。如果是音訊,則會透過 SamplingRate 指定其頻率和聲道數 (例如 44100)。 |
<c> | 串流片段元素。包含:
|
<防護> | 一個標記,具有選用的 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>
標記中的 CanSeek、CanPause。<StreamIndex>
標記中的 Chunks、QualityLevels。而是根據<StreamIndex>
所提供的資訊 (例如實際的QualityLevel
標記和<c>
標記) 來計算片段數和品質等級。- 不使用
<QualityLevel>
中的 BitsPerSample、PacketSize。
檢查顯示類型
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.playConfig 的 shakaConfig
屬性中設定 preferredAudioChannelCount
,藉此設定 Shaka 偏好的音訊頻道數量。
例如:
shakaConfig = { "preferredAudioChannelCount": 6 };
將 preferredAudioChannelCount
設為 6 時,Shaka Player 會檢查是否支援環場音效轉碼器 (AC-3
或 EC-3
),並自動篩除不符合偏好頻道數量的媒體曲目。