已获取ClearKey参数,Shaka Player播放加密MPD失败求助
排查Shaka Player ClearKey解密错误的实操步骤
1. 严格校验密钥与KID格式
ClearKey对格式要求苛刻,Kodi/Tivimate的兼容性更强,你要先确认:
k(密钥)和kid必须是base64url编码:把普通base64里的+换成-、/换成_,同时去掉末尾所有的填充字符=- 禁止直接使用十六进制字符串,必须转成二进制再转base64url格式
2. 检查DRM配置结构是否正确
Shaka的ClearKey配置必须是键值对严格匹配的对象,键是kid的base64url值,值是k的base64url值,示例代码如下:
player.configure({ drm: { clearKeys: { "你的kid-base64url值": "你的k-base64url值" } } });
注意:所有值必须是纯字符串,不能带多余引号、空格或其他格式转换。
3. 调整代码执行顺序
很多新手会先加载MPD再配置密钥,这会导致Shaka获取加密信息时无密钥可用,正确顺序是:
- 初始化Shaka Player实例
- 配置ClearKey密钥
- 调用
player.load(mpdUrl)
完整示例代码:
<!DOCTYPE html> <html> <head> <script src="https://cdnjs.cloudflare.com/ajax/libs/shaka-player/4.7.1/shaka-player.compiled.js"></script> </head> <body> <video id="video" controls width="640"></video> <script> document.addEventListener('DOMContentLoaded', async () => { const video = document.getElementById('video'); const player = new shaka.Player(video); // 先配置DRM密钥,再加载流 player.configure({ drm: { clearKeys: { "abcdef1234567890abcdef1234567890": "abcdef1234567890abcdef1234567890" } } }); try { await player.load('你的MPD文件URL'); console.log('播放初始化成功'); } catch (e) { console.error('加载失败:', e); } }); </script> </body> </html>
4. 核对MPD中的加密信息
打开MPD文件,找到<ContentProtection>节点,解析其中的PSSH盒子提取KID,和你手里的KID做完全匹配(包括大小写、格式):
return (<ContentProtection schemeIdUri="urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e" value="ClearKey"> <cenc:pssh>...</cenc:pssh> </ContentProtection> )
如果MPD里的KID和你使用的不一致,直接会导致解密失败。
5. 排查环境与兼容性问题
- 必须使用支持EME(加密媒体扩展)的现代浏览器(Chrome、Firefox、Edge均可,IE完全不支持)
- 禁止用
file://协议直接打开本地HTML文件,部分浏览器会限制DRM功能,建议用本地服务器(比如python -m http.server)运行测试
6. 开启调试日志定位细节
启用Shaka的调试日志,能获取更具体的错误原因(比如“找不到对应KID的密钥”“密钥格式无效”等):
shaka.log.setLevel(shaka.log.Level.DEBUG);
根据控制台输出的日志,针对性调整配置或格式。
内容的提问来源于stack exchange,提问作者Piyush Adlakha
相关产品推荐
相关产品推荐

