MediaPlayer und digitale Rechteverwaltung (DRM) verwenden

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:

  1. Wenn deine App eine benutzerdefinierte Konfiguration ausführen soll, definiere eine OnDrmConfigHelper-Benutzeroberfläche und verknüpfe sie mit dem Player über setOnDrmConfigHelper().
  2. Rufen Sie prepare() an.
  3. Rufen Sie getDrmInfo() an. Wenn die Quelle DRM-Inhalte enthält, gibt die Methode einen nicht nullwertigen MediaPlayer.DrmInfo-Wert zurück.

Wenn MediaPlayer.DrmInfo vorhanden ist:

  1. Sehen Sie sich die Karte der verfügbaren UUIDs an und wählen Sie eine aus.
  2. 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 von prepareDrm() aufgerufen. So kannst du die DRM-Properties anpassen, bevor du die DRM-Sitzung öffnest. Der Callback wird synchron in dem Thread aufgerufen, der prepareDrm() aufgerufen hat. Rufe getDrmPropertyString() und setDrmPropertyString() 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.
  3. 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.
  4. 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“.

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: