我正在尝试通过我的自定义接收器将受 DRM 保护的内容投射到我的 Chromecast 设备,但我不断收到此错误:
[ERROR] Event detected: {"type":"ERROR","detailedErrorCode":200,"error":{"shakaErrorCode":6008,"shakaErrorData":["Failed to execute 'update' on 'MediaKeySession': UpdateSession failed"]}}
根据 Shaka 文档,此错误是因为 CDM 不喜欢它从许可证服务器获得的响应:
“许可响应被 CDM 拒绝。服务器的响应对于此 CDM 可能无效或格式错误。error.data[0] 是来自浏览器的错误消息字符串。”
这并不让我感到特别惊讶,因为我知道我的 CDN 的 Widevine 代理使用 base64(标准)编码,但大多数 Google 产品都需要 base64url 编码。所以我需要拦截来自许可证服务器的响应,稍微修改一下,然后传递给 CDM。
我该怎么做?似乎没有我可以设置以捕获响应的 playbackConfig.licenseResponseHandler ...
有人有我可以查看的“标准”Widevine licenseRequestHandler 函数示例吗?也许我做的事情基本上是我的错误?
我的 CDN 的 widevine 代理需要对代理 URL 的初始质询请求(带有一些其他参数,包括 auth 令牌),JSON 请求正文如下:
{
"getWidevineLicense": {
"releasePid": "2vnevwf3AVz0", // unique identifier for my particular video
"widevineChallenge": "CAQ="
}
}
然后将响应传递给 CDM,它构建真正的 Widevine 挑战,用于第二次调用 widevine 代理,返回实际的许可证密钥。
在我的接收器代码中,我尝试使用以下处理程序捕获并预处理许可请求:
playbackConfig.licenseRequestHandler = requestInfo => {
castDebugLogger.warn(LOG_TAG, 'Unmodified request: ', requestInfo);
requestInfo.url = widevineLicenseServer;
// It doesn't seem to matter if we use requestInfo.body or requestInfo.content
//-- it doesn't work either way.
var wrapped = { "getWidevineLicense": {} };
var base64_string = "CAQ=";
castDebugLogger.warn(LOG_TAG, 'Checking for original content: ', requestInfo.content);
if (requestInfo && requestInfo.content && requestInfo.content.length > 16) {
castDebugLogger.warn(LOG_TAG, 'Detected original content: ', requestInfo.content);
base64_string = btoa(requestInfo.content);
// Shaka expects to be using base64url encoding, but Comcast (my CDN) uses base64 (standard),
// so I have to manually adjust two characters.
base64_string = base64_string.replace(/-/g, '+');
base64_string = base64_string.replace(/_/g, '/');
}
wrapped.getWidevineLicense.widevineChallenge = base64_string;
wrapped.getWidevineLicense.releasePid = releasePid;
castDebugLogger.warn(LOG_TAG, 'Wrapped content: ', wrapped);
// Encode the wrapped request as JSON.
const wrappedJson = JSON.stringify(wrapped);
requestInfo.content = wrappedJson;
castDebugLogger.warn(LOG_TAG, 'Handling license request for DRM with a modified license request: ', requestInfo);
};
我正在使用 Cactool v2 连接到我已注册(但尚未发布)的 App ID,我正在向它传递一个与我正在使用的 releasePid 一致的 DASH 清单 (mpd)。我看到标题加载成功,但当它尝试解决 Widevine 许可请求时,它会生成我之前提到的 Shaka 6008 错误。
我希望我提供的初始 Widevine 挑战 (CAQ=) 会导致我可以解析并传递给 CDM 的挑战响应,以便可以生成“真正的”widevine 挑战,但 CDM 不喜欢什么它正在从我的 widevine 代理返回。我似乎无法“看到”从 widevine 代理返回的内容,所以我无法解决任何问题。
任何帮助将不胜感激!