Web Receiver SDK 支持三种类型 实现以下目标:
DASH、 HTTP Live 流式传输,以及 流畅直播。
在本文档中,我们列出了对每种流式传输协议的支持。注意事项 对于每种协议支持的标记 而不是详细协议规范目的是提供一个 快速了解并了解如何使用各个协议,以及 支持 Cast 的设备 在线影音体验
基于 HTTP 的动态自适应流式传输 (DASH)
ISO DASH 的详细规范。
DASH 是一种自适应比特率流式传输协议,可支持实现高品质视频
通过 HTTP(S)服务器流式传输数据采用 XML 格式的清单包含
有关如何初始化和下载视频的元数据信息,
内容。Web 接收器播放器支持的主要概念是 <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 Player 会使用 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>
通常与 byte 和
指定 <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 fragment 内的 EMSG 框
提供
EmsgEvent
开发者。
虽然我们当前的 Web Receiver Player 支持主要的 DASH 用例, 是我们当前实现 DASH 时的通用属性列表 忽略或不使用。也就是说,无论清单是否包含 但不会影响内容的播放体验。
- availabilityStartTime
- segmentAlignment
HTTP Live Streaming (HLS)
有关 HTTP 实时流式传输的概述和完整规范,请参阅 此处。
Web Receiver Player 的一个主要优势是支持 MSE 中的 HLS 播放。与 DASH 不同,DASH 中清单以单个 则 HLS 会发送主播放列表,其中包含所有变体视频流的列表 各自对应的网址变体播放列表是媒体播放列表。两者 主 HLS 标记中网络接收器播放器目前支持的主要 HLS 标记 播放列表:
代码名称 | 功能 |
---|---|
#EXT-X-STREAM-INF | 指定比特率/变体流。BANDWIDTH 属性为
必需,它支持自适应比特率流式传输选择。通过
强烈建议使用 CODECS 属性来初始化 MSE,例如
名称:"avc1.42c01e,mp4a.40.2" 。如果未指定,则默认情况为
设置为 H264 main Profile 3.0 视频,"mp4a.40.2" 音频编码
内容。 |
#EXT-X-MEDIA | 在 URI 属性中指定符合以下条件的其他媒体播放列表:
代表内容。这些通常是其他
格式(5.1 环绕声)或语言。TYPE 的一个属性
包含 VIDEO 、AUDIO 、
允许使用 SUBTITLES 或 CLOSED-CAPTIONS 。设置
YES 的 DEFAULT 属性表示
此备用视频流 |
下面列出了 Web Receiver Player 目前支持的 HLS 代码 媒体播放列表:
代码名称 | 功能 |
---|---|
#EXTINF | 视频流信息,通常后跟片段时长 然后在下一行输入细分受众群的网址。 |
#EXT-X-TARGETDURATION | 每个片段的时长(以秒为单位)。这也决定了 下载/刷新直播活动的播放列表清单。Web 接收器 播放器不支持短于 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 Player 需要符合特定规范的行为。例如,在
#EXT-INF
标记,我们期望的是 URI。如果不是 URI,例如
#EXT-X-DISCOUNTINUITY
将导致播放列表解析失败。
每 #EXT-X-TARGETDURATION
秒,我们重新加载播放列表/清单,
我们还更新了所有细分受众群的新内部表示形式
添加到新的细分受众群无论何时请求跳转,我们都只会在
可寻址范围。对于直播,我们只允许从视频画面的开头开始跳转,
最新列表,直至最后达到 3 个目标时长。举个例子
如果您使用了细分受众群 6,则只能查找
而不是 8。
细分格式支持
CAF SDK 支持播放以多种格式提交的内容,如引用
在HlsSegmentFormat
中
适用于音频和 HlsVideoSegmentFormat
。这包括
打包音频
(例如 AAC 和 AC3 播放),既加密也未加密。必须提供
在 LoadRequestData
的 MediaInformation
中指定此信息
以便向播放器正确描述您的内容。如果未指定,则
默认播放器配置将尝试以“传输”的形式播放内容
流式传输打包的内容。可通过
加载请求数据(Android、
iOS
和网站)
或在接收器内通过消息拦截器发送。
查看示例代码 代码段或使用 contentId、contentUrl 和 entity 加载媒体 这份指南。
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。MPD 与 Widevine 加密流使用相同的字符串。 |
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 视频流中,但目前我们的 Web Receiver Player 仅依靠#EXT-X-ENDLIST
的存在来实现 确定直播和视频点播。
流畅直播
微软官方 流畅流式传输规范。
流畅流式传输提供自适应流式传输协议和 XML 规范 (类似于 DASH)。与 DASH 不同,Smooth Streaming 推荐 只有适用于媒体段的 MPEG-4 封装。
这个表格列出了 Smooth Streaming 中最常见的标记和属性, Web Receiver Player 目前支持的标准。我们在本课程中对许多概念的 DASH 部分。
标记/属性 | 用法 |
---|---|
<SmoothStreamingMedia> | 清单的主标记,包含以下各项的属性:
<ph type="x-smartling-placeholder">
|
<StreamIndex> | 一组视频流,类似于 DASH 的 AdaptationSet。类型通常是 “text”、“video”或“audio”。网址属性通常包含 使用比特率或开始时间等信息的片段网址 |
<QualityLevel> | 每个 QualityLevel 标记指定其比特率和 FourCC 编解码器。FourCC 通常为“H264”“AVC1”“AACL”等 通过 MaxWidth 和 MaxHeight 来设置分辨率。对于音频,它指定 频率(如 44100)和通道数。 |
<c> | 数据流片段元素。包含:
<ph type="x-smartling-placeholder">
|
<Protection> | 一个包含可选 SystemID 属性的标记,其中列出了系统 ID 需在 <SmoothStreamingMedia> 下使用的 DRM标记前面。 |
<ProtectionHeader> | 在 <Protection> 下,可以包含 SystemID 属性和自定义属性, 数据,通常为 Base64 编码。对于 Widevine,它将包含密钥 ID、密钥 长度、算法 ID,例如 AESCTR、LA_网址(许可获取网址)、 LUI_网址(许可用户界面网址)和 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>
标记中的 CanSeek、CanPause。<StreamIndex>
标记中的分块和 QualityLevels。而是通过计算 细分受众群的数量和质量级别的数量<StreamIndex>
内提供的代码,例如实际的QualityLevel
标记和<c>
个标记。- 不使用
<QualityLevel>
中的 BitsPerSample 和 PacketSize。
检查显示类型
canDisplayType
方法检查网络接收器设备的视频和音频功能,以及
验证传入的媒体参数,然后返回一个布尔值。全部
参数,但第一个是可选项,包含的参数越多,
可以提高检查的精确性
其签名为 canDisplayType(<em>mimeType</em>,<em>codecs</em>,<em>width</em>,<em>height</em>,<em>framerate</em>)
示例:
检查网络接收器设备和显示屏是否支持视频/mp4 mimetype 并使用此特定编解码器、尺寸和帧速率:
canDisplayType("video/mp4", "avc1.42e015,mp4a.40.5", 1920, 1080, 30)
检查 Web Receiver 设备和显示屏是否支持 4K 视频格式 将此编解码器指定为宽 3840,高为 2160:
canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)
检查网络接收器设备和显示屏是否支持此编解码器的 HDR10, 尺寸和帧速率
canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)
检查网络接收器设备和显示屏是否支持杜比视界 (DV) 此编解码器、尺寸和帧速率
canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)
DRM
某些媒体内容需要使用数字版权管理 (DRM)。对于媒体内容
在其清单(DASH 或 HLS)中存储了 DRM 许可(和密钥网址),
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 设备,前提是:
凭据。然后,编写网络接收器应用的应用可以使用
setCredentials
信息,以便根据需要运行 DRM。这里的
使用凭据构建媒体。
提示:另请参阅使用 contentId、contentUrl 和 entity 加载媒体。
声道处理
Cast 播放器在加载媒体时,会设置一个音频源缓冲区。在 同时,它还会选择缓冲区使用的适当编解码器, 选择 MIME 类型。设置了新的缓冲区和编解码器:
- 开始播放时
- 。
- 系统在每次主要内容继续播放时触发。
因为缓冲区使用单个编解码器,并且由于选择了编解码器 因此在有些情况下,辅助音轨可能是 被过滤掉,无法被听到。如果媒体节目的主要 音轨采用环绕声,但辅助音轨使用立体声。 因为辅助音轨经常用于提供 语言,如果提供包含不同数量曲目的媒体, 实质性影响,例如大量观看者无法听到声音 提供母语内容
以下场景说明了为什么提供编程非常重要 其中,主音轨和辅助音轨包含相同数量的声道:
场景 1 - 媒体流缺少频道 在主轨道和辅助轨道之间保持对等:
- 英语 - AC-3 5.1 声道(主要)
- 瑞典语 - AAC 2 通道
- 法语 - 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) 默认首选频道数为 2, 遇到次级媒体之间缺乏一致性的媒体时,应采取的缓解措施 音轨。
如果主音轨不是环绕声(例如,双声道立体声) Shaka 播放器会默认使用两个频道, 会自动滤除所有具有两个以上时间的次要媒体轨道, 渠道。
您还可以通过设置
shakaConfig
属性中的 preferredAudioChannelCount
cast.framework.PlaybackConfig.
例如:
shakaConfig = { "preferredAudioChannelCount": 6 };
将 preferredAudioChannelCount
设置为 6 后,Shaka Player 会检查
它可以支持环绕声编解码器(AC-3
或 EC-3
),并且
会自动过滤掉不符合首选
频道数量。