MediaKeys:getStatusForPolicy() 方法
MediaKeys 接口的 getStatusForPolicy() 方法用于根据指定的策略要求,检查内容解密模块 (CDM) 是否会允许使用这些密钥呈现加密的媒体数据。
该方法返回一个 Promise,该 Promise 会解析为一个字符串,指示密钥相对于所有指定的策略要求的状态。如果解析值为 "usable",则内容可以以理想的质量进行解密和呈现。其他值表示无法使用密钥呈现内容的具体原因;在某些情况下,它们会提示回退选项,例如以较低的质量播放内容。
目前,策略限制仅包括对最低支持 HDCP 版本的限制。
请注意,该方法会根据限制检查一个“假设的密钥”。应用程序无需先创建真实的密钥并使用 MediaKeySession 获取真实的许可证,而且 MediaKeys 甚至不必附加到音频或视频元素。
语法
getStatusForPolicy(policy)
参数
policy可选-
一个具有以下可选属性的对象
minHdcpVersion可选-
一个字符串,指示用于检查可用性的最低 HDCP 版本的语义版本,例如
1.0、1.4、2.2、2.3。
注意: 必须指定至少一个策略限制,因此 minHdcpVersion 仅是“技术上”可选的。
返回值
一个 Promise,它解析为一个字符串,指示在给定策略下密钥是否可用于解密。
该字符串可以具有以下值之一
usable-
密钥目前可用于解密。
expired-
由于到期时间已过,密钥不再可用于解密。
released-
密钥已释放,不再可供 CDM 使用。但关于密钥的信息仍然可用,例如许可证销毁记录。
output-restricted-
根据指定策略,密钥存在输出限制。使用此密钥解密的数据媒体可能会被阻止呈现。该状态表明源和输出之间的连接(例如,您的计算机和外部显示器)不受信任。这可能表明源、中间设备和输出之间存在 HDCP 版本不匹配,或者 HDMI 线缆或视频分配器等中间连接设备已损坏或不符合标准。应用程序可以选择使用更高版本的 HDCP,或不要求如此高版本 HDCP 的内容。您还应检查中间设备和线缆是否支持 HDCP,连接是否牢固,以及是否损坏。
output-downscaled-
根据指定策略,密钥存在输出限制,但如果内容以较低质量播放,这些限制可能会放宽。如果返回此值,应用程序可能会以较低分辨率播放内容,或者可以选择使用更高版本的 HDCP,或者使用不需要如此高 HDCP 版本的内容。
usable-in-future-
一旦达到启动时间,密钥将在未来可用于解密。
status-pending-
密钥的状态尚不确定,正在确定中。
internal-error-
由于 CDM 中出现错误,密钥目前无法用于解密。应用程序无法处理这种情况。
异常
TypeError-
policy没有定义的属性(策略限制),或者属性键无效。 NotSupportedError-
CDM 无法确定一个或所有策略限制的状态。
示例
使用 HDCP 限制检查密钥是否可用
此示例演示了在使用最低 HDCP 版本 2.2 解密特定视频格式时,如何检查密钥是否可用。
注意: 当使用外部显示器时,output-restricted 状态可能由硬件 HDCP 不兼容引起。如果使用的是笔记本电脑,您可以通过断开外部显示器来“修复”此问题。
HTML
<pre id="log"></pre>
JavaScript
const config = [
{
videoCapabilities: [
{
contentType: 'video/mp4; codecs="avc1.640028"',
encryptionScheme: "cenc",
robustness: "SW_SECURE_DECODE", // Widevine L3
},
],
},
];
getMediaStatus(config);
async function getMediaStatus(config) {
try {
const mediaKeySystemAccess = await navigator.requestMediaKeySystemAccess(
"com.widevine.alpha",
config,
);
const mediaKeys = await mediaKeySystemAccess.createMediaKeys();
const mediaStatus = await mediaKeys.getStatusForPolicy({
minHdcpVersion: "2.2",
});
log(mediaStatus);
// Get the content or fallback to an alternative if the
// keys are not usable
if (mediaStatus === "usable") {
console.log("HDCP 2.2 can be enforced.");
// Fetch the high resolution protected content
} else {
log("HDCP 2.2 cannot be enforced");
// Fallback other content, get license, etc.
}
} catch (error) {
log(error);
}
}
结果
规范
| 规范 |
|---|
| 加密媒体扩展 # dom-mediakeys-getstatusforpolicy |
浏览器兼容性
加载中…