Chrome 69 中的媒体更新

François Beaufort
François Beaufort

AV1 视频解码器

Chromestatus 跟踪器 | Chromium bug

EME:查询加密架构支持

某些平台或密钥系统仅支持 CENC 模式,而其他平台或密钥系统仅支持 CBCS 模式。还有一些设备可以同时支持这两种模式。这两种加密方案不兼容,因此 Web 开发者必须能够智能地选择要投放的内容。

为避免必须确定自己所用的平台以检查是否支持“已知”加密方案,系统在 MediaKeySystemMediaCapability 字典添加了新的 encryptionScheme 键,以允许网站指定可以在加密媒体扩展 (EME) 中使用的加密方案。

新的 encryptionScheme 键可以是以下两个值之一:

  • 'cenc' AES-CTR 模式的完整样本和视频 NAL 子样本加密。
  • 'cbcs' AES-CBC 模式部分视频 NAL 模式加密。

如果未指定,则表示接受任何加密方案。请注意,Clear Key 始终支持 'cenc' 方案。

以下示例展示了如何查询采用不同加密方案的两种配置。在这种情况下,系统只会选择一个。

await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [
    {
      label: 'configuration using the "cenc" encryption scheme',
      videoCapabilities: [{
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cenc'
      }],
      audioCapabilities: [{
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cenc'
      }],
      initDataTypes: ['keyids']
    },
    {
      label: 'configuration using the "cbcs" encryption scheme',
      videoCapabilities: [{
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cbcs'
      }],
      audioCapabilities: [{
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cbcs'
      }],
      initDataTypes: ['keyids']
    },
  ]);

在以下示例中,系统仅查询了具有两种不同加密方案的一个配置。在这种情况下,Chrome 会舍弃任何无法支持的 capability 对象,因此累积的配置可能包含一种或两种加密方案。

await navigator.requestMediaKeySystemAccess('org.w3.clearkey', [{
    videoCapabilities: [
      { // A video capability using the "cenc" encryption scheme
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cenc'
      },
      { // A video capability using the "cbcs" encryption scheme
        contentType: 'video/mp4; codecs="avc1.640028"',
        encryptionScheme: 'cbcs'
      },
    ],
    audioCapabilities: [
      { // An audio capability using the "cenc" encryption scheme
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cenc'
      },
      { // An audio capability using the "cbcs" encryption scheme
        contentType: 'audio/mp4; codecs="mp4a.40.2"',
        encryptionScheme: 'cbcs'
      },
    ],
    initDataTypes: ['keyids']
  }]);

实施意向 | Chromestatus 跟踪器 | Chromium bug

EME:HDCP 政策检查

如今,对于流式传输高分辨率受保护内容HDCP 是一项常见的政策要求。而想要强制执行 HDCP 政策的网站开发者必须等待许可交换完成,或者开始以低分辨率流式传输内容。这属于令人遗憾的情况,HDCP Policy Check API 旨在解决这一问题。

这项提议的 API 让 Web 开发者可以查询是否可以强制执行特定的高带宽数字内容保护 (HDCP) 政策,以便以最佳分辨率开始播放,从而提供最佳用户体验。它包含一个简单的方法来查询与 HDCP 政策关联的假设密钥的状态,而无需创建 MediaKeySession 或提取真实许可。它也不需要将 MediaKeys 附加到任何音频或视频元素。

只需使用具有 minHdcpVersion 键和有效值的对象调用 mediaKeys.getStatusForPolicy(),即可使用 HDCP 政策检查 API。如果指定版本支持 HDCP,则返回的 promise 会解析为 MediaKeyStatus'usable'。否则,该 promise 会使用 MediaKeyStatus其他错误值(例如 'output-restricted''output-downscaled')进行解析。如果密钥系统根本不支持 HDCP 政策检查(例如 Clear Key System),promise 会拒绝。

简而言之,该 API 目前的运作方式如下。请查看官方示例,试用所有版本的 HDCP。

const config = [{
  videoCapabilities: [{
    contentType: 'video/webm; codecs="vp09.00.10.08"',
    robustness: 'SW_SECURE_DECODE' // Widevine L3
  }]
}];

navigator.requestMediaKeySystemAccess('com.widevine.alpha', config)
.then(mediaKeySystemAccess => mediaKeySystemAccess.createMediaKeys())
.then(mediaKeys => {

  // Get status for HDCP 2.2
  return mediaKeys.getStatusForPolicy({ minHdcpVersion: '2.2' })
  .then(status => {
    if (status !== 'usable')
      return Promise.reject(status);

    console.log('HDCP 2.2 can be enforced.');
    // TODO: Fetch high resolution protected content...
  });
})
.catch(error => {
  // TODO: Fallback to fetch license or stream low-resolution content...
});

适用于起源试验

为了从 Web 开发者那里获得反馈,我们之前在桌面版 Chrome 69(ChromeOS、Linux、Mac 和 Windows)中添加了 HDCP Policy Check API 功能。

该试行计划已于 2018 年 11 月成功结束。

意图实验 | Chrome 状态跟踪器 | Chromium bug

MSE PTS/DTS 合规性

现在,缓冲范围和时长值按呈现时间戳 (PTS) 间隔进行报告,而不是按媒体来源扩展 (MSE) 中的解码时间戳 (DTS) 间隔进行报告。

MSE 刚推出时,Chrome 的实现已针对 WebM 和 MP3 进行了测试,这些媒体流格式不区分 PTS 和 DTS。在添加 ISO BMFF(也称为 MP4)之前,它一直运行良好。此容器通常包含与解码时间流(例如 H.264 等编解码器)的非顺序呈现,导致 DTS 和 PTS 不同。这导致 Chrome 报告的缓冲范围和时长值与预期不同(通常只是略有不同)。这项新行为将在 Chrome 69 中逐步推出,并使其 MSE 实现符合 MSE 规范

PTS/DTS
PTS/DTS

此更改会影响 MediaSource.duration(以及 HTMLMediaElement.duration)、SourceBuffer.buffered(以及 HTMLMediaElement.buffered)SourceBuffer.remove(start, end))。

如果您不确定使用哪种方法报告缓冲范围和时长值,可以前往内部 chrome://media-internals 页面,然后在日志中搜索“ChunkDemuxer: buffering by PTS”或“ChunkDemuxer: buffering by DTS”。

打算实现 | Chromium bug

在 Android Go 上处理媒体视图 intent

Android Go 是 Android 的轻量版,专为入门级智能手机而设计。为此,Android 设备不一定会随附一些媒体观看应用,例如,如果用户尝试打开下载的视频,就没有任何应用可处理该 intent。

为解决此问题,Android Go 版 Chrome 69 现在会监听媒体观看 intent,以便用户查看下载的音频、视频和图片。换句话说,它会取代缺少的观看应用。

ALT_TEXT_HERE
媒体 intent 处理脚本

请注意,在搭载 Android O 及更高版本且 RAM 不超过 1 GB 的所有 Android 设备上,此 Chrome 功能均处于启用状态。

Chromium 错误

移除了使用 MSE 的媒体元素的“卡顿”事件

如果下载媒体数据未能持续 3 秒左右,媒体元素上会引发“stalled”事件。使用媒体源扩展 (MSE) 时,Web 应用会管理下载,而媒体元素无法知晓下载进度。这导致每当网站在过去 3 秒内未附加包含 SourceBuffer.appendBuffer() 的新媒体数据块时,Chrome 都会在不恰当的时间引发“已暂停”事件。

由于网站可能会决定以低频率附加大量数据,因此这不是一个有关缓冲健康状况的实用信号。移除使用 MSE 的媒体元素的“卡顿”事件可消除混淆,使 Chrome 更符合 MSE 规范。请注意,不使用 MSE 的媒体元素将继续像目前一样触发“卡顿”事件。

废弃和移除的意图 | Chromestatus 跟踪器 | Chromium bug