Zarządzanie prawami cyfrowymi

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.