#drm #streaming #dash #系统信息 #pssh #内容保护

pssh-box

PSSH盒子在DRM系统中解析和序列化支持

10个版本

0.1.9 2024年7月28日
0.1.8 2024年7月26日
0.1.6 2024年6月13日
0.1.5 2024年2月27日
0.1.0 2024年1月28日

#436视频

Download history 88/week @ 2024-05-04 84/week @ 2024-05-11 199/week @ 2024-05-18 70/week @ 2024-05-25 66/week @ 2024-06-01 222/week @ 2024-06-08 140/week @ 2024-06-15 80/week @ 2024-06-22 50/week @ 2024-06-29 42/week @ 2024-07-06 62/week @ 2024-07-13 362/week @ 2024-07-20 446/week @ 2024-07-27 57/week @ 2024-08-03 73/week @ 2024-08-10 41/week @ 2024-08-17

每月下载量749
2 个物品中使用 (通过 dash-mpd)

MIT 许可证

57KB
1K SLoC

pssh-box

此包定义了Rust数据结构,允许您存储、解析和序列化保护系统特定标题(PSSH)盒子,这些盒子为数字版权管理(DRM)系统的初始化提供数据。

Crates.io Released API docs CI Dependency status LICENSE

PSSH盒子用于

  • 在MP4片段中类型为pssh的MP4盒子

  • 在DASH MPD显示中的<cenc:pssh>元素中

  • 传递给Web浏览器加密媒体扩展的DRM初始化数据

  • m3u8播放列表的EXT-X-SESSION-KEY字段中

一个PSSH盒子包含单个DRM系统的信息。此库支持以下DRM系统的PSSH数据格式

  • 谷歌拥有的Widevine,广泛用于DASH流媒体
  • 微软拥有的PlayReady,广泛用于DASH流媒体
  • 华为拥有的WisePlay
  • Irdeto
  • Marlin
  • Nagra
  • Netflix为DASH类似流媒体使用的非官方Apple FairPlay变体
  • 通用加密

PSSH盒子包含(取决于DRM系统)关于获取内容密钥的key_ID的信息,所使用的加密方案(例如cenc、cbc1、cens或cbcs),许可服务器URL和校验和数据。

功能

此包提供以下功能

  • 从二进制缓冲区解析PSSH盒子(如在MP4片段中找到),或从base64编码的字符串(如在MPD显示中的<cenc:pssh>元素中找到),或从十六进制编码的字符串。

  • 扫描二进制缓冲区以查找PSSH盒子的位置,使用函数find_iter

  • 使用函数pprint美化打印PSSH。

  • 将PSSH盒子序列化为二进制、Base64或十六进制(基16)格式,使用在to_bytes()to_base64()to_hex()方法上对一个PsshBox结构体进行。

example/decode-pssh.rs中提供了一个用于解码PSSH盒子和PSSH数据(以各种格式)的命令行实用工具。

如果您想在Web应用程序中使用此功能,可能会对pssh-box-wasm库感兴趣,该库提供了将此代码用作WebAssembly的功能。

使用方法

let boxes = from_base64("AAAAZ3Bzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAAEcSEKqL5HpT2ymw4FM7KEUKHLsaA3NmciIkYWE4YmU0N2EtNTNkYi0yOWIwLWUwNTMtM2IyODQ1MGExY2JiKgJTREjj3JWbBg==")
     .unwrap();
assert_eq!(boxes.len(), 1);
let pssh = &boxes[0];
assert_eq!(pssh.system_id, WIDEVINE_SYSTEM_ID);
if let PsshData::Widevine(ref pd) = pssh.pssh_data {
    assert!(pd.provider.clone().is_some_and(|p| p.eq("sfr")));
    assert_eq!(pd.key_id[0], hex::decode("aa8be47a53db29b0e0533b28450a1cbb").unwrap());
    assert_eq!(pd.content_id, Some(hex::decode("61613862653437612d353364622d323962302d653035332d336232383435306131636262").unwrap()));
}

构建

在构建过程中使用protoc编译器将Widevine PSSH数据的protobuf接口定义转换为Rust结构体。这发生在build.rs文件中。默认配置使用预先构建的protobuf编译器,必须在本地安装(例如,从Debian软件包protobuf-compiler安装)。

作为替代方案,如果启用了vendored-protoc功能,则使用protobuf-srccrate构建protoc编译器的供应商版本。这需要一个可工作的C++编译器和cmake支持,并且通常不太可靠(特别是protobuf的abseil-cpp组件往往导致在稍微不寻常的平台上的构建失败)。在Windows上构建的最简单解决方案似乎是MSYS2的UCRT64环境;请参阅我们的GitHub持续集成工作流程,了解一个有效的配方。

许可证

此项目使用MIT许可证。有关更多信息,请参阅LICENSE文件。

依赖项

~5–9MB
~151K SLoC