我正在开发一个小型系统,用于通过MSE/EME API在网络上传输受保护的内容.
这是我正在使用的一些工具:
FFMPEG
谷歌的Shaka-Packager
webm_crypt
我可以创建.webm文件并使用shaka-packager将它们打包到mpd文件中,以便提供给shaka-player.但是遵循Shaka文档中的Clear Key部分我必须加密webm文件需要对KeyId
和Key
.通过使用webm_crypt,我可以按照2.2.7上的这个文档创建加密内容,但我不知道如何获取shaka-player DRM系统的密钥对.
如果您使用的是Clear Key,则可以使用密钥服务器列表配置播放器.播放器向密钥服务器发出JSON请求(请求采用此格式),密钥服务器提供"许可证" - 包含Base64编码的对称密钥和keyId的JSON响应.然后使用该对称密钥来解密内容.
更新
要将密钥ID与未受保护的内容密钥关联以使用ClearKey进行调试,请为drm.clearKeys
十六进制编码中的keyId 提供一个JSON元素作为映射的"密钥","value"是十六进制编码的内容加密密钥.
player.configure({ drm: { clearKeys: { 'deadbeefdeadbeefdeadbeefdeadbeef': '18675309186753091867530918675309', '02030507011013017019023029031037': '03050701302303204201080425098033' } } });
在加密时或在随附的清单文件中将相同的keyId与媒体文件相关联.
使用mp4split加密媒体文件:
#!/bin/bash KID=10000000100010001000100000000001 CEK=3a2a1b68dd2bd9b2eeb25e84c4776668 LAURL="http://playready.directtaps.net/pr/svc/rightsmanager.asmx?PlayRight=1&UseSimpleNonPersistentLicense=1" PSSH=YOUR_PSSH mp4split --package_mpd -o audio.mp4 \ --iss.key=${KID}:${CEK} --iss.license_server_url=${LAURL} \ --widevine.key=${KID}:${CEK} --widevine.drm_specific_data=${PSSH} \ oceans-64k.mp4 mp4split --package_mpd -o video-1.mp4 \ --iss.key=${KID}:${CEK} --iss.license_server_url=${LAURL} \ --widevine.key=${KID}:${CEK} --widevine.drm_specific_data=${PSSH} \ oceans-250k.mp4 mp4split --package_mpd -o video-2.mp4 \ --iss.key=${KID}:${CEK} --iss.license_server_url=${LAURL} \ --widevine.key=${KID}:${CEK} --widevine.drm_specific_data=${PSSH} \ oceans-380k.mp4
因为webm_crypt
,文档非常粗略,但我相信它是在content_id=0123456789ABCDEF
命令行标志中完成的-video_options
:
foo@bar-linux:~/chromium_code/webm_crypt/webm_crypt$ ./webm_crypt -i mediafiles/Chrome_44_5sec-chunks_video_only.webm -video true -audio false -video_options base_file=bear.key,content_id=0123456789012345 -o /home/foo/www/no_crawl/eme/media/Chrome_44_5sec-chunks_video??_only-enc_v_01234567??89012345.webm