我基于Google Cast Application Framework开发了定制的Cast Receiver应用程序。接收器应用程序负责播放Widevine加密流。我们支持的解决方案要求在许可证请求的PreAuthorization
标头中添加 DRM令牌。我需要执行几个授权请求才能检索 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
所以我的问题是:
答案 0 :(得分: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);
};
);
每次Receiver提取清单时(每个广告中断后或动态清单的每个更新周期),都会调用manifestHandler方法。
希望我能对您有所帮助,这很难从Google获得帮助/答案。
最好, 文森特。
答案 1 :(得分:0)
阅读许可证的属性,看看它是否可以更新。如果此属性未设置为true,则无法续订许可证。