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.