1

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

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

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

4

2 回答 2

1

当您设置主机时,您可以传递一个 licenseUrl(请参见此处),我认为如果存在,它将用于获取许可证。

于 2014-04-20T22:11:13.940 回答
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()

请验证变量名称,因为它们可能不同(webkitAddKey()稍后可以在 media_player.js 代码中的调用中找到它们)。

在您的接收器中,只需定义您自己的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
}                 

当发件人获得许可证时,它可以通过同一渠道将其发回。在这种情况下,接收者需要将许可证添加到环境中:

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)

而已。它对我们有用,而且速度非常快。

于 2014-09-29T10:39:14.857 回答