Chromecast 发件人作为 PlayReady 许可证提供者

Posted

技术标签:

【中文标题】Chromecast 发件人作为 PlayReady 许可证提供者【英文标题】:Chromecast sender as a PlayReady license provider 【发布时间】:2014-04-20 21:54:23 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

是的,我还可以在Host#updateLicenseRequestInfo 中更新请求的标头和内容,但这意味着我需要将用户会话和其他发件人已经拥有的信息移动到 chromecast。 是否可以将许可证获取委托给发件人? 发件人 SDK 对许可证、DRM 等一无所知。因此,如果您正在寻找这方面的 API,则没有相应的 API。我仍然不明白为什么在设置 Host 时仅设置 url 对您来说还不够。 我正在查看以下场景:1 - 接收者知道它需要许可证才能播放内容,2 - 接收者通过 SOAP 许可证对发送者的请求,3 - 发送者从服务器请求许可证,4 - 发送者将 SOAP 许可证响应传递给接收者,5 - 接收者应用许可证并继续播放。我们需要这个,因为我们的许可证获取过程是定制的,我们将 userToken、deviceId、contentId 和其他一些东西传递给 DRM 服务器,我不会将它们复制到接收者。 您需要编写自己的发送方和接收方,这是一个非常不寻常的流程,恕我直言,这是不必要的(在我看来,发送方应向接收方提供所需的详细信息,接收方应联系许可证服务器)。【参考方案2】:

您可以通过修改媒体播放器库来实现这一点。唯一需要做的事情 - 通过prepareLicenseRequest() 公开挑战、密钥系统、初始化数据和 sessionId。

<    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
                 

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

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)

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

【讨论】:

@AliNaddaf 您对此有何看法?

以上是关于Chromecast 发件人作为 PlayReady 许可证提供者的主要内容,如果未能解决你的问题,请参考以下文章

检测我是不是是唯一连接到 Chromecast 设备的 Chromecast 发件人应用

Chromecast API 发件人 - Android 手机

更改 Chromecast 发件人上的应用 ID

单个网页上的多个 Chromecast 发件人

ChromeCast 发件人发现逻辑

chromecast 发件人示例中的 Android 空指针