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 发件人应用