ExoPlayer verwendet die MediaDrm API von Android, um die Wiedergabe von DRM-geschützten Inhalten zu unterstützen.
Die für die verschiedenen unterstützten DRM-Schemata erforderlichen Mindestversionen von Android 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) |
Damit DRM-geschützte Inhalte mit ExoPlayer wiedergegeben werden können, muss die UUID des DRM-Systems beim Erstellen eines Media-Elements 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-Eigenschaften erforderlich, wie in den folgenden Abschnitten beschrieben.
Schlüsselrotation
Wenn Sie Streams mit rotierenden Schlüsseln abspielen möchten, übergeben Sie true an MediaItem.DrmConfiguration.Builder.setMultiSession, wenn Sie das Media-Element erstellen.
Inhalte mit mehreren Schlüsseln
Inhalte mit mehreren Schlüsseln bestehen aus mehreren Streams, wobei für einige Streams andere Schlüssel als für andere verwendet werden. 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 die Inhalte antwortet. Dieser Fall wird von ExoPlayer ohne spezielle Konfiguration behandelt. Die Anpassung zwischen Streams (z.B. SD- und HD-Video) erfolgt nahtlos, auch wenn sie unterschiedliche Schlüssel verwenden.
Wir empfehlen, Ihren Lizenzserver nach Möglichkeit so zu konfigurieren. Dies ist die effizienteste und zuverlässigste Methode zur Unterstützung der Wiedergabe von Inhalten mit mehreren Schlüsseln, 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, indem true beim Erstellen des Media-Elements an MediaItem.DrmConfiguration.Builder.setMultiSession übergeben wird.
Wir raten davon ab, Ihren Lizenzserver so zu konfigurieren. Für die Wiedergabe von Inhalten mit mehreren Schlüsseln sind zusätzliche Lizenzanfragen erforderlich, was weniger effizient und stabil ist als die oben beschriebene Alternative.
Offlineschlüssel
Ein Offline-Schlüsselsatz kann geladen werden, indem die Schlüsselsatz-ID beim Erstellen des Media-Elements an MediaItem.DrmConfiguration.Builder.setKeySetId übergeben wird.
So kann die Wiedergabe mit den im Offline-Schlüsselsatz mit der angegebenen ID gespeicherten Schlüsseln erfolgen.
DRM-Sitzungen für nicht urheberrechtlich 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, sollten Sie möglicherweise den Platzhalter DrmSessions verwenden, um die Neuerstellung von Decodern bei Übergängen zwischen unverschlüsselten und verschlüsselten Abschnitten zu vermeiden. Die Verwendung des Platzhalters DrmSessions für Audio- und Videotracks kann aktiviert werden, indem true beim Erstellen des Media-Elements 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 entscheiden, ob er jedes Mal eine neue Manager-Instanz instanziieren möchte 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) Videostottern auftritt, kannst du versuchen, die asynchrone Pufferwarteschlange zu aktivieren.