Zarządzanie prawami cyfrowymi

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.