Web 接收器播放器流式传输协议

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

DASHHTTP Live StreamingSmooth Streaming

本文档列出了对各个流式传输协议的支持。请注意,与详细的协议规范相比,每种协议支持的代码的说明经过了简写。目的是让您快速了解每个协议的使用方式,以及支持 Cast 的设备支持该协议的哪些功能以提供流式传输体验。

基于 HTTP 的动态自适应流式传输 (DASH)

ISO 的 DASH 详细规范

DASH 是一种自适应比特率流式传输协议,支持通过 HTTP(S) 服务器进行高品质视频流式传输。由 XML 组成的清单包含大多数有关如何初始化和下载视频内容的元数据信息。网络接收器播放器支持的关键概念包括 <Period><AdaptationSet><Representation><SegmentTemplate><SegmentList><BaseUrl><ContentProtection>

DASH 清单以根 <MPD> 标记开头,其内部包含一个或多个 <Period> 标记,代表一个流式传输内容。<Period> 标记允许对不同的流式传输内容进行排序,通常用于分隔主要内容和广告或多个连续的视频内容。

<MPD> 下的 <AdaptationSet> 是一组媒体流的一组表示法,在大多数情况下为视频、音频或字幕。最常见的 MIME 类型为“video/mp4”、“audio/mp4”和“text/vtt”。<AdaptationSet> 下可包含可选的 <ContentComponent contentType="$TYPE$">

每个 <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 属性用于指定重复时长相同的片段数量,以便系统正确计算 $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> 标记的属性;“dynamic”用于表明这是直播活动。
展示时间偏移 <SegmentBase> 标记的属性;指定从时间段开头的呈现时间偏移量。
起始编号 指定演示文稿中第一个媒体细分的编号。此 ID 通常用于直播中。

我们还支持为 DASH 识别 MP4 Fragment 内的 EMSG 盒子,并为开发者提供 EmsgEvent

虽然我们当前的 Web 接收器播放器支持主要的 DASH 用例,但下面列出了当前 DASH 实现会忽略或不使用的常见属性。这意味着,无论清单是否包含这些内容,它们都不会影响内容的播放体验。

  • availabilityStartTime
  • 细分受众群对齐

HTTP Live Streaming (HLS)

点击此处可查看 HTTP 实时流式传输的概览和完整规范。

网络接收器播放器的一个主要优势是它能够支持在 MSE 中播放 HLS。与 DASH (其中清单包含在单个文件中)不同,HLS 会发送包含所有变体视频流及其对应网址的列表的主播放列表。变体播放列表就是媒体播放列表。Web 接收器播放器目前在主播放列表中支持的两个主要 HLS 标记如下:

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

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

代码名称 功能
#扩展 直播信息,通常后跟细分受众群的时长(以秒为单位)和下一行的网址。
#EXT-X-TARGETDURATION 每个片段的时长(以秒为单位)。这也决定了我们下载/刷新直播播放列表的播放列表的频率。Web 接收器播放器不支持短于 0.1 秒的时长。
#EXT-X-媒体序列 此播放列表中第一个片段代表的序列号(通常用于直播视频流)。
#EXT-X-KEY DRM 密钥信息。METHOD 属性指示要使用的密钥系统。我们现在支持 AES-128SAMPLE-AES
#EXT-X-BYTERANGE 要为某个细分网址提取的字节范围。
#EXT-X-不连续性 指定连续的片段之间的不连续性。这种情况通常发生于服务器端广告插播,即广告片段出现在主视频流的中间。
#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 接收器播放器希望每种规范都有特定的行为。例如,我们希望在 #EXT-INF 标记之后添加 URI。如果它不是 URI,例如,#EXT-X-DISCOUNTINUITY 会导致播放列表的解析失败。

#EXT-X-TARGETDURATION 秒,我们会重新加载播放列表/清单以获取新的片段列表,并将所有片段的新内部表示形式更新为新片段列表。每当有人请求跳转时,我们只会寻找该跳转范围。对于直播,我们只允许从最新列表的开始跳转至结尾三个目标时长。例如,如果您的细分列表包含 10 个细分,并且您采用细分 6,则最多只能跳转 7 个,但不能跳转 8 个。

细分受众群格式支持

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

如需详细了解如何在 Web Receiver 上准备内容,请查看下面的示例代码段或使用 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 视频流中,但目前我们的网络接收器播放器仅依赖于 #EXT-X-ENDLIST 的存在来确定直播与点播的对比。

流畅流式传输

Microsoft 的官方 Smooth Streaming 规范

流畅流式传输通过 HTTP 提供自适应流式传输协议和 XML 规范(类似于 DASH)。与 DASH 不同,Smooth Streaming 仅建议为媒体段使用 MPEG-4 打包。

下表介绍了网络接收器播放器目前在 Smooth Streaming 中最常见的标记和属性。上述 DASH 部分已对许多概念进行了解释。

标记/属性 使用情况
<SmoothStreamingMedia> 清单的主标记,包含以下属性:
  • TimeScale:用于表示一秒的单位数,通常以 10000000 为增量。
  • 时长:内容在时间尺度中的长度。Web 接收器播放器不支持短于 0.1 秒的时长。
  • IsLive:清单是否为实时媒体。
<StreamIndex> 一组数据流,类似于 DASH 的适配器。类型通常为“文本”、“视频”或“音频”。Url 属性通常包含使用比特率或开始时间等信息的模板化片段网址。
<质量级别> 每个 QualityLevel 标记均指定其比特率和 FourCC 编解码器。FourCC 代码通常为“H264”、“AVC1”、“AACL”等。对于视频,其通过 MaxWidth 和 MaxHeight 指定其分辨率。对于音频,音频流通过 StmplingRate 和声道数指定频率(例如 44100)。
<c> 流 Fragment 元素。包含:
  • 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 秒内容的实时 Smooth 流式清单示例:

<?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> 标记)计算片段数量和质量级别数量。
  • 未使用 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)

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

canDisplayType("video/mp4", "hev1.1.2.L150", 3840, 2160)

检查 Web 接收器设备和显示设备是否支持以下编解码器、尺寸和帧速率的 HDR10:

canDisplayType("video/mp4", "hev1.2.6.L150", 3840, 2160, 30)

检查网络接收器设备和显示屏是否支持此编解码器、尺寸和帧速率的杜比视界 (DV):

canDisplayType("video/mp4", "dvhe.04.06", 1920, 1080, 30)

DRM

注意:使用 Web Receiver SDK 的主要优势之一是,您的应用不再需要加载 MPL 并单独处理媒体播放,因为 Web Receiver SDK 会为您处理这项任务。

某些媒体内容需要数字版权管理 (DRM)。对于在其清单(DASH 或 HLS)中存储了 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 助理集成功能,则某些 DRM 信息(例如内容所需的凭据)可能会通过 OAuth/SSO 等机制直接与您的 Google 帐号相关联。在这些情况下,如果媒体内容通过语音加载或来自云端,系统会从云端向提供该凭据的投放设备调用 setCredentials。然后,编写 Web 接收器应用的应用可以根据需要使用 setCredentials 信息来操作 DRM。以下是使用凭据构建媒体的示例。

提示:另请参阅使用 contentId、contentUrl 和实体加载媒体

声道处理

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 时,Skaka Player 会检查它是否支持环绕声编解码器(AC-3EC-3),并自动过滤掉所有不符合首选通道数的媒体轨道。