Zarządzanie prawami cyfrowymi

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 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ą ExoPlayera, musisz podać 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 obsługuje odtwarzanie bez konieczności specjalnej konfiguracji. Przełączanie między strumieniami (np. wideo SD i wideo HD) jest płynne, nawet jeśli używają one różnych kluczy.

Zalecamy skonfigurowanie serwera licencji w taki sposób, o ile jest to możliwe. 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 wartość true do parametru MediaItem.DrmConfiguration.Builder.setMultiSession podczas tworzenia elementu multimedialnego.

Nie zalecamy konfigurowania serwera licencji w ten sposób. Wymaga to dodatkowych próśb o licencję na odtwarzanie treści z wieloma kluczami, co jest mniej wydajne i solidne niż opisana wcześniej 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 odtwarzania 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ć DrmSessionManagerProvider i przekazać go do 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 przeskoki obrazu, możesz spróbować włączyć asynchroniczne kolejkowanie bufora.