PlayReady 的基本功能是保护内容免受未经授权的使用。 为此,必须先加密内容,并在内容中插入关联的 PlayReady 标头。 执行此作的系统是打包程序,也称为加密程序,有时与编码器集成。
本主题介绍使用 PlayReady 加密和传送内容的各种方法。
打包 PlayReady 内容 - 加密和插入 DRM 标头
加密明确的内容的过程包括定义一个或多个加密密钥,使用这些密钥来加密构成内容的字节,并将 DRM 标头插入内容(内容文件或清单中(如果内容有))。
由 PlayReady 保护的所有加密内容都必须在加密文件中插入 PlayReady 标头。 PlayReady 客户端使用此 PlayReady 标头来查找或获取该特定内容片段的许可证。 PlayReady 标头由以 UTF-16 编码的 XML 组成。 它包括用于加密内容的关键标识符(KID)、一个默认 URL(如果未提供其他 URL,客户端将使用它来获取许可证)以及任何自定义属性。
打包清除内容的任何打包程序都需要实现 PlayReady 标头生成器来生成标头并将其嵌入加密内容中。 必须根据 PlayReady 标头规范 来实现 PlayReady 标头。 在打包器中创建 PlayReady 标头生成器有多种方法:
- 根据 PlayReady 标头规范自行开发它。
- 使用生成 PlayReady 标头的 PlayReady 服务器 SDK API。
- 使用生成 PlayReady 标头的 Windows 10 API。
加密的内容可以包含多个 DRM 标头,包括 PlayReady 标头以及第三方 DRM 标头。 有关其工作原理的详细信息,请参阅 “使用加密工具”。
内容类型
PlayReady 可用于保护音频和视频内容。 用于 PlayReady 的最常见编码类型包括 MPEG-4 AVC(H.264)、高效视频编码(HEVC)H.265 标准以及 AV1 标准。 PlayReady 不限于这些标准,可用于客户端设备上支持的任何音频和视频格式。
PlayReady 版本 1 和 2 允许你创建一个受保护的包,其中包含不限于音频或视频有效负载的内容。 这些包(称为信封)可以包含数据文件和可执行文件的集合(例如应用程序存储分发的应用程序)、图片(例如屏幕墙纸)或电子书等文件。 通过将文件封装到信封文件中来打包此内容,该文件可以采用类似于音频/视频内容的方式解密。
PlayReady 3.0 及更高版本中不再支持这些非音频/视频内容类型。
加密工具
Microsoft 没有将打包程序作为 PlayReady 可交付成果的一部分。 PlayReady 而是根据编码器使用的常见加密标准提供规范。 因此,加密格式不是特定于 PlayReady,而是文件格式的函数。 目前最常用的加密格式是通用加密 ISO 标准格式 ISO/IEC 23001-7。
基本上,可以创建自己的打包程序,也可以处理任何类型的开源加密程序(如 ffmpeg)。 此外,如果要使用 PlayReady 加密内容(如调音符、Elemental、Ericsson、Wowza、Allegro),则可以与专业编码器公司合作。
使用加密工具
PlayReady 支持 ISO IEC 通用加密标准。 此过程与基本加密和许可过程中所述的过程相同,除了其他 DRM 将包含标头,每个标头作为保护系统特定标头 (‘pssh’) 框的有效负载,由该 DRM 的 SystemID 标识。 所有这些标头都具有自己的语法,用于指定 KID 或最终访问内容密钥所需的信息。 对于所有 DRM,此资产的内容密钥将相同。
使用加密密钥
可通过多种不同的方法来加密资产。 最简单到最复杂的一个取决于你想要在系统中设计的复杂性,以及服务的需求。
例如,自适应流式处理资产,如下图所示。 它具有四种不同的视频质量、一个音频曲目和一个副标题曲目。它在分段的 MP4 文件中进行编码,每个段为 2.0 秒。 它是一种以多种格式提供的资产,具体取决于客户端希望播放的内容。 平滑流式处理、HLS 和 DASH 是最常见的变体。 在播放期间,客户端(即视频播放器)将通过网络连续下载构成视频内容的片段,并在每个播放时间选择适合的视频轨道,以便在网络带宽、播放速度和播放器功能等有限资源的约束下,尽量保持较高的播放质量。 此逻辑称为自适应流式播放,由播放器中实现的一些启发式处理规则控制。
仅使用一个密钥加密资产
加密这些资产的最简单方法是使用单个内容密钥来加密所有内容(通常是字幕未加密 — 它不违反任何规则,但它们通常保持清晰)。 使用一个内容密钥使许可证服务器的生活变得容易,因为许可证服务器必须提供一个密钥 {KID, CK}。 在播放发生之前,客户端通常会获取此密钥。
注释
PlayReady 客户端可以主动或被动获取许可证。 有关这两种模式的说明,请参阅 “许可证获取 ”页。
使用两个密钥加密资产,将一个密钥指定为最高质量
过去几年中,我们对每个资产使用多个密钥进行了改进,这主要是为了满足需求,即仅允许某些最高稳健性的客户端访问最高质量的内容。 借助超高清 (4K) 内容以及为更高颜色内容添加高动态范围 (HDR),工作室和服务需要只在某些客户端上提供最高质量,这些客户端通常内置了硬件 DRM。 在此方案中,所有轨道均使用一个内容密钥 {kid1, ck1} 对资源进行加密,但 4K 轨道使用不同的内容密钥 {kid2, ck2} 进行加密。 即:
- 仅允许播放全高清(不允许播放 4K 音轨)的客户端将获得仅包含 {kid1, ck1} 的 PlayReady 许可证。
- 支持播放最高 4K 分辨率的客户端将收到一个 PlayReady 许可证,包括 {kid1,ck1} 和 {kid2,ck2}。
使用此额外的复杂性,该服务可以确保某些客户端无法解密 4K 跟踪,并且 4K 跟踪只能保留给服务最信任的客户端。
使用每个轨道一个密钥加密资产
该服务可能具有更复杂的权限映射来强制实施。 某些客户端可能只允许访问某些视频曲目、某些视频质量以及某些音频曲目,具体取决于其屏幕大小、其稳定性、输出和位置。 为了确保服务在将来强制实施一组任意限制方面具有完全的灵活性,它可能会使用特定于每个跟踪的内容密钥加密资产。例如:
- 被允许仅播放 720p 的客户端将交付一个包含 {kid1, ck1},{kid2, ck2} 和 {kidA, ckA} 的 PlayReady 许可证。
- 允许播放最高 4K 分辨率内容的客户端将获得 PlayReady 许可证,其中包括 {kid1, ck1},{kid2, ck2},{kid3, ck3},{kid4, ck4},{kidA, ckA}。
- 离线播放 4K 版本资产(之前下载)的客户端将获得包括 {kid4, ck4} 和 {kidA, ckA} 的 PlayReady 许可证。
定期更改加密密钥(多周期资产)- 许可证轮换
在某些情况下,服务希望偶尔更改加密密钥,通常是在程序边界。 例如,一个实时线性流包括多个时段,期间有一些内容是免费向公众开放的,之后一些内容仅限订阅者观看。 更改程序边界上的加密密钥允许服务将免授权密钥 {KIDi1, CKi1} 提供给所有用户,并且仅将内容密钥 {kidi2, cki2} 提供给已成功登录服务的订阅者。
请注意,此许可证轮换并非非常可缩放:每次加密密钥更改时,所有客户端都使用自己的许可证请求请求新的加密密钥。 这可能会导致具有大量客户端的系统中出现许可证请求高峰。
频繁更改加密密钥 - 可缩放的密钥轮换
PlayReady 中有一种高级机制,称为可缩放密钥轮换(而不是许可证轮换)。 此方法将嵌入式许可证存储(ELS)存储在实际内容的流中。 在此机制中,用于加密 A2 段本身的密钥称为叶密钥 {kidA2, ckA2},并在段 A2 的 ELS 中分发,并使用一个单独的密钥进行加密。这个密钥对轨道 A 的所有段来说是相同的,称为根密钥 {kidRA, ckRA}。 如果你熟悉 MPEG-2 TS 和 Control Word 加密,这是一种类似的机制,但加密更强,而且更灵活。
假设此资产是实时线性电视。 客户端尝试播放时,会在流媒体清单的 PlayReady 标头中找到 kidRA,并请求 kidRA 的许可证。 许可证服务器返回根密钥 {kidRA, ckRA} 的根许可证。 然后,客户端分析段 A1 并在段的标头中发现 ELS。 在解析此 ELS 时,它会在 ELS 中找到叶许可证 {kidA1, ckA1}。 使用根密钥 {kidRA、 ckRA} 和叶许可证 {kidA1, ckA1},它可以获取 ckA1 的值,并解密和呈现段 A1。
PlayReady 可缩放密钥轮换功能极其可缩放,因为它不需要客户端在每次更改加密密钥时联系许可证服务器。 它将许可证请求量保持在尽可能低的水平,因为客户端每个流或轨道只需要一个来自许可证服务器的根许可证。它允许加密密钥像每个段一样频繁地轮换,必要时通常每两秒轮换一次。