Ab Android 8.0 (API-Level 26) enthält MediaPlayer APIs, die
die Wiedergabe von DRM-geschütztem Material 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 den vollen Funktionsumfang von
MediaDrm, unterstützt aber die häufigsten Anwendungsfälle. Die aktuelle Implementierung kann die folgenden Inhaltstypen verarbeiten:
- Widevine-geschützte lokale Mediendateien
- Widevine-geschützte Remote- oder Streaming-Mediendateien
Das folgende Code-Snippet zeigt, wie die neuen DRM-Methoden von MediaPlayer in einer synchronen Implementierung verwendet werden.
Wenn Sie DRM-geschützte Medien verwalten möchten, müssen Sie die neuen Methoden neben dem üblichen Ablauf von MediaPlayer-Aufrufen einfügen, 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 die Quelle mit
setDataSource() fest, wie gewohnt. Führen Sie dann die folgenden Schritte aus, um DRM zu verwenden:
- Wenn Ihre App eine benutzerdefinierte Konfiguration ausführen soll, definieren Sie eine
OnDrmConfigHelper-Schnittstelle und fügen Sie sie mitsetOnDrmConfigHelper()an den Player an. - Rufen Sie
prepare()auf. - Rufen Sie
getDrmInfo()auf. Wenn die Quelle DRM-Inhalte enthält, gibt die Methode einen Wert ungleich nullMediaPlayer.DrmInfozurück.
Wenn MediaPlayer.DrmInfo vorhanden ist:
- Sehen Sie sich die Karte der verfügbaren UUIDs an und wählen Sie eine aus.
- Bereiten Sie die DRM-Konfiguration für die aktuelle Quelle vor, indem Sie
prepareDrm()aufrufen.- Wenn Sie einen
OnDrmConfigHelper-Callback erstellt und registriert haben, wird er aufgerufen, währendprepareDrm()ausgeführt wird. So können Sie die DRM-Eigenschaften benutzerdefiniert konfigurieren, bevor Sie die DRM-Sitzung öffnen. Der Callback wird synchron im Thread aufgerufen, derprepareDrm()aufgerufen hat. Rufen SiegetDrmPropertyString()undsetDrmPropertyString()auf, um auf die DRM-Eigenschaften zuzugreifen. Vermeiden Sie lange Vorgänge. - Wenn das Gerät noch nicht bereitgestellt wurde,
prepareDrm()greift auch auf den Bereitstellungsserver zu, um das Gerät bereitzustellen. Dies kann je nach Netzwerkverbindung unterschiedlich lange dauern.
- Wenn Sie einen
- Rufen Sie
getKeyRequest()auf, um ein Byte-Array für eine undurchsichtige Schlüsselanfrage abzurufen, das an einen Lizenzserver gesendet werden soll. - Rufen Sie
provideKeyResponse()auf, um die DRM-Engine über die vom Lizenz server empfangene Schlüsselantwort zu informieren. Das Ergebnis hängt vom Typ der Schlüsselanfrage ab:- Wenn die Antwort auf eine Offline-Schlüsselanfrage erfolgt, ist das Ergebnis eine Schlüsselgruppen-ID. Sie können diese Schlüsselgruppen-ID mit
restoreKeys()verwenden, um die Schlüssel in einer neuen Sitzung wiederherzustellen. - Wenn die Antwort auf eine Streaming- oder Freigabeanfrage erfolgt, ist das Ergebnis null.
- Wenn die Antwort auf eine Offline-Schlüsselanfrage erfolgt, ist das Ergebnis eine Schlüsselgruppen-ID. Sie können diese Schlüsselgruppen-ID mit
DRM asynchron vorbereiten
Standardmäßig wird prepareDrm() synchron ausgeführt und blockiert, bis die Vorbereitung
abgeschlossen ist. Die erste DRM-Vorbereitung auf einem neuen Gerät erfordert jedoch möglicherweise auch
die Bereitstellung, die von prepareDrm() intern verarbeitet wird. Aufgrund des Netzwerkvorgangs kann es
einige Zeit dauern, bis sie abgeschlossen ist. Sie können die Blockierung von prepareDrm() vermeiden, indem Sie einen
MediaPlayer.OnDrmPreparedListener definieren und festlegen.
Legen Sie einen OnDrmPreparedListener fest. prepareDrm() führt die Bereitstellung (falls erforderlich) und die Vorbereitung im Hintergrund aus. Wenn die Bereitstellung und Vorbereitung abgeschlossen sind, ruft das System den Listener auf. Machen Sie keine Annahmen zur Aufrufsequenz oder zum 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 prepareDrm() aufrufen.
DRM asynchron einrichten
Sie können DRM asynchron initialisieren, indem Sie den
MediaPlayer.OnDrmInfoListener für die DRM-Vorbereitung und den
MediaPlayer.OnDrmPreparedListener zum Starten des Players erstellen und registrieren. Sie funktionieren in
Verbindung 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-Level 26) kann MediaPlayer auch mit dem Common Encryption Scheme (CENC) und HLS auf Sample-Ebene verschlüsselte Medien (METHOD=SAMPLE-AES) für die Elementarstreamtypen H.264 und AAC entschlüsseln. Vollständig segmentverschlüsselte Medien (METHOD=AES-128) wurden zuvor 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 Wiedergeben von Audio und Video: