Digitale Rechteverwaltung

ExoPlayer verwendet die MediaDrm API von Android, um die DRM-geschützte Wiedergabe zu unterstützen. Die für verschiedene unterstützte DRM-Schemas erforderliche Android-Mindestversionen sowie die Streamingformate, für die sie unterstützt werden, 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 DASH
PlayReady SL2000 „cenc“ Android TV Android TV DASH, SmoothStreaming, HLS (nur FMP4)

Um DRM-geschützte Inhalte mit ExoPlayer wiederzugeben, muss die UUID des DRM-Systems beim Erstellen eines Medienelements angegeben werden. Außerdem können andere Eigenschaften bereitgestellt werden. Anhand dieser Eigenschaften erstellt der Player dann eine Standardimplementierung von DrmSessionManager mit dem Namen DefaultDrmSessionManager, die für die meisten Anwendungsfälle geeignet ist. Für einige Anwendungsfälle sind möglicherweise zusätzliche DRM-Attribute erforderlich, wie in den folgenden Abschnitten beschrieben.

Schlüsselrotation

Wenn du Streams mit rotierenden Schlüsseln wiedergeben möchtest, übergib beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.setMultiSession.

Multi-Key-Inhalte

Multi-Key-Inhalte bestehen aus mehreren Streams, wobei einige Streams andere Schlüssel verwenden als andere. Inhalte mit mehreren Schlüsseln können je nach Konfiguration des Lizenzservers auf zwei Arten wiedergegeben werden.

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

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

Wenn möglich, empfehlen wir, den Lizenzserver so zu konfigurieren, dass er sich auf diese Weise verhält. Dies ist die effizienteste und robusteste Möglichkeit zur Unterstützung der Wiedergabe von Multikey-Inhalten, da der Client nicht mehrere Lizenzanfragen stellen muss, um auf die verschiedenen Streams zuzugreifen.

Fall 2: Der 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. Inhalte mit mehreren Schlüsseln können mit dieser Lizenzserverkonfiguration wiedergegeben werden. Dazu muss beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.setMultiSession übergeben werden.

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

Offlineschlüssel

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

Sitzungen zur digitalen Rechteverwaltung zur Vermeidung von klaren Inhalten

Durch die Verwendung des Platzhalters DrmSessions kann ExoPlayer dieselben Decoder zum Löschen von Inhalten verwenden, die bei der Wiedergabe verschlüsselter Inhalte verwendet werden. Wenn Medien sowohl klare als auch verschlüsselte Abschnitte enthalten, sollten Sie den Platzhalter DrmSessions verwenden, um zu verhindern, dass Decodierer neu erstellt werden, wenn Übergänge zwischen unverschlüsselten und verschlüsselten Abschnitten auftreten. Sie können die Verwendung des Platzhalters DrmSessions für Audio- und Videotracks aktivieren, indem Sie beim Erstellen des Medienelements true an MediaItem.DrmConfiguration.Builder.forceSessionsForAudioAndVideoTracks übergeben.

Benutzerdefinierten DrmSessionManager verwenden

Wenn eine App das für die Wiedergabe verwendete DrmSessionManager anpassen möchte, kann sie eine DrmSessionManagerProvider implementieren und an die MediaSource.Factory übergeben, die beim Erstellen des Players verwendet wird. Der Anbieter kann entscheiden, ob jedes Mal eine neue Managerinstanz instanziiert werden soll. 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 bei der Wiedergabe von DRM-geschützten Inhalten auf einem Gerät mit einer Android-Version von Android 6.0 (API-Level 23) bis einschließlich Android 11 (API-Level 30) Videos stocken, kannst du versuchen, die asynchrone Zwischenspeicherwarteschlange zu aktivieren.