ExoPlayer korzysta z interfejsu MediaDrm API Androida, aby obsługiwać odtwarzanie treści chronionych przez DRM.
Minimalne wersje Androida wymagane w przypadku różnych obsługiwanych schematów DRM oraz formaty przesyłania strumieniowego, w przypadku których są one obsługiwane, opisano 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 określić identyfikator UUID systemu DRM podczas tworzenia elementu multimedialnego. Możesz też podać inne właściwości. Odtwarzacz użyje tych właściwości do utworzenia domyślnej implementacji interfejsu DrmSessionManager o nazwie DefaultDrmSessionManager, która jest odpowiednia w większości przypadków. W niektórych przypadkach użycia mogą być potrzebne dodatkowe właściwości DRM, jak opisano w kolejnych sekcjach.
Rotacja kluczy
Aby odtwarzać strumienie z rotacyjnymi kluczami, podczas tworzenia elementu multimedialnego przekaż wartość true do parametru 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ż pozostałe. Treści z wieloma kluczami można odtwarzać na 2 sposoby w zależności od konfiguracji serwera licencji.
Przypadek 1. Serwer licencji odpowiada wszystkimi kluczami do treści
W tym przypadku serwer licencji jest skonfigurowany tak, że gdy otrzyma żądanie jednego klucza, odpowiada wszystkimi kluczami do treści. W tym przypadku ExoPlayer nie wymaga specjalnej konfiguracji. Dostosowywanie się między strumieniami (np. wideo SD i HD) jest płynne, nawet jeśli używają one różnych kluczy.
Zalecamy skonfigurowanie serwera licencji w taki sposób, aby w miarę możliwości działał w ten sposób. Jest to najbardziej wydajny i niezawodny sposób obsługi odtwarzania treści z wieloma kluczami, ponieważ nie wymaga od klienta wysyłania wielu żądań licencji w celu uzyskania dostępu do różnych strumieni.
Przypadek 2. Serwer licencji odpowiada tylko żą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ć za pomocą tej konfiguracji serwera licencji, przekazując true do MediaItem.DrmConfiguration.Builder.setMultiSession podczas tworzenia elementu multimedialnego.
Nie zalecamy konfigurowania serwera licencji w ten sposób. Wymaga to dodatkowych żądań licencji na odtwarzanie treści z wieloma kluczami, co jest mniej wydajne i stabilne niż opisana powyżej alternatywa.
Klucze offline
Zestaw kluczy offline można wczytać, przekazując identyfikator zestawu kluczy do metody MediaItem.DrmConfiguration.Builder.setKeySetId podczas tworzenia elementu multimedialnego.
Umożliwia to odtwarzanie przy użyciu kluczy przechowywanych w zestawie kluczy offline o określonym identyfikatorze.
Sesje DRM dla treści bez zabezpieczeń
Użycie symbolu zastępczego DrmSessions umożliwia ExoPlayer korzystanie z tych samych dekoderów w przypadku treści niezaszyfrowanych, co w przypadku treści zaszyfrowanych. Jeśli multimedia zawierają zarówno niezaszyfrowane, jak i zaszyfrowane sekcje, możesz użyć symbolu zastępczego DrmSessions, aby uniknąć ponownego tworzenia dekoderów podczas przejść między sekcjami niezaszyfrowanymi i zaszyfrowanymi. Użycie symbolu zastępczego DrmSessions w przypadku ścieżek audio i wideo można włączyć, przekazując wartość true do parametru MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks podczas tworzenia elementu multimedialnego.
Korzystanie z niestandardowego menedżera DrmSessionManager
Jeśli aplikacja chce dostosować element DrmSessionManager używany do odtwarzania, może zaimplementować element DrmSessionManagerProvider i przekazać go do elementu MediaSource.Factory, który jest używany podczas tworzenia odtwarzacza. Dostawca może zdecydować, czy przy każdym wywołaniu ma być tworzona nowa instancja 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);
Poprawa wydajności odtwarzania
Jeśli podczas odtwarzania treści chronionych DRM na urządzeniu z Androidem 6.0 (poziom interfejsu API 23) lub nowszym, w tym z Androidem 11 (poziom interfejsu API 30), występuje zacinanie się obrazu, możesz spróbować włączyć asynchroniczne kolejkowanie bufora.