2

我基于Google Cast 应用程序框架开发自定义 Cast Receiver 应用程序接收器应用程序负责播放 Widevine 加密流。我们支持的解决方案需要在许可请求的标头中添加DRM 令牌。PreAuthorization我需要执行几个授权请求来检索DRM 令牌。我假设检索 DRM 令牌的最佳位置是使用Message Interceptor

this.playerManager_.setMessageInterceptor(
cast.framework.messages.MessageType.LOAD, (loadRequestData) => {
  var media = loadRequestData.media;
  var customData = media.customData;
  var licenseUrl = customData.licenseUrl || null;
  var contentId = media.contentId;
  var cdn = customData.cdn || null;
  return this.getOriginMediaURL(contentId, cdn, PlayerApiImp)
  .then(playbackURL => {
    loadRequestData.media.contentId = playbackURL;
    loadRequestData.media.customData.contentUrl = contentId;
    return this.getDRMToken(customData);
  })
  .then(drmToken => {
    this.preAuthToken = drmToken
    this.playbackConfig_.licenseUrl = licenseUrl;
    return loadRequestData
  })
  .catch(error => {
    this.log_({'ERROR': error});
    return loadRequestData;
  });;
});

然后 CAST Player 自动调用licenseRequestHandler,我很容易将所需的 DRM 令牌添加到许可证请求的标头中:

this.playbackConfig_.licenseRequestHandler = requestInfo => {
  if (this.preAuthToken) {
    requestInfo.headers = {};
    requestInfo.headers['PreAuthorization'] = this.preAuthToken;
  }
};

播放工作正常,但直到许可证密钥过期为止。在我们的后端许可证上大约有 30 分钟。在那之后,接收播放器产生错误[cast.framework.media.ShakaPlayer] category: 6 code: 6014并停止播放。我发现这个错误意味着 在此处输入图像描述

所以我的问题是:

  1. Cast Receiver API 是否支持续订许可证?接收方会触发 CAST API 中的哪些回调来通知会话已过期?我没有收到任何消息,我只收到错误:(并且播放停止。
  2. 如何向播放器提供新许可证以防止其失败?
4

2 回答 2

0

阅读许可证的属性,看看它是否可以更新。如果此属性未设置为 true,则无法续订许可证。

于 2019-07-06T10:52:30.993 回答
0

我们通过使用 PlaybackConfig 的 manifestHandler 方法实现了这一点。它可以返回一个 Promise,因此我们已经能够检测到令牌是否过期,并相应地更新它。

castContext
  .getPlayerManager()
  .setMediaPlaybackInfoHandler(
    (loadRequestData, playbackConfig) => {
      playbackConfig.manifestHandler = manifest =>
        retrieveUpfrontToken(loadRequestData)
          .then(token => {
            playbackConfig.licenseRequestHandler = requestInfo => {
              requestInfo.withCredentials = true;
              requestInfo.headers['x-dt-auth-token'] = token;
            };
          })
          .then(() => manifest);
    };
  );

每次接收器获取清单时都会调用 manifestHandler 方法(在每个广告中断之后或在动态清单的每个更新周期)。

我希望我有所帮助,从谷歌获得一些帮助/答案是相当复杂的......

最好的,文森特。

于 2019-03-28T15:37:54.187 回答