ExoPlayer 集成

本文档简要介绍了队列和 DRM 集成 联系。

DRM 增强功能

ExoPlayer Cast 演示 已更新为利用结构化方式传递 DRM 配置, ExoPlayer 的 MediaInfo 传递到接收器应用。Cast 示例 还使用包含本概览中相同代码的演示接收器, 以便测试 DRM 支持不过,如果您想投放受数字版权管理(DRM)保护的内容 你应该构建并托管自己的 网络接收器

在开始之前,熟悉 有关 DRM 支持的文档,请访问 Google CastExoPlayer。本概述将向您介绍 将 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 解决方案,您可能需要配置 licenseRequestHandlermediaPlaybackInfoHandler。借助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;
}

媒体播放信息处理程序

媒体播放信息处理程序可让您更改播放 配置。系统会向该处理程序传递一个 LoadRequestDataPlaybackConfig, 应返回播放配置媒体播放信息处理程序将是 在 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 上报告的问题 存储库