Dijital hak yönetimi

ExoPlayer, DRM ile korunan oynatmayı desteklemek için Android'in MediaDrm API'sini kullanır. Farklı desteklenen DRM şemaları için gereken minimum Android sürümleri ve desteklendikleri yayın 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çerikleri ExoPlayer ile oynatmak için bir medya öğesi oluştururken DRM sisteminin UUID'si belirtilmelidir. Diğer özellikler de sağlanabilir. Daha sonra oynatıcı, bu özelliklerden yararlanarak çoğu kullanım alanı için uygun olan DrmSessionManager'nın DefaultDrmSessionManager adlı varsayılan bir uygulamasını oluşturur. Bazı kullanım alanlarında, aşağıdaki bölümlerde belirtildiği gibi ek DRM özellikleri gerekebilir.

Anahtar rotasyonu

Dönen anahtarlarla yayınları oynatmak için medya öğesini oluştururken true değerini MediaItem.DrmConfiguration.Builder.setMultiSession öğesine iletin.

Çok anahtarlı içerik

Çok anahtarlı içerik, bazı yayınların diğerlerinden farklı anahtarlar kullandığı birden fazla yayından oluşur. Çok anahtarlı içerikler, lisans sunucusunun nasıl yapılandırıldığına bağlı olarak iki şekilde oynatılabilir.

1. örnek: Lisans sunucusu, içerikle ilgili tüm anahtarlarla yanıt veriyor

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 durum, özel bir yapılandırmaya gerek kalmadan ExoPlayer tarafından işlenir. Farklı anahtarlar kullanılsalar bile akışlar (ör. SD ve HD video) arasında sorunsuz bir şekilde geçiş yapılabilir.

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

2. örnek: 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çerikler, 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ı önermiyoruz. Çok anahtarlı içeriğin oynatılması için ek lisans istekleri gerekir. Bu da yukarıda açıklanan alternatiften daha az verimli ve sağlamdır.

Çevrimdışı anahtarlar

Çevrimdışı anahtar grubu, medya öğesi oluşturulurken anahtar grubu kimliği MediaItem.DrmConfiguration.Builder.setKeySetId'ya iletilerek yüklenebilir. Bu, belirtilen kimliğe sahip çevrimdışı anahtar kümesinde depolanan anahtarlar kullanılarak oynatmaya olanak tanır.

Net içerik için DRM oturumları

Yer tutucu DrmSessions kullanımı, ExoPlayer'nin şifrelenmiş içerik oynatılırken kullanılanlarla aynı kod çözücüleri kullanmasına olanak tanır. Medya hem net hem de şifrelenmiş bölümler içerdiğinde, net 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 yer tutucu DrmSessions kullanmak isteyebilirsiniz. Medya öğesi oluşturulurken DrmSessions, MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks'ye iletilerek ses ve video parçaları için yer tutucu DrmSessions kullanımı etkinleştirilebilir.true

Özel bir DrmSessionManager kullanma

Bir uygulama, oynatma için kullanılan DrmSessionManager öğesini özelleştirmek istiyorsa DrmSessionManagerProvider öğesini uygulayabilir ve bunu oynatıcı oluşturulurken kullanılan MediaSource.Factory öğesine iletebilir. Sağlayıcı, her seferinde yeni bir yönetici örneği oluşturup oluşturmayacağına karar verebilir. 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ün yüklü olduğu cihazda DRM ile korunan içerik oynatırken videoda takılma sorunu yaşıyorsanız eşzamansız arabellek kuyruğunu etkinleştirmeyi deneyebilirsiniz.