Web Receiver SDK 支援三種類型 的串流通訊協定:
DASH、 HTTP 直播 串流和 流暢串流:
本文列出各種串流通訊協定的支援。注意事項 各通訊協定所支援代碼的說明會有縮寫。 與詳細通訊協定規格相比目標是提供 快速介紹各項通訊協定的使用方式,以及哪些功能 通訊協定的通訊協定,才能在支援 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
(以 1 秒表示的單位) 通常包含在
<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 | 指定簡報中的第一個媒體區段數量 。這通常用於直播中。 |
我們也支援在 DASH4 片段內辨識「EMSG」EMSG方塊,以及用於 DASH 和
提供
EmsgEvent
敬上
開發人員。
雖然我們目前的網路接收端播放器支援 DASH 主要使用案例,這裡 是目前實作 DASH 的常見屬性清單 忽略或不使用。這意味著,無論資訊清單是否包含 也不會影響內容的播放體驗
- availabilityStartTime
- segmentAlignment
HTTP 即時串流 (HLS)
您可以取得 HTTP 即時串流的總覽及完整規格 請按這裡。
Web Receiver Player 的主要優勢之一就是能 在 MSE 中播放 HTTP 即時串流。與 DASH 不同之處在於,DASH 資訊清單位於單一位置 檔案,HLS 會傳送主要播放清單,內含所有變化版本串流的清單 並分別使用各自的網址變化版本播放清單為媒體播放清單。兩者 Web 接收器播放器目前在主版本中支援的主要 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 。設定
YES 的 DEFAULT 屬性會表示選擇
預設使用這個替代串流 |
以下是 Web 接收器播放器目前支援的 HLS 標記清單 媒體播放清單:
標記名稱 | 功能 |
---|---|
#EXTINF | 串流資訊,通常是在 並在下一行輸入片段網址。 |
#EXT-X-TARGETDURATION | 每個片段的時間長度 (以秒為單位)。這項設定也會決定 下載/重新整理直播的播放清單資訊清單。網路接收端 播放器不支援短於 0.1 秒的時間。 |
#EXT-X-MEDIA-SEQUENCE | 第一個片段的序號 (通常是直播) 這個播放清單代表 |
#EXT-X-KEY | DRM 金鑰資訊。METHOD 屬性能讓我們得知
要使用的 AI 系統我們現在支援 AES-128 和 SAMPLE-AES
,直接在 Google Cloud 控制台實際操作。 |
#EXT-X-BYTERANGE | 要為片段網址擷取的位元組範圍。 |
#EXT-X-DISCONTINUITY | 指定連續區段之間的不連續,這種情況經常出現 使用伺服器端廣告插播,但廣告區隔顯示在片中廣告的中間 。 |
#EXT-X-PROGRAM-DATE-TIME | 下一個區段第一個樣本的絕對時間,例如 "2016-09-21T23:23:52.066Z". |
#EXT-X-ENDLIST | 影片是隨選影片或直播。 |
直播時使用 #EXT-X-PROGRAM-DATE-TIME
和 #EXT-X-MEDIA-SEQUENCE
做為判斷如何合併新重新整理的資訊清單的關鍵因素。如果
目前都是使用 #EXT-X-PROGRAM-DATE-TIME
來比對重新整理的區隔。
否則會使用 #EXT-X-MEDIA-SEQUENCE
號碼。請注意,根據
HLS 規格,我們不會使用檔案名稱比較進行比對。
我們的 HTTP 即時串流導入方式支援選取替代音訊串流,例如
5.1 環場音效,做為主要播放音訊。方法是透過
使用包含替代轉碼器的 #EXT-X-MEDIA
標記,並同時提供
串流設定中的區隔格式。
網路接收端播放器會預期每個規格的特定行為。舉例來說
#EXT-INF
標記後,請使用 URI。如果不是 URI,
#EXT-X-DISCOUNTINUITY
會造成播放清單剖析失敗。
我們每 #EXT-X-TARGETDURATION
秒重新載入播放清單/資訊清單,以便取得
新的區隔清單,而我們也更新了
複製到新的區隔每次有人索取廣告時,我們只會在
可搜尋的範圍如果是即時影像,我們僅允許從開頭
直到最後三個目標時間長度為止。舉例來說
如果您有 10 份區隔清單,而目前位於區隔 6,那麼您只能
但 8 則不是 8
區隔格式支援
CAF SDK 支援播放多種格式 (如參照) 提供的內容
在HlsSegmentFormat
(音訊) 和 HlsVideoSegmentFormat
影片廣告。這包括對
令人飽滿的音訊
例如 AAC 與 AC3 播放,都能加密及未加密必填
我們要在 LoadRequestData
的 MediaInformation
中指定這項資訊
才能向播放器正確描述您的內容。如果沒有指定,
預設的播放器設定會嘗試以 Transport 方式播放內容
串流播放封裝內容。這個屬性可從
載入要求資料 (Android、
iOS
和網頁)
或在接收端透過訊息攔截器存取
查看程式碼範例 下方程式碼片段,或是使用 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 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 防護配置 (即「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
下方是我們目前未在 HTTP 即時串流中使用的功能和標記清單 聯絡。無論是否有狀態,都不會影響串流行為。
- 系統會忽略
#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
的情況下 確定即時與隨選影片。
流暢地串流播放
Microsoft 官方 流暢串流規格。
順暢串流提供自動調整式串流通訊協定和 XML 規格 與 DASH 相似。與 DASH 不同的是,Smooth Streaming 的建議 媒體區隔專用的 MPEG-4 包裝。
這個表格列出 Smooth Streaming 中最常見的標記和屬性 Web Receiver Player 如今可支援許多概念在 請參閱上方的 DASH 部分
標記/屬性 | 用量 |
---|---|
<SmoothStreamingMedia> | 資訊清單的主要標記,其中包含下列屬性:
|
<StreamIndex> | 一組串流,類似於 DASH 的 AdaptationSet。類型通常為 「text」、「video」或「audio」。Url 屬性通常包含範本 使用位元率或開始時間等資訊的片段網址。 |
<QualityLevel> | 每個 QualityLevel 標記都會指定其位元率和 FourCC 轉碼器。《FourCC》 通常是「H264」、「AVC1」、「AACL」等等。如果是影片,則會指定 採用 MaxWidth 和 MaxHeight 的解析度。如果是音訊,則會指定 頻率 (例如 44100) 透過取樣率和管道數量。 |
<c> | 串流片段元素。包含:
|
<Protection> | 含自選 SystemID 屬性的標記,用來列出系統 ID 在 <SmoothStreamingMedia> 之下使用的 DRM標記之前。 |
<ProtectionHeader> | 在 <Protection> 下,可包含 SystemID 和 custom 的屬性 通常是 Base64 編碼如果是 Widevine,則會包含金鑰 ID 長度、演算法 ID,例如 AESCTR、LA_URL (授權取得網址) LUI_URL (授權使用者介面網址) 和 DS_ID (網域服務 ID)。 |
內容保護
為了正確編碼防護系統 ID,請使用下方對應:
- 背景:「EDEF8BA9-79D6-4ACE-A3C8-27DCD51D21ED」
- CLEARKEY: '1077EFEC-C0B2-4D02-ACE3-3C1E52E2FB4B'、
- MPEG_DASH_MP4PROTECTION: 'URN:MPEG:DASH:MP4PROTECTION:2011'
以下是使用 Base64 編碼資料的範例 <ProtectionHeader>
。
資料解碼後會遵循
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) ...
以下是我們目前忽略和使用的 Smooth Streaming 屬性 均不影響串流體驗,無論是否提供影片都一樣:
<SmoothStreamingMedia>
標記中的 CanSeek、CanPause。<StreamIndex>
標記中的 Chunks、QualityLevels,而是以 根據資訊計算的分段數和品質等級數量 「<StreamIndex>
」中的標記,例如實際的QualityLevel
標記和<c>
標記。- BitsPerSample 和
<QualityLevel>
中的 PacketSize 也不會使用。
檢查顯示類型
canDisplayType
方法會檢查 Web 接收器裝置的視訊和音訊功能,以及
驗證傳入的媒體參數並傳回布林值,以顯示廣告素材。所有語言
但第一個是選用參數 — 加入的參數越多,
檢查結果也會更加精確
其簽名為 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)
檢查網路接收端裝置及螢幕是否支援 4K 影片格式 指定寬度為 3840 和高度 2160,藉此使用這個轉碼器:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
檢查網路接收器裝置和螢幕是否支援這個轉碼器 維度和影格速率
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 或 HTTP 即時串流) 儲存 DRM 授權和金鑰網址
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 助理整合時,某些數位著作權管理資訊,例如
內容所需的憑證可能會直接連結至您的
透過 OAuth/SSO 等機制存取 Google 帳戶。在這種情況下
媒體內容從語音載入
或來自雲端
系統會從雲端叫用 setCredentials
至 Cast 裝置,
憑證編寫 Web Receiver 應用程式的應用程式即可使用
setCredentials
資訊,以便視需要執行 DRM。這裡舉例說明
運用憑證建構媒體
提示:另請參閱「使用 contentId、contentUrl 和實體載入媒體」。
聲道處理
Cast 播放器載入媒體時,會設定單一音訊來源緩衝區。在 同時也會選取適當的轉碼器,供緩衝區使用。 以主要音軌的 MIME 類型為基礎已設定新的緩衝區和轉碼器:
- 開始播放時
- 在每個廣告插播時間點
- 每次主要內容繼續播放時
因為緩衝區使用單一轉碼器,且由於選擇了轉碼器 有些是由主要測試群組套用,但次要測試群組 系統也不會聽到其他聲音當媒體節目的主要目的 音軌有環場音效,但次要音軌則使用立體聲音效。 因為次要音軌經常用於提供替代內容 提供不同曲目數量的媒體內容 重大影響,例如許多觀眾聽不到聲音 提供當地語言版本
以下情境說明提供程式設計的重要性 其中主要和次要測試群組的頻道數量相同:
情境 1 - 缺少管道的媒體串流 主要和次要測試群組的一致性:
- 英文 - AC-3 5.1 頻道 (主要)
- 瑞典文 - AAC 2 頻道
- french - AAC 2 頻道
- 德國 - 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) 預設為兩個偏好的頻道數量,做為兩個 就算遇到中級媒體缺乏對等性的媒體,也要採取因應措施 音軌。
如果主要音軌不是環場音效 (例如雙聲道立體聲) 音軌),Shaka 播放器會預設為兩個頻道 自動篩除含有兩個以上媒體的次要媒體音軌 頻道。
你也可以透過設定
位於 shakaConfig
屬性中的 preferredAudioChannelCount
cast.framework.PlaybackConfig.
例如:
shakaConfig = { "preferredAudioChannelCount": 6 };
當 preferredAudioChannelCount
設為 6 時,Shaka Player 會檢查是否
都支援環場音效轉碼器 (AC-3
或 EC-3
);以及
自動篩除不符合偏好報表的任何媒體音軌
以及頻道數量