Digitale Rechteverwaltung

ExoPlayer verwendet die MediaDrm API von Android, um die DRM-geschützte Wiedergabe zu unterstützen. Die für die verschiedenen unterstützten DRM-Schemas erforderlichen Mindestversionen von Android sowie die jeweils unterstützten Streamingformate sind in der folgenden Tabelle beschrieben:

DRM-Schema Android-Versionsnummer Android-API-Level Unterstützte Formate
Widevine „cenc“ 4,4 19 DASH, HLS (nur FMP4)
Widevine „cbcs“ 7.1 25 DASH, HLS (nur FMP4)
ClearKey „cenc“ 5 21 DASHBOARD
PlayReady SL2000 „cenc“ Android TV Android TV DASH, SmoothStreaming, HLS (nur FMP4)

Zum Abspielen von DRM-geschützten Inhalten mit ExoPlayer sollten die UUID des DRM-Systems und der URI des Lizenzservers angegeben werden, beim Erstellen eines Medienelements. Der Player verwendet diese Attribute dann, um eine Standardimplementierung von DrmSessionManager namens DefaultDrmSessionManager zu erstellen, die für die meisten Anwendungsfälle geeignet ist. Für einige Anwendungsfälle sind möglicherweise zusätzliche DRM-Eigenschaften erforderlich, wie in den folgenden Abschnitten beschrieben.

Schlüsselrotation

Wenn Sie Streams mit rotierenden Schlüsseln abspielen möchten, übergeben Sie beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.setMultiSession.

Multi-Key-Inhalte

Inhalte mit mehreren Schlüsseln bestehen aus mehreren Streams, wobei einige Streams andere Schlüssel verwenden als andere. Es gibt zwei Möglichkeiten, Inhalte mit mehreren Schlüsseln abzuspielen, je nachdem, wie der Lizenzserver konfiguriert ist.

Fall 1: Der Lizenzserver antwortet mit allen Schlüsseln für den Inhalt

In diesem Fall ist der Lizenzserver so konfiguriert, dass er mit allen Schlüsseln für den Inhalt antwortet, wenn er eine Anfrage für einen Schlüssel erhält. Dieser Fall wird von ExoPlayer verarbeitet, ohne dass eine spezielle Konfiguration erforderlich ist. Die Anpassung zwischen Streams (z.B. SD- und HD-Video) ist nahtlos, auch wenn sie unterschiedliche Schlüssel verwenden.

Wir empfehlen, den Lizenzserver nach Möglichkeit so zu konfigurieren, dass er sich so verhält. Dies ist die effizienteste und zuverlässigste Methode, um die Wiedergabe von Multikey-Inhalten zu unterstützen, da der Client nicht mehrere Lizenzanfragen stellen muss, um auf die verschiedenen Streams zuzugreifen.

Fall 2: Lizenzserver antwortet nur mit dem angeforderten Schlüssel

In diesem Fall ist der Lizenzserver so konfiguriert, dass er nur mit dem in der Anfrage angegebenen Schlüssel antwortet. Mit dieser Lizenzserverkonfiguration können Inhalte mit mehreren Schlüsseln abgespielt werden. Dazu übergeben Sie beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.setMultiSession.

Wir raten davon ab, Ihren Lizenzserver für dieses Verhalten zu konfigurieren. Für die Wiedergabe von Inhalten mit mehreren Schlüsseln sind zusätzliche Lizenzanfragen erforderlich, was weniger effizient und robust ist als die oben beschriebene Alternative.

Offlineschlüssel

Ein Offlineschlüsselsatz kann geladen werden, indem beim Erstellen des Medienelements die Schlüsselsatz-ID an MediaItem.DrmConfiguration.Builder.setKeySetId übergeben wird. Dadurch wird die Wiedergabe mit den Schlüsseln ermöglicht, die im Offlineschlüsselsatz mit der angegebenen ID gespeichert sind.

DRM-Sitzungen für klare Inhalte

Die Verwendung des Platzhalters DrmSessions ermöglicht es ExoPlayer, dieselben Decodierer für lösbare Inhalte zu verwenden, die auch bei der Wiedergabe verschlüsselter Inhalte verwendet werden. Wenn Medien sowohl klare als auch verschlüsselte Bereiche enthalten, sollten Sie den Platzhalter DrmSessions verwenden, um zu vermeiden, dass Decodierer neu erstellt werden, wenn zwischen freien und verschlüsselten Bereichen gewechselt wird. Die Verwendung des Platzhalters DrmSessions für Audio- und Videotracks kann aktiviert werden, indem beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks übergeben wird.

Einen benutzerdefinierten DrmSessionManager verwenden

Wenn eine App das für die Wiedergabe verwendete DrmSessionManager anpassen möchte, kann sie ein DrmSessionManagerProvider implementieren und an das MediaSource.Factory übergeben, das beim Erstellen des Players verwendet wird. Der Anbieter kann jedes Mal entscheiden, ob eine neue Managerinstanz instanziiert werden soll oder nicht. So verwenden Sie immer dieselbe Instanz:

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

Wiedergabeleistung verbessern

Wenn beim Abspielen von DRM-geschützten Inhalten auf einem Gerät, auf dem eine Android-Version von Android 6.0 (API-Level 23) bis einschließlich Android 11 (API-Level 30) ausgeführt wird, Videoruckel auftreten, können Sie versuchen, die asynchrone Zwischenspeicherung zu aktivieren.