ExoPlayer 統合

このドキュメントでは、キューイングと DRM 統合のサポートの概要について説明します。

DRM の強化

ExoPlayer のキャストデモが更新され、ExoPlayer の MediaInfo を使用して DRM 構成をレシーバー アプリに渡す構造化された方法を利用できるようになりました。Cast サンプルは、この概要と同じコードを含むデモ レシーバーも使用し、DRM サポートをテストできます。ただし、DRM で保護されたコンテンツをキャストする場合は、独自のウェブ レシーバーを作成してホストする必要があります。

始める前に、Google CastExoPlayer の DRM サポートに関するドキュメントの内容を理解しておくことをおすすめします。この概要では、ExoPlayer DRM 構成をウェブ レシーバーに接続する方法について説明します。ExoPlayer で DRM を利用する方法については、ExoPlayer の公式ウェブサイトをご覧ください。

DRM 構成を指定する

ExoPlayer デモアプリには、MediaItem の一部として DRM 構成を提供する方法を示すサンプルコードが含まれています。次の 4 つのオプションを構成できます。

  • ヘッダー - DRM ライセンスを取得するために HTTPS リクエストに適用されるヘッダーの辞書。
  • ライセンスの URL - ライセンスの取得に使用する URL。
  • 保護システム - コンテンツを保護するために使用される 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 を使用すると、コンテンツごとに別のライセンス サーバー URL を使用する必要がある場合などに、メディア アイテムごとに 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 がメディア アイテムの読み込みを試行する前にキャスト読み込みリクエストを表示して変更できるコールバックです。重要なのは、ライセンス リクエストハンドラとメディア再生情報ハンドラの前に呼び出されることです。

読み込みリクエスト インターセプタには、アプリから送信された Exo Player 構成を含む LoadRequestData オブジェクトが渡されます。このオブジェクトをグローバル変数として保存して、ライセンス リクエスト ハンドラとメディア再生情報ハンドラで使用できます。

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;
}

ライセンス リクエスト ハンドラ

ライセンス リクエスト ハンドラを使用すると、Web Receiver がライセンス サーバーに送信する HTTPS リクエストをカスタマイズできます。ハンドラに NetworkRequestInfo オブジェクトが渡されます。このオブジェクトを使用して、HTTP ヘッダーの追加、Cookie の組み込み、URL の変更を行うことができます。ハンドラはこのオブジェクトを返す必要があります。

たとえば、ライセンス リクエストにカスタム ヘッダーを追加する必要がある場合は、次のようなライセンス リクエスト ハンドラを作成できます。

licenseRequestHandler(networkRequestInfo) {
    if (!exoPlayerConfig) {
        return networkRequestInfo;
    }

    networkRequestInfo.headers =
            exoPlayerConfig.headers ? exoPlayerConfig.headers : undefined;

    return networkRequestInfo;
}

メディア再生情報ハンドラ

メディア再生情報ハンドラを使用すると、メディア アイテムごとに再生構成を変更できます。ハンドラに LoadRequestDataPlaybackConfig が渡されると、再生構成を返す必要があります。メディア再生情報ハンドラは、キャストするアイテムが読み込まれる前に呼び出されます。コンテンツごとのライセンスの URL がある場合は、読み込み前に URL と保護システムを変更できます。

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 リポジトリで報告できます。