本文档简要介绍了队列和 DRM 集成 联系。
DRM 增强功能
ExoPlayer Cast 演示
已更新为利用结构化方式传递 DRM 配置,
ExoPlayer 的 MediaInfo
传递到接收器应用。Cast 示例
还使用包含本概览中相同代码的演示接收器,
以便测试 DRM 支持不过,如果您想投放受数字版权管理(DRM)保护的内容
你应该构建并托管自己的
网络接收器。
在开始之前,熟悉 有关 DRM 支持的文档,请访问 Google Cast 和 ExoPlayer。本概述将向您介绍 将 ExoPlayer DRM 配置连接到网络接收器。相关信息 如需了解如何在 ExoPlayer 中使用数字版权管理,请参阅 ExoPlayer 网站。
提供 DRM 配置
ExoPlayer 演示版应用包含展示如何提供 DRM 的示例代码 作为 MediaItem 的一部分。您可以配置以下四个选项:
- Headers - 应用于 HTTPS 请求的标头字典 检索 DRM 许可。
- 许可网址 - 用于获取许可的网址。
- 保护系统 - 用于保护内容的 DRM 保护方案。 例如 Widevine。
您提供给 ExoPlayer 的 DRM 配置会发送到接收器
在 MediaInformation
上将应用作为 customData
中的一个属性
作为加载请求的一部分。默认情况下,此属性称为
exoPlayerConfig
,这与以下定义匹配。
/**
* Extended configuration settings for ExoPlayer.
*/
ExoPlayerConfig class {
constructor() {
/**
* Dictionary of headers to apply to the license request.
* @type {!Object|undefined}
*/
this.headers;
/**
* The URL for your DRM server.
* @type {string|undefined}
*/
this.licenseUrl;
/**
* Preferred protection system to use for decrypting content.
* @type {!cast.framework.ContentProtection|undefined}
*/
this.protectionSystem;
/**
* Indicates whether CORS Access-Control requests should be made using
* credentials such as cookies or authorization headers.
*
* If withCredentials is set to true then Access-Control-Allow-Origin cannot
* be set to '*'.
* @type {boolean|undefined}
*/
this.withCredentials;
}
}
初始设置
根据您使用的 DRM 解决方案,您可能需要配置 licenseRequestHandler
和 mediaPlaybackInfoHandler
。借助licenseRequestHandler
,您可以自定义
CAF 如何向您的许可密钥服务器请求许可。通过
借助 mediaPlaybackInfoHandler
,您可以修改
PlaybackConfig
例如,如果每一项内容都必须使用
不同的许可服务器网址。
如需从每个加载请求对象获取 ExoPlayerConfig
的副本,请创建
在 Web Receiver SDK 应用中放置加载请求拦截器。
第一步是在启动 Cast 之前注册处理程序 应用。
const context = cast.framework.CastReceiverContext.getInstance();
const playbackConfig = new cast.framework.PlaybackConfig();
playbackConfig.licenseRequestHandler =
licenseRequestHandler;
context.getPlayerManager().setMediaPlaybackInfoHandler(
mediaPlaybackInfoHandler);
context.getPlayerManager().setMessageInterceptor(
cast.framework.messages.MessageType.LOAD,
loadInterceptor);
// starts the Cast application
context.start({playbackConfig: playbackConfig});
加载请求拦截器
加载请求拦截器是一个回调,允许您查看和修改 CAF 尝试加载媒体项之前的投放请求。重要的是 在许可请求处理程序和媒体播放信息处理程序之前调用该方法。
系统会向加载请求拦截器传递 LoadRequestData
对象,该对象包含您的应用发送的 Exo Player 配置。您可以
将此对象保存为全局变量,以便在许可请求处理程序中使用
和媒体播放信息处理程序。
loadInterceptor(loadRequestData) {
// not every load request will have a customData object
if (loadRequestData.media && loadRequestData.media.customData &&
loadRequestData.media.customData['exoPlayerConfig']) {
// exoPlayerConfig is a global variable here
exoPlayerConfig =
loadRequestData.media.customData['exoPlayerConfig'];
}
// you must return the loadRequestData object
return loadRequestData;
}
许可请求处理程序
许可请求处理程序允许您自定义 HTTPS 请求 Web
接收器向您的许可服务器发出调用。系统会向该处理程序传递一个 NetworkRequestInfo
然后,您可以使用该对象添加 HTTP 标头、包含 Cookie
修改网址。处理程序应返回此对象。
例如,如果您需要向许可请求添加自定义标头, 可以创建类似于以下内容的许可请求处理程序:
licenseRequestHandler(networkRequestInfo) {
if (!exoPlayerConfig) {
return networkRequestInfo;
}
networkRequestInfo.headers =
exoPlayerConfig.headers ? exoPlayerConfig.headers : undefined;
return networkRequestInfo;
}
媒体播放信息处理程序
媒体播放信息处理程序可让您更改播放
配置。系统会向该处理程序传递一个 LoadRequestData
和PlaybackConfig
,
应返回播放配置媒体播放信息处理程序将是
在 Cast 每项内容加载完毕之前调用该方法。如果您有针对具体内容的许可网址,
以便在加载前更改保护系统和保护系统。
mediaPlaybackInfoHandler(loadRequest, playbackConfig) {
if (!exoPlayerConfig) {
return;
}
playbackConfig.licenseUrl = exoPlayerConfig.licenseUrl ?
exoPlayerConfig.licenseUrl :
undefined;
playbackConfig.protectionSystem = exoPlayerConfig.protectionSystem ?
exoPlayerConfig.protectionSystem :
undefined;
return playbackConfig;
}
更多资源
每个 DRM 实现都是自定义的,此代码作为演示提供 。您应咨询您的 DRM 提供商,以确保您的 在 ExoPlayer 和 Cast 应用中实现 DRM。
ExoPlayer 的网站提供最新文档 和公告。ExoPlayer 及其 Cast 集成可能存在的问题 ExoPlayer 的 GitHub 上报告的问题 存储库