Navigator: requestMediaKeySystemAccess() 方法

Baseline 已广泛支持

此功能已成熟,并可在多种设备和浏览器版本上运行。自 2019 年 3 月以来,它已在所有浏览器中可用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

requestMediaKeySystemAccess() 方法属于 Navigator 接口,它返回一个 Promise,该 Promise 会解析出一个 MediaKeySystemAccess 对象。这个对象可以用来访问特定的媒体密钥系统,进而用于创建用于解密媒体流的密钥。

此方法是 Encrypted Media Extensions API 的一部分,该 API 为 Web 带来了对加密媒体和 DRM 保护视频的支持。

此方法可能会产生用户可见的影响,例如请求访问一个或多个系统资源的权限。在决定何时调用 requestMediaKeySystemAccess() 时,请考虑这一点;你不希望这些请求发生在不方便的时候。通常来说,此函数应仅在准备通过调用返回的 MediaKeySystemAccess 对象的 createMediaKeys() 方法来创建和使用 MediaKeys 对象时调用。

语法

js
requestMediaKeySystemAccess(keySystem, supportedConfigurations)

参数

keySystem

一个标识密钥系统的字符串。例如 com.example.some-systemorg.w3.clearkey

supportedConfigurations

一个非空的 Array,其中包含符合 MediaKeySystemAccess.getConfiguration 返回的对象的对象。第一个具有可满足配置的对象将被使用。

每个对象可能包含以下属性

注意: videoCapabilitiesaudioCapabilities 可能为空,但不能同时为空!

label 可选

配置的可选标签,默认为 ""。通过 MediaKeySystemAccess.getConfiguration 获取的配置会保留此标签。

initDataTypes

一个字符串数组,指示支持的初始化数据格式的数据类型名称(默认为空数组)。这些名称如 "cenc""keyids""webm",它们在 Encrypted Media Extensions Initialization Data Format Registry 中定义。

audioCapabilities

一个支持的音频功能数组。如果数组为空,则内容类型不支持音频功能。

数组中的每个对象都具有以下属性

contentType

一个字符串,指示媒体资源的 MIME 类型,例如 "audio/mp4;codecs=\"mp4a.40.2\"。请注意,空字符串是无效的,如果 MIME 类型定义包含参数,例如 codecs,也必须包含这些参数。

encryptionScheme

与内容类型相关的加密方案,例如 cenccbcscbcs-1-9。此值应由应用程序设置(默认为 null,表示可以使用任何加密方案)。

robustness

与内容类型相关的健壮性级别。空字符串表示可以接受任何解密和解码内容类型的能力。

videoCapabilities

一个支持的视频功能数组。数组中的对象与 audioCapabilities 中的对象具有相同的形式。

distinctiveIdentifier

一个字符串,指示实现是否可能将“独特标识符”(或独特的永久标识符)用于与从此配置创建的任何对象相关的任何操作。允许的值为:

required

返回的对象必须支持此功能。

可选

返回的对象可以支持此功能。这是默认值。

not-allowed

返回的对象不得支持或使用此功能。

persistentState

一个字符串,指示返回的对象是否必须能够持久化会话数据或任何其他类型的状态。其值与 distinctiveIdentifier 相同,并且具有相同的含义:requiredoptional(默认)、not-allowed。仅在不允许持久化状态时才能创建“临时”会话。

sessionTypes

一个字符串数组,指示必须支持的会话类型。允许的值包括:

temporary

一种会话,其许可证、密钥和会话记录或相关数据不会被持久化。应用程序不需要管理此类存储。实现必须支持此选项,并且它是默认选项。

persistent-license

一种会话,其许可证(以及可能与会话相关的其他数据)将被持久化。即使许可证被销毁,许可证及其相关密钥的记录也会被保留,这证明了许可证及其包含的密钥不再可供客户端使用。

返回值

一个 Promise,它会使用一个 MediaKeySystemAccess 对象来解析,该对象代表由 keySystemsupportedConfigurations 描述的媒体密钥系统配置。

异常

如果发生错误,返回的 Promise 会使用一个 DOMException 被拒绝,其名称指示发生了何种错误。

NotSupportedError DOMException

要么指定的 keySystem 不被平台或浏览器支持,要么 supportedConfigurations 数组中没有一个配置可以满足(例如,如果 contentType 中指定的 codecs 均不可用)。

SecurityError DOMException

此功能的用途被 Permissions-Policy: encrypted-media 阻止。

TypeError

要么 keySystem 为空字符串,要么 supportedConfigurations 数组为空。

示例

下面的示例展示了如何使用 requestMediaKeySystemAccess(),指定密钥系统和配置。

js
const clearKeyOptions = [
  {
    initDataTypes: ["keyids", "webm"],
    audioCapabilities: [
      { contentType: 'audio/webm; codecs="opus"' },
      { contentType: 'audio/webm; codecs="vorbis"' },
    ],
    videoCapabilities: [
      { contentType: 'video/webm; codecs="vp9"' },
      { contentType: 'video/webm; codecs="vp8"' },
    ],
  },
];

navigator
  .requestMediaKeySystemAccess("org.w3.clearkey", clearKeyOptions)
  .then((keySystemAccess) => {
    /* use the access to get create keys */
  });

规范

规范
加密媒体扩展
# navigator-extension-requestmediakeysystemaccess

浏览器兼容性

另见