这其实是 Web 前端多媒体开发,非常细的点,可能很多人都不太会在意。但是如果你是做 DRM 的开发,则非常有可能会接触到。
MediaKeySession 代表与内容解密模块 (CDM) 进行消息交换的上下文。
其中有两个非常重要的接口:
remove(): Promise
删除与当前对象关联的所有会话数据后返回close(): Promise
在通知当前媒体会话不再需要并且 CDM 应该释放与该对象相关的任何资源并将其关闭后返回。
其中这里最重要的概念,就是你是否需要通知 CDM 模块进行释放,我们 JS 测其实不太会参与较多的关于加密相关的事情,而更多还是依靠 CDM 内部机制。
因此如果你的 Case 是,播放完该视频后,不会再进行复播,你最好是直接 Close
, 如果你只是中断,后面会重新播放的,可以建议尝试 Remove
。
我们日常 Web 播放由于绝大多数都是非常持久的 License,所以区别不是很大,但是如果是 persistent-license
则应该尤为注意。
目前 hls.js 侧给了非常标准的实现是
mediaKeySession.remove().fininally() {
mediaKeySession.close()
}
其中还有一个与之相关的属性可以进行探测,就是
MediaKeySession.closed
会话结束时返回信号MediaKeySession。关闭会话意味着与之关联的许可证和密钥不再适用于解密媒体数据。
由于不同浏览器再实现这些 API 时候有些差异,比如我们遇到了 remove 并不是返回 promise 等,又或者有的不支持 remove 方法。
注意这里有个浏览器侧的保护机制,就是如果你刷新浏览器,这些管理的资源都会释放,包括 CDM 侧的一些资源,所以它可以用作一种修复方式。