Android 8.0 (API düzeyi 26) sürümünden itibaren MediaPlayer
, DRM korumalı materyallerin oynatılmasını destekleyen API'leri içerir. MediaPlayer DRM API'leri, MediaDrm
tarafından sağlanan düşük düzey API'ye benzer ancak daha yüksek bir düzeyde çalışır ve temel ayıklayıcı, DRM ve kripto nesnelerini göstermez.
MediaPlayer DRM API, MediaDrm
'nin tüm işlevlerini sağlamasa da en yaygın kullanım alanlarını destekler. Mevcut uygulama aşağıdaki içerik türlerini işleyebilir:
- Widevine tarafından korunan yerel medya dosyaları
- Widevine korumalı uzaktan veya akışlı medya dosyaları
Aşağıdaki kod snippet'inde, yeni DRM MediaPlayer
yöntemlerinin senkronize bir uygulamada nasıl kullanılacağı gösterilmektedir.
DRM kontrollü medyayı yönetmek için bu örnekte gösterildiği gibi, MediaPlayer çağrılarının normal akışına yeni yöntemleri eklemeniz gerekir:
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();
Her zamanki gibi MediaPlayer
nesnesini başlatarak ve kaynağını setDataSource()
kullanarak ayarlayarak başlayın. Ardından DRM'yi kullanmak için aşağıdaki adımları uygulayın:
- Uygulamanızın özel yapılandırma yapmasını istiyorsanız bir
OnDrmConfigHelper
arayüzü tanımlayın vesetOnDrmConfigHelper()
kullanarak oynatıcıya ekleyin. prepare()
numaralı telefonu arayın.getDrmInfo()
numaralı telefonu arayın. Kaynakta DRM içeriği varsa yöntem, null olmayan birMediaPlayer.DrmInfo
değeri döndürür.
MediaPlayer.DrmInfo
varsa:
- Mevcut UUID'lerin haritasını inceleyin ve bir UUID seçin.
prepareDrm()
işlevini çağırarak mevcut kaynak için DRM yapılandırmasını hazırlayın.OnDrmConfigHelper
geri çağırma işlevi oluşturduysanız ve kaydettiysenizprepareDrm()
işlevi yürütülürken çağrılır. Bu sayede, DRM oturumunu açmadan önce DRM özelliklerini özel olarak yapılandırabilirsiniz. Geri çağırma işlevi,prepareDrm()
işlevini çağıran iş parçacığında eşzamanlı olarak çağrılır. DRM özelliklerine erişmek içingetDrmPropertyString()
vesetDrmPropertyString()
işlevlerini çağırın. Uzun işlemler yapmaktan kaçının.- Cihaz henüz temel hazırlığı yapılmadıysa
prepareDrm()
, cihazın temel hazırlığını yapmak için temel hazırlama sunucusuna da erişir. Bu işlem, ağ bağlantısına bağlı olarak değişen bir süre alabilir.
- Lisans sunucusuna gönderilecek opak anahtar isteği bayt dizisi almak için
getKeyRequest()
işlevini çağırın. - DRM motorunu, lisans sunucusundan alınan anahtar yanıtı hakkında bilgilendirmek için
provideKeyResponse()
işlevini çağırın. Sonuç, anahtar isteğinin türüne bağlıdır:- Yanıt, çevrimdışı bir anahtar isteği içinse sonuç bir anahtar grubu tanımlayıcısı olur. Anahtarları yeni bir oturuma geri yüklemek için bu anahtar grubu tanımlayıcısını
restoreKeys()
ile kullanabilirsiniz. - Yanıt, yayın veya yayın isteği içinse sonuç null olur.
- Yanıt, çevrimdışı bir anahtar isteği içinse sonuç bir anahtar grubu tanımlayıcısı olur. Anahtarları yeni bir oturuma geri yüklemek için bu anahtar grubu tanımlayıcısını
DRM'yi eşzamansız olarak hazırlama
Varsayılan olarak prepareDrm()
eşzamanlı olarak çalışır ve hazırlık tamamlanana kadar engelleme yapar. Ancak yeni bir cihazda ilk DRM hazırlığı için de temel hazırlama gerekebilir. Bu işlem prepareDrm()
tarafından dahili olarak yönetilir ve ilgili ağ işlemi nedeniyle tamamlanması biraz zaman alabilir. MediaPlayer.OnDrmPreparedListener
tanımlayıp ayarlayarak prepareDrm()
'te engellemeyi önleyebilirsiniz.
Bir OnDrmPreparedListener
ayarlayın. prepareDrm()
, temel hazırlığı (gerekirse) ve hazırlığı arka planda gerçekleştirir. Hazırlama ve hazırlık tamamlandığında sistem dinleyiciyi çağırır. Çağrı sırası veya dinleyicinin çalıştığı iş parçacığı hakkında varsayımlarda bulunmayın (dinleyiciyi bir işleyici iş parçacığına kaydettirmediğiniz sürece). Sistem, prepareDrm()
döndükten önce veya sonra dinleyiciyi çağırabilir.
DRM'yi eşzamansız olarak ayarlama
DRM hazırlığı için MediaPlayer.OnDrmInfoListener
ve oynatıcıyı başlatmak için MediaPlayer.OnDrmPreparedListener
öğesini oluşturup kaydederek DRM'yi eşzamansız olarak başlatabilirsiniz. Bu örnekte gösterildiği gibi, prepareAsync()
ile birlikte çalışırlar:
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();
}
Şifrelenmiş medyayı işleme
Android 8.0 (API düzeyi 26) sürümünden itibaren MediaPlayer
, H.264 ve AAC temel akış türleri için Ortak Şifreleme Şeması'nın (CENC) ve HLS örnek düzeyinde şifrelenmiş medyanın (METHOD=SAMPLE-AES) şifresini de çözebilir. Tam segment şifrelenmiş medya (METHOD=AES-128) daha önce destekleniyordu.
Daha fazla bilgi
Uygulamanızda medya oynatma için önerilen çözüm Jetpack Media3'tür. Bu konu hakkında daha fazla bilgi edinin.
Bu sayfalarda ses ve video kaydetme, depolama ve oynatma ile ilgili konular ele alınmaktadır: