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.