Chromecast发件人作为PlayReady许可提供商

时间:2014-04-20 21:54:24

标签: chromecast google-cast smooth-streaming playready

假设我们在googlecast/cast-custom-receiver上有一个加密流(SmoothStreaming + Playready)和一个自定义接收器。

我可以看到该设备尝试从 LA_URL (许可证获取网址)获取许可证 - 从流PlayReady ProtectionHeader 中提取。

我想知道有没有办法来覆盖这种行为?我希望接收者将许可证获取委托给发件人 - 在我的情况下是iOS应用程序。

2 个答案:

答案 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

就是这样。它适用于我们,而且速度非常快。