Zarządzanie prawami cyfrowymi

ExoPlayer korzysta z interfejsu API MediaDrm Androida do obsługi odtwarzania z zabezpieczeniem DRM. Minimalne wersje Androida wymagane w przypadku różnych obsługiwanych schematów DRM, a także obsługiwane formaty strumieniowania, zostały opisane w tej tabeli:

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 przez DRM za pomocą ExoPlayer, podczas tworzenia elementu multimedialnego musisz określić identyfikator UUID systemu DRM i identyfikator URI serwera licencji. Odtwarzacz wykorzysta te właściwości do utworzenia domyślnej implementacji DrmSessionManager o nazwie DefaultDrmSessionManager, która jest odpowiednia do większości zastosowań. W niektórych przypadkach mogą być potrzebne dodatkowe właściwości DRM. Opisaliśmy je w sekcjach poniżej.

Rotacja kluczy

Aby odtwarzać strumienie z obracającymi się 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, przy czym niektóre z nich używają innych kluczy niż inne. W zależności od konfiguracji serwera licencji treści z wieloma kluczami mogą być odtwarzane na 2 sposoby.

Przypadek 1. Serwer licencji wysyła w odpowiedzi wszystkie klucze dotyczące treści.

W tym przypadku serwer licencji jest skonfigurowany tak, że po otrzymaniu żądania dotyczącego jednego klucza odpowiada on, używając wszystkich kluczy dotyczących treści. To zgłoszenie obsługuje ExoPlayer bez konieczności specjalnej konfiguracji. Dostosowanie się między strumieniami (np. w formacie SD i HD) jest płynne, nawet jeśli używają różnych kluczy.

Jeśli to możliwe, zalecamy skonfigurowanie serwera licencji w taki sposób. To najskuteczniejszy i najbardziej niezawodny sposób odtwarzania treści z wieloma kluczami, ponieważ nie wymaga od klienta wysyłania wielu żądań licencji, aby uzyskać dostęp do różnych strumieni.

Przypadek 2. Serwer licencji odpowiada tylko z żądanym kluczem

W tym przypadku serwer licencji jest skonfigurowany tak, aby odpowiadał tylko przy użyciu klucza określonego w żądaniu. Zawartość 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 takiego konfigurowania serwera licencji. Wymaga dodatkowych próśb o licencję na odtwarzanie treści z wieloma kluczami, co jest mniej efektywne i skuteczne niż opisana wyżej alternatywa.

Klucze offline

Zestaw kluczy offline można wczytać, przekazując identyfikator zestawu kluczy do MediaItem.DrmConfiguration.Builder.setKeySetId podczas tworzenia elementu multimedialnego. Umożliwi to odtwarzanie przy użyciu klawiszy zapisanych w klawiszu offline z określonym identyfikatorem.

Sesje DRM w przypadku wyraźnych treści

Użycie symbolu zastępczego DrmSessions umożliwia ExoPlayer korzystanie z tych samych dekoderów, które są używane do odtwarzania zaszyfrowanych treści, do uzyskiwania wyraźnych treści. Jeśli multimedia zawierają zarówno sekcje przejrzyste, jak i zaszyfrowane, możesz użyć obiektu zastępczego DrmSessions, aby uniknąć ponownego tworzenia dekoderów w przypadku przejścia między sekcjami przejrzystymi a zaszyfrowanymi. Użycie obiektu zastępczego DrmSessions na potrzeby ścieżek audio i wideo można włączyć, przekazując klucz true do MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks podczas tworzenia elementu multimedialnego.

Używanie niestandardowego parametru DrmSessionManager

Jeśli aplikacja chce dostosować parametr DrmSessionManager używany do odtwarzania, może zaimplementować obiekt DrmSessionManagerProvider i przekazać go do funkcji MediaSource.Factory, która jest używana podczas tworzenia odtwarzacza. Dostawca może zdecydować, czy za każdym razem 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);

Poprawa wydajności odtwarzania

Jeśli filmy się zacinają podczas odtwarzania treści chronionych DRM na urządzeniu z Androidem w wersji od 6.0 (poziom interfejsu API 23) do 11 (poziom interfejsu API 30) włącznie, możesz spróbować włączyć asynchroniczne kolejki buforowanie.