Dijital hak yönetimi

ExoPlayer, DRM korumalı oynatmayı desteklemek için Android'in MediaDrm API'sini kullanır. Farklı desteklenen DRM şemalarının gerektirdiği 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)
ClearKey "cenc" 5,0 21 DASH
PlayReady SL2000 "cenc" Android TV Android TV DASH, SmoothStreaming, HLS (yalnızca fMP4)

DRM korumalı içeriği ExoPlayer ile oynatmak için medya öğesi oluşturulurken DRM sisteminin UUID'si belirtilmelidir. Ayrıca diğer mülkler de sağlanabilir. Oynatıcı daha sonra bu özellikleri kullanarak çoğu kullanım alanına uygun DrmSessionManager için varsayılan bir uygulama (DefaultDrmSessionManager) oluşturur. Bazı kullanım alanları için aşağıdaki bölümlerde belirtildiği gibi ek DRM özellikleri gerekebilir.

Anahtar rotasyonu

Dönen tuşlarla oynatmak için medya öğesini oluştururken true değerini MediaItem.DrmConfiguration.Builder.setMultiSession değerine iletin.

Çok anahtarlıklı içerik

Çok anahtarlıklı içerik, bazı akışların diğerlerinden farklı anahtarlar kullandığı birden fazla akıştan oluşur. Çok anahtarlı içerik, lisans sunucusunun yapılandırmasına bağlı olarak iki şekilde oynatılabilir.

1. durum: Lisans sunucusu, içeriğin tüm anahtarlarıyla yanıt verir

Bu durumda lisans sunucusu, bir anahtar için istek 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 olmadan ExoPlayer tarafından yönetilir. Farklı anahtarlar kullanılsa bile farklı akışlar (ör. SD ve HD video) arasında sorunsuz geçiş yapılır.

Mümkünse lisans sunucunuzu bu şekilde davranacak şekilde yapılandırmanızı öneririz. İstemcinin farklı akışlara erişmek için birden fazla lisans isteği göndermesini gerektirmediğinden, çok anahtarlı içeriğin oynatılmasını desteklemenin en verimli ve güçlü yoludur.

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

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 parametresi MediaItem.DrmConfiguration.Builder.setMultiSession parametresine iletilerek bu lisans sunucusu yapılandırmasıyla oynatılabilir.

Lisans sunucunuzu bu şekilde davranacak şekilde yapılandırmanız önerilmez. Çok anahtarlıklı içeriği oynatmak için ek lisans istekleri gerekir. Bu, yukarıda açıklanan alternatiften daha az verimli ve güçlüdür.

Çevrimdışı anahtarlar

Çevrimdışı bir anahtar grubu, medya öğesi oluşturulurken anahtar grubu kimliği MediaItem.DrmConfiguration.Builder.setKeySetId'ye iletilerek yüklenebilir. Bu, çevrimdışı anahtar grubunda belirtilen kimlikle depolanan anahtarları kullanarak oynatmaya olanak tanır.

Net içerik için DRM oturumları

DrmSessions yer tutucusunun kullanılması, ExoPlayer'un net içerik için şifrelenmiş içerik oynatırken kullanılan kod çözücüleri kullanmasına olanak tanır. Medya hem net hem de şifrelenmiş bölümler içeriyorsa net ve şifrelenmiş bölümler arasında geçişler yapıldığında kod çözücülerin yeniden oluşturulmasını önlemek için yer tutucu DrmSessions kullanabilirsiniz. Ses ve video kanalları için DrmSessions yer tutucusunun kullanılması, medya öğesi oluşturulurken true öğesini MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks öğesine geçirerek etkinleştirilebilir.

Özel DrmSessionManager kullanma

Bir uygulama, oynatma için kullanılan DrmSessionManager öğesini özelleştirmek istiyorsa bir DrmSessionManagerProvider uygulayıp bunu oynatıcıyı oluştururken kullanılan MediaSource.Factory öğesine iletebilir. Sağlayıcı, her seferinde yeni bir yönetici örneği oluşturup oluşturmamayı 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 sürümleri çalıştıran bir cihazda DRM korumalı içerik oynatırken videoda takılma yaşıyorsanız asynchronize arabelleğe alma sırasını etkinleştirmeyi deneyebilirsiniz.