Der Einstieg in Transformer
umfasst die folgenden Schritte:
- Fügen Sie Media3 Transformer als Abhängigkeit in Ihr Projekt ein.
- Erstellen Sie eine
EditedMediaItem
, die die zu verarbeitenden Medien und Änderungen darstellt, die darauf angewendet werden sollen. - Erstellen Sie einen
Transformer
, der die erforderliche Ausgabe beschreibt, und einen Listener für Abschluss- und Fehlerereignisse. - Starten Sie den Exportvorgang. Übergeben Sie dabei die
EditedMediaItem
zum Bearbeiten und einen Ausgabepfad. Während des Exports können Sie den aktuellen Fortschritt abfragen oder den Vorgang abbrechen. - Verarbeiten Sie die Ausgabe nach Bedarf, wenn der Export abgeschlossen ist. Sie können die Ausgabe beispielsweise für eine andere Anwendung freigeben oder auf einen Server hochladen.
Im Folgenden finden Sie weitere Informationen zu diesen Schritten. Ein vollständiges Beispiel finden Sie unter TransformerActivity
in der Transformer-Demo-App.
Media3 Transformer als Abhängigkeit hinzufügen
Der einfachste Weg, mit der Verwendung von Transformer zu beginnen, besteht darin, der Bibliothek in der Datei build.gradle
Ihres App-Moduls Gradle-Abhängigkeiten hinzuzufügen:
Kotlin
implementation("androidx.media3:media3-transformer:1.3.1") implementation("androidx.media3:media3-effect:1.3.1") implementation("androidx.media3:media3-common:1.3.1")
Cool
implementation "androidx.media3:media3-transformer:1.3.1" implementation "androidx.media3:media3-effect:1.3.1" implementation "androidx.media3:media3-common:1.3.1"
wobei 1.3.1 die bevorzugte Version ist. Die aktuelle Version finden Sie in den Versionshinweisen.
Weitere Informationen zu den verfügbaren Bibliotheksmodulen finden Sie auf der Google Maven AndroidX Media3-Seite.
Java 8-Unterstützung aktivieren
Falls dies nicht bereits aktiviert ist, müssen Sie die Java 8-Unterstützung in allen build.gradle
-Dateien aktivieren, die von Transformer abhängen. Fügen Sie dazu im Abschnitt android
Folgendes hinzu:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Transformation starten
Im folgenden Beispiel wird gezeigt, wie Sie eine EditedMediaItem
erstellen, um Audiodaten aus einer Eingabedatei zu entfernen. Anschließend wird eine Transformer
-Instanz zum Exportieren von H.265/HEVC-Videos erstellt und konfiguriert und das Ergebnis wird an outputPath
ausgegeben.
Kotlin
val inputMediaItem = MediaItem.fromUri("path_to_input_file") val editedMediaItem = EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build() val transformer = Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build() transformer.start(editedMediaItem, outputPath)
Java
MediaItem inputMediaItem = MediaItem.fromUri("path_to_input_file"); EditedMediaItem editedMediaItem = new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build(); Transformer transformer = new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H265) .addListener(transformerListener) .build(); transformer.start(editedMediaItem, outputPath);
Weitere Informationen zu Medienelementen finden Sie auf der Seite mit den ExoPlayer-Mediaelementen. Die Eingabe kann ein progressiver oder adaptiver Stream sein, aber die Ausgabe ist immer ein progressiver Stream. Bei adaptiven Eingaben werden immer die Spuren mit der höchsten Auflösung für die Transformation ausgewählt. Die Eingabe kann ein beliebiges Containerformat haben, das von ExoPlayer unterstützt wird, aber die Ausgabe ist immer eine MP4-Datei.
Sie können mehrere Exportvorgänge nacheinander auf derselben Transformer
-Instanz ausführen. Gleichzeitige Exporte mit derselben Instanz werden jedoch nicht unterstützt.
Hinweis zum Threading
Auf Transformer-Instanzen muss über einen einzelnen Anwendungsthread zugegriffen werden und die Listener-Methoden werden im selben Thread aufgerufen. In den meisten Fällen kann der Anwendungsthread einfach der Hauptthread der Anwendung sein. Intern erledigt Transformer seine Arbeit im Hintergrund und sendet seine Aufrufe an Listener-Methoden im Anwendungsthread.
Auf Ereignisse warten
Die Methode start
ist asynchron. Sie wird sofort zurückgegeben und die App wird über den Listener, der an den Transformer
-Builder übergeben wird, über Ereignisse benachrichtigt.
Kotlin
val transformerListener: Transformer.Listener = object : Transformer.Listener { override fun onCompleted(composition: Composition, result: ExportResult) { playOutput() } override fun onError(composition: Composition, result: ExportResult, exception: ExportException) { displayError(exception) } }
Java
Transformer.Listener transformerListener = new Transformer.Listener() { @Override public void onCompleted(Composition composition, ExportResult result) { playOutput(); } @Override public void onError(Composition composition, ExportResult result, ExportException exception) { displayError(exception); } };
ExportResult
enthält Informationen zur Ausgabedatei, einschließlich der Dateigröße und der durchschnittlichen Bitraten für Audio und Video, falls zutreffend.
Fortschrittsbenachrichtigungen erhalten
Rufen Sie Transformer.getProgress
auf, um den aktuellen Fortschritt einer Transformation abzufragen. Der zurückgegebene Wert gibt den Fortschrittsstatus an. Wenn der Fortschrittsstatus PROGRESS_STATE_AVAILABLE
ist, wird die angegebene ProgressHolder
mit dem aktuellen Fortschrittsprozentsatz aktualisiert. Das folgende Beispiel zeigt, wie der Fortschritt einer Transformation regelmäßig abgefragt werden kann. Dabei kann die Methode updateProgressInUi
zum Aktualisieren einer Fortschrittsanzeige implementiert werden.
Kotlin
transformer.start(inputMediaItem, outputPath) val progressHolder = ProgressHolder() mainHandler.post( object : Runnable { override fun run() { val progressState: @ProgressState Int = transformer.getProgress(progressHolder) updateProgressInUi(progressState, progressHolder) if (progressState != Transformer.PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */this, /* delayMillis= */500) } } } )
Java
transformer.start(inputMediaItem, outputPath); ProgressHolder progressHolder = new ProgressHolder(); mainHandler.post( new Runnable() { @Override public void run() { @Transformer.ProgressState int progressState = transformer.getProgress(progressHolder); updateProgressInUi(progressState, progressHolder); if (progressState != PROGRESS_STATE_NOT_STARTED) { mainHandler.postDelayed(/* r= */ this, /* delayMillis= */ 500); } } });
Transformation abbrechen
Wenn der Nutzer den Exportvorgang verlässt, brechen Sie den Exportvorgang mit Transformer.cancel
ab. Ressourcen wie Hardware-Video-Codecs sind begrenzt, insbesondere auf Low-End-Geräten. Daher ist es wichtig, dies zu tun, um Ressourcen freizugeben, wenn die Ausgabe nicht benötigt wird.