ExoPlayer używa interfejsu API MediaDrm
Androida, aby obsługiwać odtwarzanie chronione przez DRM.
Minimalne wersje Androida wymagane do obsługi różnych schematów DRM oraz formaty strumieniowego przesyłania danych, w przypadku których są one obsługiwane, są opisane w tej tabeli:
Schemat DRM | Numer wersji Androida | Poziom interfejsu API Androida | Obsługiwane formaty |
---|---|---|---|
Widevine „cenc” | 4.4 | 19 | DASH, HLS (tylko FMP4) |
Widevine „cbcs” | 7.1 | 25 | DASH, HLS (tylko FMP4) |
ClearKey „cenc” | 5,0 | 21 | DASH |
PlayReady SL2000 „cenc” | Android TV | Android TV | DASH, SmoothStreaming, HLS (tylko FMP4). |
Aby odtwarzać treści chronione przez DRM za pomocą ExoPlayera, musisz podać UUID systemu DRM podczas tworzenia elementu multimedialnego. Możesz też podać inne właściwości. Następnie odtwarzacz użyje tych właściwości do utworzenia domyślnej implementacji DrmSessionManager
o nazwie DefaultDrmSessionManager
, która jest odpowiednia w większości przypadków. W niektórych przypadkach mogą być wymagane dodatkowe właściwości DRM, jak opisano w kolejnych sekcjach.
Rotacja klucza
Aby odtwarzać strumienie z rotującymi kluczami, podczas tworzenia elementu multimedialnego przekaż true
do MediaItem.DrmConfiguration.Builder.setMultiSession
.
Treści z wieloma kluczami
Treści z wieloma kluczami składają się z wielu strumieni, z których niektóre używają innych kluczy niż inne. Treści z wieloma kluczami można odtwarzać na 2 sposoby, w zależności od konfiguracji serwera licencji.
Przypadek 1. Serwer licencji odpowiada z wszystkimi kluczami do treści
W tym przypadku serwer licencji jest skonfigurowany tak, że po otrzymaniu żądania jednego klucza odpowiada wszystkimi kluczami dla treści. W tym przypadku ExoPlayer obsługuje ten format bez potrzeby specjalnej konfiguracji. Przejście między strumieniami (np. filmami w jakości SD i HD) jest płynne, nawet jeśli używają one różnych kluczy.
W miarę możliwości zalecamy skonfigurowanie serwera licencji w taki sposób. Jest to najskuteczniejszy i najbardziej niezawodny sposób obsługi odtwarzania treści z wielkimi kluczami, ponieważ nie wymaga od klienta wysyłania wielu próśb o licencję w celu uzyskania dostępu do różnych strumieni.
Przypadek 2. Serwer licencji odpowiada tylko z żądanym kluczem
W tym przypadku serwer licencji jest skonfigurowany tak, aby odpowiadać tylko kluczem określonym w żądaniu. Treści z wieloma kluczami można odtwarzać przy użyciu tej konfiguracji serwera licencji, przekazując wartość true
do wartości MediaItem.DrmConfiguration.Builder.setMultiSession
podczas tworzenia elementu multimedialnego.
Nie zalecamy konfigurowania serwera licencji w taki sposób. Wymaga to dodatkowych próśb o licencję na odtwarzanie treści z wieloma kluczami, co jest mniej wydajne i nie tak niezawodne jak opisane powyżej rozwiązanie.
Klucze offline
Aby załadować zestaw kluczy offline, podczas tworzenia elementu multimedialnego należy przekazać identyfikator zestawu kluczy do funkcji MediaItem.DrmConfiguration.Builder.setKeySetId
.
Umożliwia to odtwarzanie przy użyciu kluczy zapisanych w zestawie kluczy offline o określonym identyfikatorze.
Sesje DRM dla treści bez DRM
Użycie zastępnika DrmSessions
pozwala ExoPlayer
używać tych samych dekoderów do treści bez szyfrowania, co do odtwarzania treści zaszyfrowanych. Jeśli multimedia zawierają zarówno wyraźne, jak i zaszyfrowane sekcje, możesz używać obiektu zastępczego DrmSessions
, aby uniknąć ponownego tworzenia dekoderów przy przejściach między sekcjami niezmiennymi i zaszyfrowanymi. Użycie zastępnika DrmSessions
dla ścieżek audio i wideo można włączyć, przekazując parametr true
do funkcji MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks
podczas tworzenia elementu multimedialnego.
Korzystanie z niestandardowego obiektu DrmSessionManager
Jeśli aplikacja chce dostosować DrmSessionManager
używany do odtwarzania, może zaimplementować DrmSessionManagerProvider
i przekazać go do MediaSource.Factory
, który jest używany podczas tworzenia odtwarzacza. Dostawca może zdecydować, czy za każdym razem ma tworzyć nową instancję menedżera. Aby zawsze używać tej samej instancji:
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);
Poprawianie wydajności odtwarzania
Jeśli podczas odtwarzania treści chronionych przez DRM na urządzeniu z Androidem 6.0 (poziom interfejsu API 23) lub nowszym (w tym Android 11, poziom interfejsu API 30) występują problemy z zacinaniem się filmu, możesz spróbować włączyć asynchroniczne kolejkowanie buforów.