Android 8.0 (API düzeyi 26) sürümünden itibaren MediaPlayer, DRM korumalı materyallerin oynatılmasını destekleyen API'ler içerir. MediaPlayer DRM API'leri, MediaDrm tarafından sağlanan düşük seviyeli API'ye benzer ancak daha yüksek bir seviyede çalışır ve temel ayıklayıcı, DRM ve şifreleme nesnelerini kullanıma sunmaz.
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 ile korunan yerel medya dosyaları
- Widevine ile korunan uzaktan veya akışla aktarılan medya dosyaları
Aşağıdaki kod snippet'inde, yeni DRM MediaPlayer yöntemlerinin senkron bir uygulamada nasıl kullanılacağı gösterilmektedir.
DRM kontrollü medyayı yönetmek için bu örnekte gösterildiği gibi, yeni yöntemleri MediaPlayer çağrılarının normal akışıyla birlikte 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();
Başlamak için MediaPlayer nesnesini başlatın ve kaynağını her zamanki gibi setDataSource() kullanarak ayarlayın. Ardından DRM'yi kullanmak için şu adımları uygulayın:
- Uygulamanızın özel yapılandırma yapmasını istiyorsanız bir
OnDrmConfigHelperarayü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, boş olmayan birMediaPlayer.DrmInfodeğeri döndürür.
MediaPlayer.DrmInfo varsa:
- Kullanılabilir UUID'lerin haritasını inceleyin ve birini seçin.
prepareDrm()işlevini çağırarak mevcut kaynak için DRM yapılandırmasını hazırlayın.- Bir
OnDrmConfigHelpergeri çağırma işlevi oluşturup kaydettiysenizprepareDrm()yürütülürken bu işlev çağrılır. Bu sayede, DRM oturumunu açmadan önce DRM özelliklerinin özel yapılandırmasını yapabilirsiniz. Geri çağırma,prepareDrm()işlevini çağıran iş parçacığında senkron olarak çağrılır. DRM özelliklerine erişmek içingetDrmPropertyString()vesetDrmPropertyString()numaralarını arayın. Uzun süren işlemler yapmaktan kaçının. - Cihazın temel hazırlığı henüz yapılmadıysa
prepareDrm(), cihazın temel hazırlığını yapmak için temel hazırlık sunucusuna da erişir. Bu işlem, ağ bağlantısına bağlı olarak değişken bir süre alabilir.
- Bir
- Lisans sunucusuna gönderilecek opak anahtar isteği bayt dizisini 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ışı anahtar isteği içinse sonuç, anahtar grubu tanımlayıcısıdır. Anahtarları yeni bir oturuma geri yüklemek için bu anahtar grubu tanımlayıcısını
restoreKeys()ile birlikte kullanabilirsiniz. - Yanıt, yayın veya yayın isteğiyle ilgiliyse sonuç boş olur.
- Yanıt, çevrimdışı anahtar isteği içinse sonuç, anahtar grubu tanımlayıcısıdır. 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ı şekilde çalışır ve hazırlık tamamlanana kadar engellenir. Ancak yeni bir cihazda ilk DRM hazırlığı da prepareDrm() tarafından dahili olarak işlenen ve ağ işlemi nedeniyle tamamlanması biraz zaman alabilen sağlama gerektirebilir. prepareDrm() üzerinde engellenmeyi önlemek için MediaPlayer.OnDrmPreparedListener tanımlayıp ayarlayabilirsiniz.
OnDrmPreparedListener ayarlayın. prepareDrm(), arka planda sağlama (gerekirse) ve hazırlama işlemlerini gerçekleştirir. Sağlama ve hazırlık tamamlandığında sistem, dinleyiciyi arar. İşleyiciyi işleyici iş parçacığıyla kaydetmediğiniz sürece, işleyicinin çalıştığı iş parçacığı veya arama sırası hakkında herhangi bir varsayımda bulunmayın. Sistem, prepareDrm() döndürülmeden ö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 oluşturup kaydederek DRM'yi eşzamansız olarak başlatabilirsiniz. Aşağıdaki örnekte gösterildiği gibi prepareAsync() ile birlikte çalışır:
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 Common Encryption Scheme (CENC) ve HLS örnek düzeyinde şifrelenmiş medyayı (METHOD=SAMPLE-AES) deşifre edebilir. Tam segment şifrelenmiş medya (METHOD=AES-128) daha önce destekleniyordu.
Daha fazla bilgi
Jetpack Media3, uygulamanızda medya oynatma için önerilen çözümdür. Daha fazla bilgi edinin.
Bu sayfalarda ses ve video kaydetme, depolama ve oynatma ile ilgili konular ele alınır: