So starten Sie mit Transformer
:
- Fügen Sie Media3 Transformer als Abhängigkeit in Ihr Projekt ein.
- Erstellt eine
EditedMediaItem
, die die zu verarbeitenden Medien und die zu bearbeitenden Medien darstellt anwenden können. - Erstellen Sie einen
Transformer
, in dem die erforderliche Ausgabe und ein Listener für Abschluss- und Fehlerereignisse beschrieben werden. - Starten Sie den Exportvorgang, indem Sie die zu bearbeitende
EditedMediaItem
und einen Ausgabepfad übergeben. Während des Exports können Sie den aktuellen Fortschritt abfragen oder den Vorgang abbrechen. - Wenn der Export abgeschlossen ist, können Sie die Ausgabe nach Bedarf verarbeiten. So können Sie zum Beispiel die Ausgabe für eine andere App freigeben oder auf einen Server hochladen.
Weitere Informationen zu diesen Schritten finden Sie weiter unten. Ein vollständiges Beispiel finden Sie unter TransformerActivity
in der Demo-App für Transformers.
Media3 Transformer als Abhängigkeit hinzufügen
Der einfachste Weg, um mit der Verwendung von Transformer zu beginnen, besteht darin, Gradle-Abhängigkeiten hinzuzufügen.
für die Bibliothek in der Datei build.gradle
Ihres App-Moduls:
Kotlin
implementation("androidx.media3:media3-transformer:1.4.1") implementation("androidx.media3:media3-effect:1.4.1") implementation("androidx.media3:media3-common:1.4.1")
Cool
implementation "androidx.media3:media3-transformer:1.4.1" implementation "androidx.media3:media3-effect:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
wobei 1.4.1 die bevorzugte Version ist. Die neueste Version kann die Sie in der Version Notizen.
Weitere Informationen zu den verfügbaren Bibliotheksmodulen finden Sie auf der Google Maven AndroidX Media3 .
Java 8-Unterstützung aktivieren
Falls dies noch nicht der Fall ist, musst du die Java 8-Unterstützung in allen build.gradle
aktivieren.
die von Transformer abhängen, indem Sie der Datei android
Folgendes hinzufügen:
Abschnitt:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Transformation starten
Im folgenden Beispiel wird eine EditedMediaItem
erstellt, um Audio aus einer Eingabedatei zu entfernen. Anschließend wird eine Transformer
-Instanz erstellt und konfiguriert, um H.265/HEVC-Videos zu exportieren und die Ergebnisse in outputPath
auszugeben.
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 im Abschnitt zu den ExoPlayer-Mediaelementen . Die Eingabe kann ein progressiver oder ein adaptiver Stream sein, die Ausgabe ist jedoch immer ein progressiver Stream. Bei adaptiven Eingaben werden für die Transformation immer die Tracks mit der höchsten Auflösung ausgewählt. Die Eingabe kann ein beliebiges Containerformat haben, das von ExoPlayer unterstützt wird, aber wird immer eine MP4-Datei ausgegeben.
Sie können mehrere Exportvorgänge nacheinander für denselben
Transformer
-Instanz, gleichzeitige Exporte mit derselben Instanz jedoch nicht
unterstützt.
Hinweis zu Threads
Auf Transformatorinstanzen muss über einen einzigen Anwendungsthread zugegriffen werden und die Listenermethoden werden im selben Thread aufgerufen. In den meisten Fällen Anwendungsthread kann einfach der Hauptthread der Anwendung sein. Intern Transformer erledigt seine Aufgaben im Hintergrund und sendet seine Aufrufe an den Listener im Anwendungsthread.
Auf Ereignisse warten
Die Methode start
ist asynchron. Sie kehrt sofort zurück und die App wird über den Listener, der an den Transformer
-Builder übergeben wird, über Ereignisse informiert.
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 Bitrate für Audio und Video.
Fortschrittsbenachrichtigungen erhalten
Rufen Sie Transformer.getProgress
auf, um den aktuellen Fortschritt eines
Transformation. Der zurückgegebene Wert gibt den Fortschrittsstatus an. Wenn der Fortschrittsstatus PROGRESS_STATE_AVAILABLE
ist, wird der angegebene ProgressHolder
mit dem aktuellen Fortschrittsprozentsatz aktualisiert. Das folgende Beispiel zeigt, wie Sie
Der Fortschritt einer Transformation wird regelmäßig abgefragt,
Die Methode updateProgressInUi
kann 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
Brechen Sie den Exportvorgang ab, wenn der Nutzer den Exportvorgang beendet.
mit Transformer.cancel
. Ressourcen wie Hardware-Video-Codecs
sind begrenzt,
vor allem auf Low-End-Geräten, daher ist es wichtig, dies zu tun,
wenn die Ausgabe nicht benötigt wird.