Ab Android 8.0 (API-Ebene 26) enthält MediaPlayer
APIs, die die Wiedergabe von mit digitalen Rechteverwaltungsmechanismen geschützten Inhalten unterstützen. Die MediaPlayer-DRM-APIs ähneln der Low-Level-API von MediaDrm
, funktionieren aber auf einer höheren Ebene und geben die zugrunde liegenden Extractor-, DRM- und Kryptoobjekte nicht preis.
Die MediaPlayer DRM API bietet zwar nicht die volle Funktionalität von MediaDrm
, unterstützt aber die gängigsten Anwendungsfälle. Die aktuelle Implementierung kann die folgenden Inhaltstypen verarbeiten:
- Lokale Mediendateien, die mit Widevine geschützt sind
- Von Widevine geschützte Remote- oder Streaming-Mediendateien
Das folgende Code-Snippet zeigt, wie die neuen DRM-MediaPlayer
-Methoden in einer synchronen Implementierung verwendet werden.
Wenn du DRM-geschützte Medien verwalten möchtest, musst du die neuen Methoden in den üblichen Ablauf der MediaPlayer-Aufrufe einbinden, wie in diesem Beispiel gezeigt:
Kotlin
mediaPlayer?.apply {
setDataSource()
setOnDrmConfigHelper() // optional, for custom configuration
prepare()
drmInfo?.also {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
// MediaPlayer is now ready to use
start()
// ...play/pause/resume...
stop()
releaseDrm()
}
Java
setDataSource();
setOnDrmConfigHelper(); // optional, for custom configuration
prepare();
if (getDrmInfo() != null) {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// MediaPlayer is now ready to use
start();
// ...play/pause/resume...
stop();
releaseDrm();
Initialisieren Sie zuerst das MediaPlayer
-Objekt und legen Sie wie gewohnt die Quelle mit setDataSource()
fest. So verwenden Sie DRM:
- Wenn deine App eine benutzerdefinierte Konfiguration ausführen soll, definiere eine
OnDrmConfigHelper
-Benutzeroberfläche und verknüpfe sie mit dem Player übersetOnDrmConfigHelper()
. - Rufen Sie
prepare()
an. - Rufen Sie
getDrmInfo()
an. Wenn die Quelle DRM-Inhalte enthält, gibt die Methode einen nicht nullwertigenMediaPlayer.DrmInfo
-Wert zurück.
Wenn MediaPlayer.DrmInfo
vorhanden ist:
- Sehen Sie sich die Karte der verfügbaren UUIDs an und wählen Sie eine aus.
- Bereite die DRM-Konfiguration für die aktuelle Quelle vor, indem du
prepareDrm()
aufrufst.- Wenn Sie einen
OnDrmConfigHelper
-Callback erstellt und registriert haben, wird er während der Ausführung vonprepareDrm()
aufgerufen. So kannst du die DRM-Properties anpassen, bevor du die DRM-Sitzung öffnest. Der Callback wird synchron in dem Thread aufgerufen, derprepareDrm()
aufgerufen hat. RufegetDrmPropertyString()
undsetDrmPropertyString()
auf, um auf die DRM-Properties zuzugreifen. Vermeiden Sie lange Vorgänge. - Wenn das Gerät noch nicht bereitgestellt wurde, greift
prepareDrm()
auch auf den Bereitstellungsserver zu, um das Gerät bereitzustellen. Je nach Netzwerkverbindung kann dies unterschiedlich lange dauern.
- Wenn Sie einen
- Rufe
getKeyRequest()
auf, um ein Byte-Array für eine Anfrage mit einem undurchsichtigen Schlüssel zu erhalten, das an einen Lizenzserver gesendet werden soll. - Rufe
provideKeyResponse()
auf, um die DRM-Engine über die vom Lizenzserver empfangene Schlüsselantwort zu informieren. Das Ergebnis hängt vom Typ der Schlüsselanfrage ab:- Wenn die Antwort auf eine Anfrage für einen Offlineschlüssel erfolgt, ist das Ergebnis eine Schlüsselsatz-ID. Du kannst diese Schlüsselsatz-ID mit
restoreKeys()
verwenden, um die Schlüssel in einer neuen Sitzung wiederherzustellen. - Wenn die Antwort auf eine Streaming- oder Veröffentlichungsanfrage erfolgt, ist das Ergebnis „null“.
- Wenn die Antwort auf eine Anfrage für einen Offlineschlüssel erfolgt, ist das Ergebnis eine Schlüsselsatz-ID. Du kannst diese Schlüsselsatz-ID mit
DRM asynchron vorbereiten
Standardmäßig wird prepareDrm()
synchron ausgeführt und blockiert, bis die Vorbereitung abgeschlossen ist. Die allererste DRM-Vorbereitung auf einem neuen Gerät kann jedoch auch eine Bereitstellung erfordern, die von prepareDrm()
intern verarbeitet wird und aufgrund des damit verbundenen Netzwerkbetriebs einige Zeit in Anspruch nehmen kann. Sie können das Blockieren bei prepareDrm()
vermeiden, indem Sie MediaPlayer.OnDrmPreparedListener
definieren und festlegen.
Legen Sie eine OnDrmPreparedListener
fest. prepareDrm()
führt die Bereitstellung (falls erforderlich) und die Vorbereitung im Hintergrund aus. Nach Abschluss der Bereitstellung und Vorbereitung ruft das System den Listener auf. Machen Sie keine Annahmen über die Aufrufsreihenfolge oder den Thread, in dem der Listener ausgeführt wird, es sei denn, Sie registrieren den Listener mit einem Handler-Thread. Das System kann den Listener vor oder nach der Rückgabe von prepareDrm()
aufrufen.
DRM asynchron einrichten
Du kannst die DRM asynchron initialisieren, indem du MediaPlayer.OnDrmInfoListener
für die DRM-Vorbereitung und MediaPlayer.OnDrmPreparedListener
zum Starten des Players erstellst und registrierst. Sie funktionieren in Kombination mit prepareAsync()
, wie in diesem Beispiel gezeigt:
Kotlin
setOnPreparedListener()
setOnDrmInfoListener()
setDataSource()
prepareAsync()
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
override fun onDrmInfo(mediaPlayer: MediaPlayer, drmInfo: MediaPlayer.DrmInfo) {
mediaPlayer.apply {
prepareDrm()
getKeyRequest()
provideKeyResponse()
}
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
override fun onPrepared(mediaPlayer: MediaPlayer) {
mediaPlayer.start()
}
Java
setOnPreparedListener();
setOnDrmInfoListener();
setDataSource();
prepareAsync();
// ...
// If the data source content is protected you receive a call to the onDrmInfo() callback.
onDrmInfo() {
prepareDrm();
getKeyRequest();
provideKeyResponse();
}
// When prepareAsync() finishes, you receive a call to the onPrepared() callback.
// If there is a DRM, onDrmInfo() sets it up before executing this callback,
// so you can start the player.
onPrepared() {
start();
}
Verschlüsselte Medien verarbeiten
Ab Android 8.0 (API-Ebene 26) kann MediaPlayer
auch CENC- und HLS-Medien (Common Encryption Scheme, METHOD=SAMPLE-AES) auf Sampleebene für die Elementarstreamtypen H.264 und AAC entschlüsseln. Bisher wurden verschlüsselte Medien mit dem gesamten Segment (METHOD=AES-128) unterstützt.
Weitere Informationen
Jetpack Media3 ist die empfohlene Lösung für die Medienwiedergabe in Ihrer App. Weitere Informationen
Auf diesen Seiten finden Sie Themen zum Aufzeichnen, Speichern und Abspielen von Audio- und Videoinhalten: