ExoPlayer używa interfejsu API MediaDrm
na Androida do obsługi odtwarzania z zabezpieczeniem DRM.
Minimalne wersje Androida wymagane w przypadku różnych obsługiwanych schematów DRM wraz z formatami strumieniowania, w przypadku których są one obsługiwane, znajdziesz w tabeli poniżej:
Schemat DRM | Numer wersji Androida | Poziom Android API | 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 DRM za pomocą ExoPlayer, należy określić identyfikator 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 interfejsu DrmSessionManager
o nazwie DefaultDrmSessionManager
, która sprawdzi się w większości przypadków. W niektórych przypadkach konieczne mogą być dodatkowe właściwości DRM, jak opisano w sekcjach poniżej.
Rotacja kluczy
Aby odtwarzać strumienie z rotującymi kluczami, podczas tworzenia elementu multimedialnego przekaż true
do MediaItem.DrmConfiguration.Builder.setMultiSession
.
Treść z wieloma kluczami
Treści z wieloma kluczami składają się z wielu strumieni, przy czym niektóre strumienie mają inne klucze. Treści z wieloma kluczami można odtwarzać na jeden z dwóch sposobów, w zależności od konfiguracji serwera licencji.
Przypadek 1. Serwer licencji odpowiada, podając wszystkie klucze treści
W tym przypadku serwer licencji jest skonfigurowany tak, że po otrzymaniu żądania jednego klucza odpowiada wszystkimi kluczami dla treści. Ten przypadek jest obsługiwany przez ExoPlayer bez konieczności konfigurowania żadnej specjalnej konfiguracji. Adaptacja między strumieniami (np. w przypadku filmów w jakości SD i HD) jest płynna, nawet jeśli używają różnych kluczy.
Gdy tylko jest to możliwe, zalecamy skonfigurowanie serwera licencji tak, aby działał w ten sposób. Jest to najskuteczniejszy i najbardziej niezawodny sposób obsługi odtwarzania treści z wieloma kluczami, ponieważ klient nie musi wysyłać wielu żądań licencji na dostęp do różnych strumieni.
Przypadek 2: serwer licencji odpowiada tylko z żądanym kluczem
W takim przypadku serwer licencji jest skonfigurowany tak, aby odpowiadać tylko przy użyciu klucza określonego w żądaniu. Treści z wieloma kluczami można odtwarzać w ramach tej konfiguracji serwera licencji, przekazując true
do MediaItem.DrmConfiguration.Builder.setMultiSession
podczas tworzenia elementu multimedialnego.
Nie zalecamy konfigurowania serwera licencji w taki sposób. Do odtwarzania treści z wieloma kluczami wymagane są dodatkowe żądania licencji, co jest mniej wydajne i solidne niż rozwiązanie opisane powyżej.
Klucze offline
Zestaw kluczy offline można wczytać, przekazując jego identyfikator jako MediaItem.DrmConfiguration.Builder.setKeySetId
podczas tworzenia elementu multimedialnego.
Umożliwia to odtwarzanie przy użyciu kluczy zapisanych w zestawie kluczy offline o określonym identyfikatorze.
Sesje DRM w przypadku czyszczenia treści
Użycie obiektu zastępczego DrmSessions
umożliwia urządzeniu ExoPlayer
korzystanie do odczytu z tych samych dekoderów, które są używane podczas odtwarzania zaszyfrowanych treści. 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 zmiennej DrmSessions
na potrzeby ścieżek audio i wideo można włączyć, przekazując true
do 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ć tę wartość do MediaSource.Factory
, która jest używana podczas tworzenia odtwarzacza. Dostawca może za każdym razem zdecydować, czy utworzyć 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 zacina się podczas odtwarzania treści chronionych DRM na urządzeniu z dowolną wersją Androida – od Androida 6.0 (poziom interfejsu API 23) do Androida 11 (poziom interfejsu API 30) włącznie, możesz włączyć funkcję kolejkowania buforów asynchronicznego.