Dimulai 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 serta tidak menampilkan objek kripto, DRM, dan ekstraktor yang mendasarinya.
Meskipun tidak menyediakan fungsionalitas penuh
MediaDrm, API DRM MediaPlayer ini 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 MediaPlayer DRM 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 seperti biasa dengan menginisialisasi objek MediaPlayer dan menentukan sumbernya menggunakan
setDataSource(). Kemudian, untuk menggunakan DRM, lakukan langkah-langkah berikut:
- Jika ingin aplikasi Anda melakukan konfigurasi kustom, tentukan antarmuka
OnDrmConfigHelper, lalu lampirkan ke pemutar menggunakansetOnDrmConfigHelper(). - Panggil
prepare(). - Panggil
getDrmInfo(). Jika sumbernya memiliki konten DRM, metode tersebut akan mengembalikan nilaiMediaPlayer.DrmInfonon-null.
Jika MediaPlayer.DrmInfo ada:
- Periksa peta UUID yang tersedia dan pilih salah satunya.
- Persiapkan konfigurasi DRM untuk sumber saat ini dengan memanggil
prepareDrm().- Jika Anda membuat dan mendaftarkan callback
OnDrmConfigHelper, callback tersebut akan dipanggil saatprepareDrm()dieksekusi. Hal ini memungkinkan Anda melakukan konfigurasi kustom properti DRM sebelum membuka sesi DRM. Callback ini dipanggil secara tersinkron dalam thread yang memanggilprepareDrm(). Untuk mengakses properti DRM, panggilgetDrmPropertyString()dansetDrmPropertyString(). Jangan melakukan operasi yang panjang. - Jika perangkat belum disiapkan,
prepareDrm()juga mengakses server penyediaan untuk menyediakan perangkat. Penyelesaian tindakan ini dapat memakan waktu yang bervariasi, bergantung pada konektivitas jaringan.
- Jika Anda membuat dan mendaftarkan callback
- Untuk mendapatkan array byte permintaan kunci opaque yang akan dikirim ke server lisensi, panggil
getKeyRequest(). - 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 rangkaian kunci ini dengan
restoreKeys()untuk memulihkan kunci ke sesi baru. - Jika respons ditujukan untuk permintaan streaming atau rilis, hasilnya adalah null.
- Jika respons ditujukan untuk permintaan kunci offline, hasilnya akan berupa ID rangkaian kunci Anda dapat menggunakan ID rangkaian kunci ini dengan
Menyiapkan DRM secara asinkron
Secara default, prepareDrm() berjalan secara tersinkron, yang melakukan pemblokiran hingga persiapan
selesai. Namun, persiapan DRM pada kali pertama di perangkat baru juga mungkin
memerlukan penyediaan, yang prepareDrm() ditangani secara internal, 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 perlu) dan persiapan di latar belakang. Setelah penyediaan dan persiapan selesai, sistem akan memanggil pemroses. Jangan berasumsi apa pun tentang urutan pemanggilan atau thread yang menjadi tempat pemroses berjalan (kecuali jika Anda mendaftarkan pemroses dengan thread pengendali). Sistem dapat memanggil
pemroses sebelum atau setelah prepareDrm() kembali.
Menyiapkan DRM secara asinkron
Anda dapat menginisialisasi DRM secara asinkron dengan membuat dan mendaftarkan
MediaPlayer.OnDrmInfoListener untuk persiapan DRM dan
MediaPlayer.OnDrmPreparedListener untuk memulai pemutar. Keduanya bekerja sama 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 yang dienkripsi
Dimulai 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. Sebelumnya, media terenkripsi segmen penuh (METHOD=AES-128) didukung.
Pelajari lebih lanjut
Jetpack Media3 adalah solusi yang direkomendasikan untuk pemutaran media di aplikasi Anda. Baca selengkapnya.
Halaman ini membahas topik yang berkaitan dengan perekaman, penyimpanan, dan pemutaran kembali audio dan video: