Dijital hak yönetimi

ExoPlayer, DRM korumalı oynatmayı desteklemek için Android'in MediaDrm API'sini kullanır. Desteklenen farklı DRM şemaları için gereken minimum Android sürümleri ve desteklendikleri akış biçimleri aşağıdaki tabloda açıklanmıştır:

DRM şeması Android sürüm numarası Android API düzeyi Desteklenen biçimler
Widevine "cenc" 4.4 19 DASH, HLS (yalnızca FMP4)
Widevine "cbcs" 7.1 25 DASH, HLS (yalnızca FMP4)
"cenc" İçin Temizleme Anahtarı 5,0 21 KONTROL
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (yalnızca FMP4)

DRM korumalı içeriği ExoPlayer ile oynatmak için bir medya öğesi oluştururken DRM sisteminin UUID'si ve lisans sunucusu URI'si belirtilmelidir. Daha sonra oynatıcı, bu özellikleri kullanarak çoğu kullanım alanına uygun olan varsayılan DrmSessionManager uygulamasını (DefaultDrmSessionManager adı verilen) oluşturur. Bazı kullanım durumlarında, aşağıdaki bölümlerde ana hatlarıyla açıklandığı gibi ek DRM özellikleri gerekebilir.

Anahtar rotasyonu

Akışları döndürme tuşlarla oynatmak için medya öğesini oluştururken true öğesini MediaItem.DrmConfiguration.Builder.setMultiSession öğesine geçirin.

Çok anahtarlı içerik

Çok anahtarlı içerikler, bazı akışların diğerlerinden farklı anahtarlar kullandığı birden çok akıştan oluşur. Çok anahtarlı içerikler, lisans sunucusunun nasıl yapılandırıldığına bağlı olarak iki yöntemden biriyle oynatılabilir.

1. Durum: Lisans sunucusu içeriğe ilişkin tüm anahtarlarla yanıt verir

Bu durumda lisans sunucusu, bir anahtar isteği aldığında içeriğin tüm anahtarlarıyla yanıt verecek şekilde yapılandırılır. Bu destek kaydı, herhangi bir özel yapılandırmaya gerek kalmadan ExoPlayer tarafından yönetilir. Farklı anahtarlar kullansalar bile yayınlar (ör. SD ve HD video) arasındaki uyum sorunsuz olur.

Mümkün olduğunda, lisans sunucunuzu bu şekilde çalışacak şekilde yapılandırmanızı öneririz. Bu, istemcinin farklı akışlara erişmek için birden fazla lisans isteğinde bulunmasını gerektirmediğinden, çok anahtarlı içeriklerin oynatılmasını desteklemenin en verimli ve sağlam yoludur.

2. Durum: Lisans sunucusu yalnızca istenen anahtarla yanıt veriyor

Bu durumda lisans sunucusu yalnızca istekte belirtilen anahtarla yanıt verecek şekilde yapılandırılır. Çok anahtarlı içerik, medya öğesi oluşturulurken true öğesine MediaItem.DrmConfiguration.Builder.setMultiSession geçirilerek bu lisans sunucusu yapılandırmasıyla oynatılabilir.

Lisans sunucunuzu bu şekilde çalışacak şekilde yapılandırmanızı önermiyoruz. Çok anahtarlı içerikleri oynatmak için ek lisans istekleri gerekir. Bu da yukarıda açıklanan alternatife göre daha az verimli ve dayanıklıdır.

Çevrimdışı anahtarlar

Çevrimdışı anahtar grubu, medya öğesi oluşturulurken anahtar grubu kimliği MediaItem.DrmConfiguration.Builder.setKeySetId öğesine geçirilerek yüklenebilir. Bu şekilde, belirtilen kimlikle ayarlanmış çevrimdışı anahtarda depolanan anahtarlar kullanılarak oynatma yapılabilir.

Net içerik için DRM oturumları

DrmSessions yer tutucusunun kullanılması, ExoPlayer ürününün, şifrelenmiş içerikleri oynatırken kullanılan kod çözücüleri temiz içerik için kullanmasına olanak tanır. Medya hem açık hem de şifrelenmiş bölümler içeriyorsa açık ve şifrelenmiş bölümler arasında geçiş yapıldığında kod çözücülerin yeniden oluşturulmasını önlemek için DrmSessions yer tutucusunu kullanabilirsiniz. Ses ve video parçaları için DrmSessions yer tutucusunun kullanımı, medya öğesi oluşturulurken true öğesine MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks geçirilerek etkinleştirilebilir.

Özel bir DrmSessionManager kullanma

Bir uygulama, oynatma için kullanılan DrmSessionManager öğesini özelleştirmek isterse bir DrmSessionManagerProvider uygulayıp bunu, oynatıcıyı oluştururken kullanılan MediaSource.Factory öğesine aktarabilir. Sağlayıcı, her seferinde yeni bir yönetici örneği gösterip göstermeyeceğini seçebilir. Her zaman aynı örneği kullanmak için:

Kotlin

val customDrmSessionManager: DrmSessionManager = CustomDrmSessionManager()
// Pass a drm session manager provider to the media source factory.
val mediaSourceFactory =
  DefaultMediaSourceFactory(context).setDrmSessionManagerProvider { customDrmSessionManager }

Java

DrmSessionManager customDrmSessionManager = new CustomDrmSessionManager(/* ... */ );
// Pass a drm session manager provider to the media source factory.
MediaSource.Factory mediaSourceFactory =
    new DefaultMediaSourceFactory(context)
        .setDrmSessionManagerProvider(mediaItem -> customDrmSessionManager);

Oynatma performansını iyileştirme

Android 6.0 (API düzeyi 23) ile Android 11 (API düzeyi 30) arasındaki herhangi bir Android sürümünü çalıştıran bir cihazda DRM korumalı içeriği oynatırken videoda takılma yaşıyorsanız eşzamansız arabellek sıralamayı etkinleştirmeyi deneyebilirsiniz.