Menggunakan MediaPlayer dan Manajemen Hak Digital (DRM)

Mulai dari Android 8.0 (API level 26), MediaPlayer menyertakan API yang mendukung pemutaran materi yang dilindungi DRM. API DRM MediaPlayer mirip dengan API level rendah yang disediakan oleh MediaDrm, tetapi beroperasi pada level yang lebih tinggi dan tidak mengekspos objek kripto, DRM, dan ekstraktor yang mendasarinya.

Meskipun tidak menyediakan fungsionalitas penuh MediaDrm, MediaPlayer DRM API mendukung kasus penggunaan yang paling umum. Penerapan saat ini dapat menangani jenis konten berikut:

  • File media lokal yang dilindungi Widevine
  • File media jarak jauh atau streaming yang dilindungi Widevine

Cuplikan kode berikut menunjukkan cara menggunakan metode DRM MediaPlayer yang baru dalam penerapan sinkron.

Untuk mengelola media yang dikontrol DRM, Anda harus menyertakan metode baru tersebut bersama alur biasa pemanggilan MediaPlayer, seperti yang ditunjukkan dalam contoh ini:

Kotlin

mediaPlayer?.apply {
    setDataSource()
    setOnDrmConfigHelper() // optional, for custom configuration
    prepare()
    drmInfo?.also {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }

    // MediaPlayer is now ready to use
    start()
    // ...play/pause/resume...
    stop()
    releaseDrm()
}

Java

setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();

Mulailah dengan menginisialisasi objek MediaPlayer dan menetapkan sumbernya menggunakan setDataSource(), seperti biasa. Kemudian, untuk menggunakan DRM, lakukan langkah-langkah berikut:

  1. Jika ingin aplikasi Anda melakukan konfigurasi kustom, tentukan antarmuka OnDrmConfigHelper, lalu lampirkan ke pemutar menggunakan setOnDrmConfigHelper().
  2. Panggil prepare().
  3. Panggil getDrmInfo(). Jika sumbernya memiliki konten DRM, metode tersebut akan menampilkan nilai MediaPlayer.DrmInfo non-null.

Jika MediaPlayer.DrmInfo ada:

  1. Periksa peta UUID yang tersedia dan pilih salah satunya.
  2. Persiapkan konfigurasi DRM untuk sumber saat ini dengan memanggil prepareDrm().
    • Jika Anda membuat dan mendaftarkan callback OnDrmConfigHelper, callback tersebut akan dipanggil saat prepareDrm() dieksekusi. Hal ini memungkinkan Anda melakukan konfigurasi kustom properti DRM sebelum membuka sesi DRM. Callback dipanggil secara sinkron dalam thread yang memanggil prepareDrm(). Untuk mengakses properti DRM, panggil getDrmPropertyString() dan setDrmPropertyString(). Hindari melakukan operasi yang panjang.
    • Jika perangkat belum disediakan, prepareDrm() juga akan mengakses server penyediaan untuk menyediakan perangkat. Proses ini dapat memakan waktu yang bervariasi, bergantung pada konektivitas jaringan.
  3. Untuk mendapatkan array byte permintaan kunci opaque yang akan dikirim ke server lisensi, panggil getKeyRequest().
  4. Untuk memberi tahu mesin DRM tentang respons kunci yang diterima dari server lisensi, panggil provideKeyResponse(). Hasilnya bergantung pada jenis permintaan kunci:
    • Jika respons ditujukan untuk permintaan kunci offline, hasilnya akan berupa ID rangkaian kunci. Anda dapat menggunakan ID kumpulan kunci ini dengan restoreKeys() untuk memulihkan kunci ke sesi baru.
    • Jika respons ditujukan untuk permintaan streaming atau rilis, hasilnya adalah null.

Menyiapkan DRM secara asinkron

Secara default, prepareDrm() berjalan secara sinkron, yang melakukan pemblokiran hingga persiapan selesai. Namun, persiapan DRM pada kali pertama di perangkat baru juga mungkin memerlukan penyediaan, yang ditangani secara internal oleh prepareDrm(), dan mungkin memerlukan waktu lama untuk diselesaikan karena melibatkan operasi jaringan. Anda dapat menghindari pemblokiran pada prepareDrm() dengan menentukan dan menetapkan MediaPlayer.OnDrmPreparedListener.

Tetapkan OnDrmPreparedListener. prepareDrm() melakukan penyediaan (jika diperlukan) dan persiapan di latar belakang. Setelah penyediaan dan persiapan selesai, sistem akan memanggil pemroses. Jangan membuat asumsi apa pun tentang urutan pemanggilan atau thread tempat pemroses berjalan (kecuali jika Anda mendaftarkan pemroses dengan thread pengendali). Sistem dapat memanggil pemroses sebelum atau setelah prepareDrm() ditampilkan.

Menyiapkan DRM secara asinkron

Anda dapat melakukan inisialisasi DRM secara asinkron dengan membuat dan mendaftarkan MediaPlayer.OnDrmInfoListener untuk persiapan DRM dan MediaPlayer.OnDrmPreparedListener untuk memulai pemutar. Keduanya berfungsi bersama dengan prepareAsync(), seperti yang ditunjukkan dalam contoh ini:

Kotlin

setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
    mediaPlayer.apply {
        prepareDrm()
        getKeyRequest()
        provideKeyResponse()
    }
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
    mediaPlayer.start()
}

Java

setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...

// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
  prepareDrm();
  getKeyRequest();
  provideKeyResponse();
}

// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {

start();
}

Menangani media terenkripsi

Mulai dari Android 8.0 (API level 26), MediaPlayer juga dapat mendekripsi Common Encryption Scheme (CENC) dan media yang dienkripsi dengan level sampel HLS (METHOD=SAMPLE-AES) untuk jenis streaming dasar H.264, dan AAC. Media terenkripsi segmen penuh (METHOD=AES-128) sebelumnya didukung.

Pelajari lebih lanjut

Jetpack Media3 adalah solusi yang direkomendasikan untuk pemutaran media di aplikasi Anda. Baca selengkapnya tentang hal ini.

Halaman ini membahas topik yang berkaitan dengan perekaman, penyimpanan, dan pemutaran kembali audio dan video: