网络接收器播放器流式传输协议

Web Receiver SDK 支持三种类型 实现以下目标:

DASHHTTP 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 的一个属性 包含 VIDEOAUDIO、 允许使用 SUBTITLESCLOSED-CAPTIONS。设置 YESDEFAULT 属性表示 此备用视频流

下面列出了 Web Receiver Player 目前支持的 HLS 代码 媒体播放列表:

代码名称 功能
#EXTINF 视频流信息,通常后跟片段时长 然后在下一行输入细分受众群的网址。
#EXT-X-TARGETDURATION 每个片段的时长(以秒为单位)。这也决定了 下载/刷新直播活动的播放列表清单。Web 接收器 播放器不支持短于 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 下一片段的第一个样本的绝对时间,例如 &quot;2016-09-21T23:23:52.066Z&quot;.
#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 播放),既加密也未加密。必须提供 在 LoadRequestDataMediaInformation 中指定此信息 以便向播放器正确描述您的内容。如果未指定,则 默认播放器配置将尝试以“传输”的形式播放内容 流式传输打包的内容。可通过 加载请求数据(AndroidiOS网站) 或在接收器内通过消息拦截器发送。

查看示例代码 代码段或使用 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-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。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 部分。

标记/属性 用法
&lt;SmoothStreamingMedia&gt; 清单的主标记,包含以下各项的属性: <ph type="x-smartling-placeholder">
    </ph>
  • TimeScale:表示一秒的单位数,通常以 10,000,000。
  • 时长:内容的时长(以时间尺度表示)。Web Receiver Player 的用途 不支持短于 0.1 秒的时长。
  • IsLive:清单是否为直播媒体。
&lt;StreamIndex&gt; 一组视频流,类似于 DASH 的 AdaptationSet。类型通常是 “text”、“video”或“audio”。网址属性通常包含 使用比特率或开始时间等信息的片段网址
&lt;QualityLevel&gt; 每个 QualityLevel 标记指定其比特率和 FourCC 编解码器。FourCC 通常为“H264”“AVC1”“AACL”等 通过 MaxWidth 和 MaxHeight 来设置分辨率。对于音频,它指定 频率(如 44100)和通道数。
&lt;c&gt; 数据流片段元素。包含: <ph type="x-smartling-placeholder">
    </ph>
  • d:fragment 的时长。
  • t:片段的媒体时间。
&lt;Protection&gt; 一个包含可选 SystemID 属性的标记,其中列出了系统 ID 需在 <SmoothStreamingMedia> 下使用的 DRM标记前面。
&lt;ProtectionHeader&gt; 在 <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> 标记中的 CanSeekCanPause
  • <StreamIndex> 标记中的分块QualityLevels。而是通过计算 细分受众群的数量和质量级别的数量 <StreamIndex> 内提供的代码,例如实际的 QualityLevel 标记和 <c> 个标记。
  • 不使用 <QualityLevel> 中的 BitsPerSamplePacketSize

检查显示类型

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-3EC-3),并且 会自动过滤掉不符合首选 频道数量。