MediaPlayer und digitale Rechteverwaltung (DRM) verwenden

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:

  1. Wenn Ihre App eine benutzerdefinierte Konfiguration ausführen soll, definieren Sie eine OnDrmConfigHelper-Schnittstelle und fügen Sie sie mit setOnDrmConfigHelper() an den Player an.
  2. Rufen Sie prepare() auf.
  3. Rufen Sie getDrmInfo() auf. Wenn die Quelle DRM-Inhalte enthält, gibt die Methode einen Wert ungleich null MediaPlayer.DrmInfo 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. 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ährend prepareDrm() 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, der prepareDrm() aufgerufen hat. Rufen Sie getDrmPropertyString() und setDrmPropertyString() 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.
  3. Rufen Sie getKeyRequest() auf, um ein Byte-Array für eine undurchsichtige Schlüsselanfrage abzurufen, das an einen Lizenzserver gesendet werden soll.
  4. 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.

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: