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.