ExoPlayer verwendet die MediaDrm
API von Android, um die DRM-geschützte Wiedergabe zu unterstützen.
Die für die verschiedenen unterstützten digitalen Rechteverwaltungsschemata erforderlichen Mindestversionen von Android sowie die unterstützten Streamingformate sind in der folgenden Tabelle aufgeführt:
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) |
Damit mit ExoPlayer DRM-geschützte Inhalte wiedergegeben werden können, muss die UUID des DRM-Systems beim Erstellen eines Medienelements angegeben werden. Es können auch andere Properties angegeben werden. Der Player verwendet diese Eigenschaften dann, um eine Standardimplementierung von DrmSessionManager
mit dem Namen DefaultDrmSessionManager
zu erstellen, die für die meisten Anwendungsfälle geeignet ist. Für einige Anwendungsfälle sind möglicherweise zusätzliche DRM-Properties erforderlich, wie in den folgenden Abschnitten beschrieben.
Schlüsselrotation
Wenn du Streams mit rotierenden Schlüsseln abspielen möchtest, übergebe beim Erstellen des Medienelements true
an MediaItem.DrmConfiguration.Builder.setMultiSession
.
Inhalte mit mehreren Schlüsseln
Inhalte mit mehreren Schlüsseln bestehen aus mehreren Streams, bei denen einige Streams andere Schlüssel als andere verwenden. Inhalte mit mehreren Schlüsseln können auf zwei Arten wiedergegeben werden, je nachdem, wie der Lizenzserver konfiguriert ist.
Fall 1: Der Lizenzserver antwortet mit allen Schlüsseln für die Inhalte
In diesem Fall ist der Lizenzserver so konfiguriert, dass er bei einer Anfrage für einen Schlüssel mit allen Schlüsseln für den Inhalt antwortet. Dieser Fall wird von ExoPlayer ohne spezielle Konfiguration verarbeitet. Die Anpassung zwischen Streams (z.B. SD- und HD-Video) erfolgt nahtlos, auch wenn unterschiedliche Schlüssel 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 Methode zur Unterstützung der Wiedergabe von Inhalten mit mehreren Schlüsseln, da der Client nicht mehrere Lizenzanfragen für den Zugriff auf die verschiedenen Streams stellen muss.
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, indem beim Erstellen des Medienelements true
an MediaItem.DrmConfiguration.Builder.setMultiSession
übergeben wird.
Wir empfehlen nicht, Ihren Lizenzserver so zu konfigurieren. Für die Wiedergabe von Inhalten mit mehreren Schlüsseln sind zusätzliche Lizenzanfragen erforderlich. Das ist weniger effizient und robust 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.
So ist die Wiedergabe mit den Schlüsseln möglich, die im Offline-Schlüsselsatz mit der angegebenen ID gespeichert sind.
DRM-Sitzungen für nicht geschützte Inhalte
Durch die Verwendung des Platzhalters DrmSessions
kann ExoPlayer
dieselben Decoder für unverschlüsselte Inhalte verwenden, die auch bei der Wiedergabe verschlüsselter Inhalte verwendet werden. Wenn Medien sowohl unverschlüsselte als auch verschlüsselte Abschnitte enthalten, solltest du den Platzhalter DrmSessions
verwenden, um das erneute Erstellen von Decodern zu vermeiden, wenn Übergänge zwischen unverschlüsselten und verschlüsselten Abschnitten auftreten. 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.
Benutzerdefinierten DrmSessionManager verwenden
Wenn eine App die 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 festlegen, ob jedes Mal 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 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 die asynchrone Zwischenspeicherwarteschlange aktivieren.