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.