Zarządzanie prawami cyfrowymi

ExoPlayer używa interfejsu API MediaDrm na Androida do obsługi odtwarzania z zabezpieczeniem DRM. Minimalne wersje Androida wymagane przez różne obsługiwane schematy DRM, z obsługiwanymi formatami strumieniowania są opisane w ta tabela:

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).

W przypadku odtwarzania treści chronionych DRM za pomocą ExoPlayer używany jest identyfikator UUID systemu DRM. należy określić system podczas tworzenia elementu multimedialnego. właściwości. Odtwarzacz użyje tych właściwości, aby: i skonfigurować domyślną implementację interfejsu DrmSessionManager o nazwie DefaultDrmSessionManager, który sprawdzi się w większości przypadków. Do niektórych zastosowań mogą być konieczne dodatkowe właściwości DRM, jak opisano w sekcji.

Rotacja kluczy

Aby odtwarzać strumienie z rotującymi kluczami, przekaż true do MediaItem.DrmConfiguration.Builder.setMultiSession podczas tworzenia multimediów elementu.

Treść z wieloma kluczami

Treści z wieloma kluczami składają się z wielu strumieni, z których niektóre wykorzystują różne niż inne. Treści z wieloma klawiszami można odtwarzać na jeden z dwóch sposobów w zależności od na temat konfiguracji serwera licencji.

Przypadek 1. Serwer licencji odpowiada, podając wszystkie klucze treści

W takim przypadku serwer licencji jest tak skonfigurowany, że po otrzymaniu żądanie jednego klucza, odpowiada wszystkimi kluczami dla treści. To zgłoszenie obsługiwany przez ExoPlayer, bez konieczności specjalnej konfiguracji. Adaptacja między strumieniami (np. w jakości SD i HD) jest płynna, nawet jeśli używają różnych klawiszy.

W miarę możliwości zalecamy skonfigurowanie serwera licencji tak, aby sposób. Jest to najbardziej wydajny i niezawodny sposób obsługi odtwarzania treści, ponieważ klient nie musi wysyłać wielu próśb o licencje. aby mieć dostęp do różnych strumieni.

Przypadek 2: serwer licencji odpowiada tylko z żądanym kluczem

W takiej sytuacji serwer licencji jest skonfigurowany tak, aby odpowiadać tylko przy użyciu klucza określone w żądaniu. Treści z wieloma kluczami mogą być odtwarzane w ramach tej licencji konfiguracji serwera, przekazując parametr true do MediaItem.DrmConfiguration.Builder.setMultiSession podczas tworzenia multimediów elementu.

Nie zalecamy konfigurowania serwera licencji w taki sposób. it wymaga dodatkowych żądań licencji do odtwarzania treści z wieloma kluczami, co oznacza mniej wydajne i niezawodne niż opisana powyż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żliwia to odtwarzanie przy użyciu klawiszy zapisanych w kluczu offline ustawionym za pomocą atrybutu określony identyfikator.

Sesje DRM w przypadku czyszczenia treści

Użycie obiektu zastępczego DrmSessions umożliwia usłudze ExoPlayer używanie tych samych dekoderów w przypadku: czyść treści używane podczas odtwarzania zaszyfrowanych treści. Gdy multimedia zawierają sekcji zarówno uporządkowanych, jak i zaszyfrowanych, możesz użyć obiektu zastępczego DrmSessions. aby uniknąć ponownego tworzenia dekoderów przy przejściu między trybem czystym a zaszyfrowanym . Użycie obiektu zastępczego DrmSessions na ścieżce audio i wideo może można włączyć, przekazując true do MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks, gdy podczas tworzenia elementu multimedialnego.

Korzystanie z niestandardowego obiektu DrmSessionManager

Jeśli aplikacja chce dostosować element DrmSessionManager używany do odtwarzania, może zaimplementuj DrmSessionManagerProvider i przekaż go do MediaSource.Factory, używana przy tworzeniu odtwarzacza. Usługodawca może wybierz, czy za każdym razem będziesz tworzyć nową instancję menedżera. Aby zawsze użyj 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 obraz się zacina podczas odtwarzania treści z zabezpieczeniami DRM na urządzeniu na urządzeniach z dowolną wersją Androida – od Androida 6.0 (poziom interfejsu API 23) do w tym w Androidzie 11 (poziom interfejsu API 30), spróbuj włączyć bufor asynchroniczny .