加密媒体扩展(Encrypted Media Extensions)
介绍
加密媒体扩展(Encrypted Media Extensions)提供了一种 API,可以使 Web 应用程序与内容保护系统进行交互,以允许播放加密的音频和视频。
EME 旨在使相同的应用程序和加密文件在任何浏览器中使用,而不管底层保护系统如何。前者是通过标准化的 API 和流程实现的,而后者通过通用加密的概念成为可能 。
EME 是 HTMLMediaElement 规范的扩展,因此取名。作为“扩展”意味着浏览器对 EME 的支持是可选的:如果浏览器不支持加密的媒体,它将无法播放加密的媒体,但是 EME 不符合 HTML 规范。从 EME 规范:
该提案扩展了 HTMLMediaElement, 提供了 API 来控制受保护内容的播放。
API 支持从简单的清除密钥解密到高价值视频(给定适当的用户代理实现)的用例。许可证/密钥交换由应用程序控制,便于开发支持一系列内容解密和保护技术的强大的回放应用程序。
本规范未定义内容保护或数字版权管理系统。相反,它定义了可以用于发现,选择和与这样的系统以及更简单的内容加密系统交互的通用 API。数字版权管理的实施不符合本规范要求:只有 Clear Key 系统才能被实现为一个共同的基准。
通用 API 支持一组简单的内容加密功能,将页面作者的身份验证和授权等应用程序功能留下。这是通过要求内容保护系统特定的消息传递由页面介导而不是假设加密系统与许可证或其他服务器之间的带外通信来实现的。
EME 实现使用以下外部组件:
- 关键系统:内容保护(DRM)机制。EME 没有定义密钥系统本身,除了清除键(更多关于下文)。
- 内容解密模块(CDM):支持加密媒体播放的客户端软件或硬件机制。与 Key Systems 一样,EME 还没有定义任何 CDM,而是为应用程序提供了与可用 CDM 进行交互的界面。
- 许可证(Key)服务器:与 CDM 进行交互以提供解密媒体的密钥。许可证服务器的协商是应用程序的责任。
- 包装服务:编码和加密媒体进行分发/消费。
请注意,使用 EME 的应用程序与许可证服务器交互以获取密钥以启用解密,但用户身份和身份验证不是 EME 的一部分。在可选地验证用户之后,检索启用媒体播放的键。Netflix 等服务必须对其 Web 应用程序中的用户进行身份验证:用户登录应用程序时,应用程序将确定用户的身份和权限。
EME 如何工作
如果有多种格式或编解码器可用,则 MediaSource.isTypeSupported()或 HTMLMediaElement.canPlayType() 都可用于选择正确的格式 。但是,CDM 可能只支持浏览器支持未加密内容的一部分。最好在选择格式和编解码器之前协商 MediaKeys 配置。如果应用程序等待加密的事件,但是 MediaKeys 显示它无法处理所选的格式/编解码器,那么在不中断播放的情况下切换可能太晚了。
推荐的流程是首先使用 MediaKeysSystemAccess.getConfiguration()来协商 MediaKey,以查找协商的配置。
如果只有一种格式/编解码器可供选择,那么不需要 getConfiguration()。但是,最好先建立 MediaKeys。等待加密事件的唯一原因是,如果没有办法知道内容是否被加密,但实际上不太可能。··
- Web 应用程序尝试播放具有一个或多个加密流的音频或视频。
- 浏览器会识别媒体是否被加密(请参阅下面的框),并触发加密事件,从媒体获取有关加密的元数据(initData)。
- 应用程序处理加密事件:
- 如果没有 MediaKeys 对象已经与媒体元素相关联,首先使用 navigator.requestMediaKeySystemAccess()来检查可用的密钥系统,然后通过 MediaKeySystemAccess 对象为可用密钥系统创建一个 MediaKeys 对象。请注意,MediaKeys 对象的初始化应该发生在第一个加密事件之前。获取许可证服务器 URL 是由应用程序完成的,而不是选择可用的密钥系统。MediaKeys 对象表示可用于解密音频或视频元素的媒体的所有键。它代表 CDM 实例,并提供对 CDM 的访问,专门用于创建密钥会话,用于从许可证服务器获取密钥。
- MediaKeys 对象创建完成后,将其分配给媒体元素:setMediaKeys()将 MediaKeys 对象与 HTMLMediaElement 相关联,从而可以在播放过程中使用它的键,即在解码过程中。
- 该应用程序通过在 MediaKeys 上调用 createSession()创建一个 MediaKeySession。这将创建一个 MediaKeySession,它表示许可证的生命周期及其密钥。
- 通过在 MediaKeySession 上调用 generateRequest(),通过将加密处理程序中获取的媒体数据传递给 CDM 来生成许可证请求。
- CDM 触发消息事件:从许可证服务器获取密钥的请求。
- MediaKeySession 对象接收消息事件,应用程序向许可证服务器发送消息(例如,通过 XHR)。
- 应用程序从许可证服务器接收响应,并使用 MediaKeySession 的 update()方法将数据传递给 CDM。
- CDM 使用许可证中的密钥解密媒体。可以使用与媒体元素相关联的 MediaKey 中的任何会话的有效密钥。CDM 将访问按密钥 ID 索引的密钥和策略。
媒体播放恢复。
浏览器如何知道媒体是否被加密?
该信息在媒体容器文件的元数据中,其格式为 ISO BMFF 或 WebM。对于 ISO BMFF,这意味着标题元数据,称为保护方案信息框。WebM 使用 Matroska ContentEncryption 元素,并添加了特定的 WebM。为 EME 特定的注册表中的每个容器提供了指南。
请注意,CDM 和许可证服务器之间可能存在多条消息,并且此过程中的所有通信对于浏览器和应用程序都是不透明的:消息仅由 CDM 和许可证服务器理解,尽管应用层可以看到 CDM 正在发送 什么类型的消息 。许可证请求包含 CDM 的有效性(和信任关系)的证明,以及在生成的许可证中加密内容密钥时使用的密钥。
但 CDM 究竟做了什么呢?
EME 实现本身不提供解密媒体的方法:它只是为 Web 应用程序提供一个 API,以便与内容解密模块进行交互。
CDM 实际上做了什么不是由 EME 规范定义的,CDM 可以处理媒体的解码(解压缩)以及解密。从至少到最强大的,CDM 功能有几个潜在的选择:
- 仅解密,使用普通媒体流水线进行播放,例如通过
<video>
元素进行播放。 - 解密和解码,将视频帧传递到浏览器进行渲染。
- 解密和解码,直接在硬件中渲染(例如,GPU)。
可以通过多种方法使 CDM 可用于 Web 应用程序:
- 用浏览器捆绑 CDM。
- 分发 CDM。
- 在操作系统中构建 CDM。
- 在固件中加入 CDM。
- 将 CDM 嵌入硬件。
如何提供 CDM 不是由 EME 规范定义的,但在所有情况下,浏览器都负责审核和公开 CDM。
EME 不要求特定的关键系统; 在目前的桌面和移动浏览器中,Chrome 支持 Widevine,IE11 支持 PlayReady。