假设我们在googlecast/cast-custom-receiver上有一个加密流(SmoothStreaming + Playready)和一个自定义接收器。
我可以看到该设备尝试从 LA_URL (许可证获取网址)获取许可证 - 从流PlayReady ProtectionHeader 中提取。
我想知道有没有办法来覆盖这种行为?我希望接收者将许可证获取委托给发件人 - 在我的情况下是iOS应用程序。
答案 0 :(得分:1)
当您设置主机时,您可以传递licenseUrl(请参阅here),如果存在,则认为,它将用于获取许可证。
答案 1 :(得分:0)
您可以通过修改媒体播放器库来实现此目的。唯一需要做的事情 - 暴露挑战,关键系统,初始数据和sessionId虽然prepareLicenseRequest()
。
< this.c.prepareLicenseRequest && !this.c.prepareLicenseRequest() || this.gb()
---
> this.c.prepareLicenseRequest && !this.c.prepareLicenseRequest(this.ef, Df[this.vc], this.qb, this.hf) || this.gb()
请验证变量名称,因为它们可能不同(可在稍后的media_player.js代码webkitAddKey()
中找到它们。)
在您的接收器中,只需定义您自己的prepareLicenseRequest
实现:
window.mediaHost.prepareLicenseRequest = function(challenge,keySystem, initData, sessionId) {
debug('drm', 'prepareLicenseRequest');
window.initData = initData;
window.sessionId = sessionId;
window.keySystem = keySystem;
var base64challenge = window.btoa(pack(challenge));
window.messageBus.broadcast(base64challenge); // TODO send only to initiator
return false // receiver will stop not request license by itself
}
当发件人获得许可证时,它可以通过同一频道发回。在这种情况下,接收器需要将许可证添加到env:
window.messageBus.onMessage = function(event) {
var base64key = event['data'];
var key = unpack(window.atob(base64key));
window.mediaElement.webkitAddKey(window.keySystem, new Uint8Array(unpack(unbase64)), window.initData, window.sessionId);
window.mediaElement.play();
}
在这种情况下, window.messageBus
是自定义渠道(urn:x-cast:me.trnl.cast.key
)
就是这样。它适用于我们,而且速度非常快。