ExoPlayer 整合

本文件提供佇列和 DRM 整合的總覽 聯絡。

DRM 強化功能

ExoPlayer 投放示範 現已更新,採用結構化方法,利用 ExoPlayer 對接收器應用程式的 MediaInfo。Cast 範例 也會使用總覽中相同的程式碼接收器 ,測試 DRM 支援。不過,如要針對投放 DRM 機制獲得保護, 因此您應該自行建立並代管 網路接收端

開始之前,建議您先熟悉 存取 DRM 支援說明文件 Google CastExoPlayer。本總覽將說明 將 ExoPlayer DRM 設定連接到 Web 接收器。資訊 有關如何在 ExoPlayer 中使用 DRM,請參閱 ExoPlayer 網站

提供 DRM 設定

ExoPlayer 試用版應用程式內含程式碼範例,說明如何提供 DRM 做為 MediaItem 的一部分您可以設定的四個選項如下:

  • 標頭 - 套用至 HTTPS 要求的標頭字典 擷取 DRM 授權。
  • 授權網址:用於取得授權的網址。
  • 防護系統 - DRM 保護架構,用來保護內容、 例如 Widevine

你提供給 ExoPlayer 的 DRM 設定已傳送給接收端 將應用程式做為屬性 (位於 MediaInformationcustomData 中) 做為載入要求的一部分根據預設,此屬性會呼叫 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;
  }
}

初始設定

視您使用的數位版權管理解決方案而定,您可能需要設定 licenseRequestHandlermediaPlaybackInfoHandlerlicenseRequestHandler 可讓您自訂 CAF 向授權金鑰伺服器要求授權的方式。 mediaPlaybackInfoHandler 可讓您修改 PlaybackConfig 舉例來說,如果所有內容都需要使用 不同的授權伺服器網址

如要從每個載入要求物件擷取 ExoPlayerConfig 的副本,請建立 Web Receiver SDK 應用程式中的載入要求攔截器。

第一步是先註冊處理常式再啟動投放 應用程式。

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、 您應該傳回播放設定媒體播放資訊處理常式會 。如果您有內容授權網址, 在載入前變更這些 Pod 和保護系統

mediaPlaybackInfoHandler(loadRequest, playbackConfig) {
    if (!exoPlayerConfig) {
        return;
    }

    playbackConfig.licenseUrl = exoPlayerConfig.licenseUrl ?
            exoPlayerConfig.licenseUrl :
            undefined;
    playbackConfig.protectionSystem = exoPlayerConfig.protectionSystem ?
            exoPlayerConfig.protectionSystem :
            undefined;

    return playbackConfig;
}

其他資源

每項數位著作權管理導入作業都是自訂內容,這裡提供程式碼做為示範 。建議您洽詢 DRM 供應商,確認是否已正確設定 已在 ExoPlayer 和 Cast 應用程式中導入 DRM。

ExoPlayer 網站提供最新說明文件 和公告事項ExoPlayer 及其 Cast 整合的問題可能會 ExoPlayer 的 GitHub 報告 Cloud Storage 也提供目錄同步處理功能