Cast:拦截(和调整)来自 Widevine 许可代理的响应

问题描述 投票:0回答:0

我正在尝试通过我的自定义接收器将受 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 代理返回的内容,所以我无法解决任何问题。

任何帮助将不胜感激!

google-cast drm widevine
© www.soinside.com 2019 - 2024. All rights reserved.