咨询:Chromecast自定义CAF接收器期望的Widevine许可证格式
Chromecast CAF接收器播放Widevine DRM DASH内容的许可证格式问题
问题描述
我有受Widevine DRM保护的视频资产,CDN许可证服务器返回的是Base64编码的许可证,格式如下:
{ "getWidevineLicenseResponse": { "license": "CAIS6AQ/KNAoQYNEgAOoX [snip] +0UWAE=" } }
但我的Chromecast自定义CAF接收器不兼容这个格式。我试过仅返回许可证字符串本身,也试过将其转为ASCII并以字节缓冲区形式返回,视频还是无法播放,触发Shaka 6008错误,提示无法更新媒体密钥。接收器能正常播放CDN提供的多数视频,但DRM保护的视频始终无法和许可证服务器完成协商。请问Chromecast播放器CDM播放Widevine保护的DASH内容时,需要的许可证格式是什么?
解决方案
- Chromecast的Widevine CDM要求许可证必须是Base64解码后的二进制原始数据,而非Base64字符串或者JSON包装格式。
- 你之前的尝试存在两个核心问题:
- 仅返回Base64字符串:CDM需要的是解码后的字节流,不是字符串本身;
- 转ASCII:Base64解码后是二进制数据,转ASCII会破坏原始字节结构,导致CDM无法识别。
- 正确的处理步骤:
- 从服务器返回的JSON中提取
license字段的Base64字符串; - 将该Base64字符串解码为Uint8Array格式的二进制数据;
- 把这个二进制数据直接返回给Shaka Player的许可证请求回调。
- 从服务器返回的JSON中提取
以下是基于Shaka Player的许可证处理代码示例:
player.configure({ drm: { servers: { 'com.widevine.alpha': '你的许可证服务器地址' }, licenseCallback: async function(response) { // 解析服务器返回的JSON响应 const jsonData = await response.json(); // 提取Base64编码的许可证字符串 const base64License = jsonData.getWidevineLicenseResponse.license; // 将Base64解码为Uint8Array二进制数据 const binaryLicense = Uint8Array.from(atob(base64License), char => char.charCodeAt(0)); // 返回二进制许可证数据给CDM return binaryLicense; } } });
- 额外检查项:
- 确认许可证服务器返回的HTTP响应头
Content-Type为application/json,确保能正确解析响应内容; - 验证接收器的DRM配置是否正确,包括Widevine服务器URL、CDM类型等参数;
- Shaka 6008错误多由许可证格式错误或验证失败导致,需确保解码后的二进制数据未被篡改。
- 确认许可证服务器返回的HTTP响应头
内容的提问来源于stack exchange,提问作者Ptumster
相关产品推荐
相关产品推荐

