MediaPlayer ve Dijital Hak Yönetimi (DRM) ile çalışma

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:

  1. Uygulamanızın özel yapılandırma yapmasını istiyorsanız bir OnDrmConfigHelper arayüzü tanımlayın ve setOnDrmConfigHelper() kullanarak oynatıcıya ekleyin.
  2. prepare() numaralı telefonu arayın.
  3. getDrmInfo() numaralı telefonu arayın. Kaynakta DRM içeriği varsa yöntem, null olmayan bir MediaPlayer.DrmInfo değeri döndürür.

MediaPlayer.DrmInfo varsa:

  1. Mevcut UUID'lerin haritasını inceleyin ve bir UUID seçin.
  2. 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 kaydettiyseniz prepareDrm() 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çin getDrmPropertyString() ve setDrmPropertyString() 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.
  3. Lisans sunucusuna gönderilecek opak anahtar isteği bayt dizisi almak için getKeyRequest() işlevini çağırın.
  4. 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.

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: