【问题标题】:How to renew expired DRM license in Cast Receiver Player?如何在 Cast Receiver Player 中更新过期的 DRM 许可证?
【发布时间】:2019-06-28 02:58:29
【问题描述】:

我基于Google Cast Application Framework 开发自定义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 并停止播放。 我发现this error means

所以我的问题是:

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

【问题讨论】:

  • 在需要续订许可证时,您是否没有收到对 licenseRequestHandler 的新调用?到那时你的 preAuthToken 可能已经过期了。
  • @colde 我调查并看到接收器播放器没有调用新的'licenseRequestHandler'。我真的不知道如何更新许可证

标签: javascript google-cast drm google-cast-sdk widevine


【解决方案1】:

我们通过使用 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 方法(在每个广告中断之后或在动态清单的每个更新周期之后)。

希望我对您有所帮助,从 Google 获得一些帮助/答案非常复杂...

最好, 文森特。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-01-18
      • 2020-06-15
      • 2017-08-14
      • 2022-03-01
      • 2022-06-25
      • 2021-06-16
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多