Integrasi ExoPlayer

Dokumen ini memberikan ringkasan tentang antrean dan dukungan integrasi DRM.

Penyempurnaan DRM

Demo Cast ExoPlayer telah diupdate untuk memanfaatkan cara terstruktur dalam meneruskan konfigurasi DRM menggunakan MediaInfo ExoPlayer ke aplikasi penerima. Contoh Cast juga menggunakan penerima demo yang menyertakan kode yang sama dalam ringkasan ini, sehingga Anda dapat menguji dukungan DRM. Namun, jika ingin Mentransmisikan konten yang dilindungi DRM, Anda harus membuat dan menghosting Penerima Web Anda sendiri.

Sebelum memulai, sebaiknya Anda memahami dokumentasi tentang dukungan DRM di Google Cast dan ExoPlayer. Ringkasan ini akan menunjukkan cara menghubungkan konfigurasi DRM ExoPlayer ke Penerima Web. Untuk informasi tentang cara menggunakan DRM di ExoPlayer, lihat situs resmi ExoPlayer.

Menyediakan konfigurasi DRM

Aplikasi demo ExoPlayer berisi kode contoh yang menunjukkan cara menyediakan konfigurasi DRM sebagai bagian dari MediaItem. Keempat opsi yang dapat Anda konfigurasi adalah:

  • Header - kamus header yang diterapkan pada permintaan HTTPS untuk mengambil lisensi DRM.
  • URL Lisensi - URL yang digunakan untuk mendapatkan lisensi.
  • Sistem Perlindungan - skema perlindungan DRM yang digunakan untuk melindungi konten, misalnya, Widevine.

Konfigurasi DRM yang Anda berikan ke ExoPlayer dikirim ke aplikasi penerima Anda sebagai properti di customData pada objek MediaInformation sebagai bagian dari permintaan pemuatan. Secara default, properti ini disebut exoPlayerConfig, yang cocok dengan definisi berikut.

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

Penyiapan awal

Bergantung pada solusi DRM yang digunakan, Anda mungkin perlu mengonfigurasi licenseRequestHandler dan mediaPlaybackInfoHandler. licenseRequestHandler memungkinkan Anda menyesuaikan cara CAF meminta lisensi dari server kunci lisensi Anda. mediaPlaybackInfoHandler memungkinkan Anda mengubah PlaybackConfig per item media jika, misalnya, setiap konten harus menggunakan URL server lisensi yang berbeda.

Untuk mengambil salinan ExoPlayerConfig dari setiap objek permintaan pemuatan, buat interseptor permintaan pemuatan di aplikasi Web Receiver SDK.

Langkah pertama adalah mendaftarkan pengendali sebelum memulai aplikasi Transmisi.

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

Memuat intersepsi permintaan

Interseptor permintaan pemuatan adalah callback yang memungkinkan Anda melihat dan mengubah permintaan pemuatan Cast sebelum CAF mencoba memuat item media. Yang penting, parameter ini akan dipanggil sebelum hander permintaan lisensi dan pengendali info pemutaran media.

Interseptor permintaan pemuatan diberi objek LoadRequestData yang berisi Exo Player Config yang dikirim oleh aplikasi Anda. Anda dapat menyimpan objek ini sebagai variabel global untuk digunakan dalam pengendali permintaan lisensi dan pengendali info pemutaran media.

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

Pengendali permintaan lisensi

Pengendali permintaan lisensi memungkinkan Anda menyesuaikan permintaan HTTPS yang dibuat Penerima Web ke server lisensi. Pengendali diberi objek NetworkRequestInfo, yang kemudian dapat Anda gunakan untuk menambahkan header HTTP, menyertakan cookie, atau bahkan mengubah URL. Pengendali akan menampilkan objek ini.

Misalnya, jika Anda perlu menambahkan header kustom ke permintaan lisensi, Anda dapat membuat pengendali permintaan lisensi yang mirip dengan ini:

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

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

    return networkRequestInfo;
}

Pengendali info pemutaran media

Pengendali info pemutaran media memungkinkan Anda membuat perubahan pada konfigurasi pemutaran per item media. Pengendali diberi LoadRequestData dan PlaybackConfig, dan Anda harus menampilkan konfigurasi pemutaran. Pengendali info pemutaran media akan dipanggil sebelum setiap item yang Anda Transmisi dimuat. Jika memiliki URL lisensi per konten, Anda dapat mengubahnya dan sistem perlindungan sebelum pemuatan.

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

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

    return playbackConfig;
}

Referensi lanjutan

Setiap penerapan DRM bersifat kustom dan kode ini hanya diberikan sebagai demonstrasi. Anda harus berkonsultasi dengan penyedia DRM untuk memastikan Anda telah mengimplementasikan DRM dengan benar pada aplikasi ExoPlayer dan Cast.

Situs ExoPlayer menampilkan dokumentasi dan pengumuman terbaru. Masalah pada ExoPlayer dan integrasi Cast-nya dapat dilaporkan di repositori GitHub ExoPlayer.