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

Web 接收器 SDK 目前支持三种类型的流式传输协议:

DASHHTTP Live Streaming Smooth Streaming

在本文档中,我们列出了对每种流式传输协议的支持。请注意,与详细的协议规范相比,对每种协议所支持标记的说明相当简短。我们的目标是快速浏览和了解如何使用每个协议,以及支持 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 类型是“视频/mp4”“音频/mp4”和“文本/vtt”。可以在 <AdaptationSet> 下添加一个可选的 <ContentComponent contentType="$TYPE$">

在每个 <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> 通常与字节范围请求一起使用,以指定 <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>

无论使用哪种表示法,如果流受到保护,<AdaptationSet> 下都会显示 <ContentProtection> 部分,其中 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 实时流式传输的概览和完整规范,请点击此处

网络接收器播放器的一个主要优势是能够支持在 MSE 中播放 HLS。与 DASH(清单位于单个文件中)不同,HLS 发送主播放列表,其中包含所有变体视频流的列表及各自的网址。变体播放列表即为媒体播放列表。网络接收器播放器目前在主播放列表中支持以下两种主要 HLS 标记:

代码名称 功能
#EXT-X-STREAM-INF 指定比特率/变体流。必须使用 BANDWIDTH 属性,以支持自适应比特率流式传输选择。强烈建议在初始化 MSE 时使用 CODECS 属性,例如 "avc1.42c01e,mp4a.40.2"。如果未指定,则默认情况设置为 H264 主配置文件 3.0 视频和 "mp4a.40.2" 音频编码内容。
#EXT-X-MEDIA 指定代表内容的其他媒体播放列表(在 URI 属性中)。这些音频流通常是其他格式(5.1 环绕声)或语言的备用音频流。允许使用包含 VIDEOAUDIOSUBTITLESCLOSED-CAPTIONSTYPE 属性。将 DEFAULT 属性设置为 YES 表示默认选择此备用音频流。

下面列出了网络接收器播放器目前在媒体播放列表中支持的 HLS 标记:

代码名称 功能
#EXTINF 流信息,通常后跟片段时长(以秒为单位),下一行是片段的网址。
#EXT-X-TARGETDURATION 每个片段的时长(以秒为单位)。这还决定了我们下载/刷新直播活动的播放列表清单的频率。网络接收器播放器不支持短于 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 这是视频点播还是直播。

对于直播,我们使用 #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 个目标时长”。例如,如果您有一个包含 10 个片段的列表,而您在片段 6 上,则最多只能跳转至 7 个(而非 8 个)片段。

段格式支持

CAF SDK 支持播放以多种格式传送的内容,如适用于音频的 HlsSegmentFormat 和适用于视频的 HlsVideoSegmentFormat。这包括对打包音频(例如 AAC 和 AC3 播放)的支持(加密和非加密)。您必须在 LoadRequestDataMediaInformation 中指定此信息,以便向播放器正确描述您的内容。如果未指定,默认播放器配置会尝试将内容作为传输流打包内容进行播放。您可以通过加载请求数据(AndroidiOSWeb)中的任何发送者设置此属性,也可以通过消息拦截器在接收器中设置此属性。

如需详细了解如何在 Web 接收器上准备内容,请查看下面的示例代码段或使用 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,解码后该 DRM 信息包含密钥 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

下面列出了我们目前不使用或支持的 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 打包。

下表列出了 Web Receiver Player 目前支持的 Smooth Streaming 中最常用的标记和属性。上面的 DASH 部分已经说明了许多概念。

标记/属性 用法
<SmoothStreamingMedia> 清单的主标记,包含以下属性:
  • TimeScale:表示一秒的单位数,通常以 10,000,000 为增量。
  • 时长:内容的长度(按时间尺度显示)。Web 接收器播放器不支持短于 0.1 秒的时长。
  • IsLive:清单是否为实时媒体。
<StreamIndex> 一组流,类似于 DASH 的 AdaptationSet。类型通常是“文本”“视频”或“音频”。Url 属性通常包含使用比特率或开始时间等信息的模板化 fragment 网址。
<QualityLevel> 每个 QualityLevel 标签都会指定其比特率和 FourCC 编解码器。FourCC 代码通常为“H264”“AVC1”“AACL”等。对于视频,它通过 MaxWidth 和 MaxHeight 指定分辨率。对于音频,它指定其从采样率(例如 44100)的频率和通道数。
<c> 数据流片段元素。包含:
  • d:fragment 的时长。
  • t:fragment 的媒体时间。
<保护> 带有可选 SystemID 属性的标记,其中列出要在 <SmoothStreamingMedia> 标记下使用的系统 DRM 的 ID。
<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 质量级别)将如下所示,初始时间从视频 StreamIndex 下的 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 接收器设备和显示屏是否支持具有特定编解码器、尺寸和帧速率的视频/mp4 MIME 类型:

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

通过将宽度和高度指定为 3840,检查网络接收器设备和显示屏是否支持此编解码器的 4K 视频格式:

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 接收器中,您可以根据需要使用 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 接收器应用的应用可以根据需要使用 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 播放器将默认使用两个声道,并自动过滤掉具有两个以上声道的任何辅助媒体音轨。

您还可以通过在 cast.framework.PlaybackConfigshakaConfig 属性中设置 preferredAudioChannelCount 来配置 Shaka 的首选音频声道数量。

例如:

shakaConfig = { "preferredAudioChannelCount": 6 };

preferredAudioChannelCount 设置为 6 后,Shaka Player 会检查自己是否可以支持环绕声编解码器(AC-3EC-3),并自动过滤掉不符合首选声道数量要求的任何媒体轨道。