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 destekledikleri 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)
DeleteKey "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 bir medya öğesi oluştururken DRM sisteminin UUID'si belirtilmelidir. Ayrıca, diğer özellikler de sağlanabilir. Daha sonra oynatıcı, bu özellikleri kullanarak çoğu kullanım alanına uygun olan varsayılan DrmSessionManager uygulamasını (DefaultDrmSessionManager) oluşturur. Bazı kullanım durumlarında, aşağıdaki bölümlerde özetlendiği şekilde ek DRM özellikleri gerekebilir.

Anahtar rotasyonu

Akışları dönüşümlü anahtarlarla oynatmak için medya öğesini oluştururken true öğesini MediaItem.DrmConfiguration.Builder.setMultiSession öğesine geçirin.

Çok önemli içerik

Çok anahtarlı içerik, birden çok yayından oluşur. Bu yayınlarda bazı yayınlar diğerlerinden farklı anahtarlar kullanır. Çok anahtarlı içerik, lisans sunucusunun nasıl yapılandırıldığına bağlı olarak iki yöntemden biriyle oynatılabilir.

Durum 1: Lisans sunucusu, içeriğin tüm anahtarlarıyla yanıt veriyor

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ı tuşlar kullanılsa bile akışlar arasında (ör. SD ve HD video) uyum sağlama sorunsuz bir şekilde gerçekleşir.

Mümkün olduğunda lisans sunucunuzu bu şekilde davranacak şekilde yapılandırmanızı öneririz. İstemcinin farklı akışlara erişmek için birden fazla lisans isteğinde bulunmasını gerektirmediğinden, çok noktalı içeriklerin oynatılmasını destekleyen en verimli ve sağlam yöntemdir.

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. Medya öğesi oluşturulurken true, MediaItem.DrmConfiguration.Builder.setMultiSession adresine geçirilerek bu lisans sunucusu yapılandırmasıyla çok anahtarlı içerik oynatılabilir.

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

Çevrimdışı anahtarlar

Medya öğesi oluşturulurken anahtar grubu kimliği MediaItem.DrmConfiguration.Builder.setKeySetId öğesine geçirilerek çevrimdışı anahtar grubu yüklenebilir. Bu şekilde, belirtilen kimlikle ayarlanmış çevrimdışı anahtarda depolanan anahtarlar kullanılarak oynatmaya izin verilir.

Net içerikler için DRM oturumları

DrmSessions yer tutucusunun kullanılması, ExoPlayer ürününün net içerik için şifrelenmiş içerik oynatırken kullanılan kod çözücüleri kullanmasını sağlar. Medya hem açık hem de şifrelenmiş bölümler içerdiğinde açık ve şifrelenmiş bölümler arasında geçişler gerçekleştiğinde kod çözücülerin yeniden oluşturulmasını önlemek için DrmSessions yer tutucusunu kullanmak isteyebilirsiniz. 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 bir DrmSessionManager kullanma

Bir uygulama, oynatma için kullanılan DrmSessionManager öğesini özelleştirmek isterse bir DrmSessionManagerProvider uygulayabilir ve bunu, oynatıcıyı oluştururken kullanılan bir 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) dahil olmak üzere herhangi bir Android sürümünü çalıştıran bir cihazda DRM korumalı içerik oynatırken takılma yaşıyorsanız eşzamansız arabellek sıralamayı etkinleştirmeyi deneyebilirsiniz.