Die ersten Schritte mit Transformer umfassen die folgenden Schritte:
- Fügen Sie Ihrem Projekt Media3 Transformer als Abhängigkeit hinzu.
- Erstellen Sie ein
EditedMediaItem, das die zu verarbeitenden Medien und die darauf anzuwendenden Bearbeitungen darstellt. - Erstellen Sie einen
Transformer, der die erforderliche Ausgabe und einen Listener für Abschluss- und Fehlerereignisse beschreibt. - Starten Sie den Exportvorgang und übergeben Sie das zu bearbeitende
EditedMediaItemund einen Ausgabepfad. Während des Exports können Sie den aktuellen Fortschritt abfragen oder den Vorgang abbrechen. - Wenn der Export abgeschlossen ist, verarbeiten Sie die Ausgabe nach Bedarf. Sie können die Ausgabe beispielsweise für eine andere App freigeben oder auf einen Server hochladen.
Weitere Informationen zu diesen Schritten und ein vollständiges Beispiel finden Sie unter TransformerActivity in der
Transformer-Demo
App für ein
vollständiges Beispiel.
Media3 Transformer als Abhängigkeit hinzufügen
Der einfachste Weg, mit Transformer zu beginnen, besteht darin, in der Datei build.gradle Ihres App-Moduls Gradle-Abhängigkeiten für die Bibliothek hinzuzufügen:
Kotlin
implementation("androidx.media3:media3-transformer:1.10.0")
implementation("androidx.media3:media3-effect:1.10.0")
implementation("androidx.media3:media3-common:1.10.0")
Groovy
implementation "androidx.media3:media3-transformer:1.10.0"
implementation "androidx.media3:media3-effect:1.10.0"
implementation "androidx.media3:media3-common:1.10.0"
Dabei ist 1.10.0 Ihre bevorzugte Version. Die neueste Version kann durch Konsultation der Versions hinweise gefunden werden.
Weitere Informationen zu den verfügbaren Bibliotheksmodulen finden Sie auf der Google Maven AndroidX Media3 Seite.
Java 8-Unterstützung aktivieren
Wenn sie noch nicht 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 dem Abschnitt android Folgendes hinzu:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Transformation starten
Hier ist ein Beispiel für das Erstellen eines EditedMediaItem, um Audio für eine Eingabedatei zu entfernen, und dann das Erstellen und Konfigurieren einer Transformer-Instanz zum Exportieren von H.265/HEVC-Video, wobei das Ergebnis in outputPath ausgegeben wird.
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 ExoPlayer-Medienelemente Seite. Die Eingabe kann ein progressiver oder ein adaptiver Stream sein, die Ausgabe ist jedoch immer ein progressiver Stream. Bei adaptiven Eingaben werden immer die Tracks mit der höchsten Auflösung für die Transformation ausgewählt. Die Eingabe kann ein beliebiges von ExoPlayer unterstütztes Containerformat haben, die Ausgabe ist jedoch immer eine MP4-Datei.
Sie können mehrere Exportvorgänge nacheinander in derselben Transformer-Instanz ausführen. Gleichzeitige Exporte mit derselben Instanz werden jedoch nicht unterstützt.
Hinweis zu Threads
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 führt Transformer seine Arbeit im Hintergrund aus und sendet seine Aufrufe an Listener-Methoden im Anwendungsthread.
Ereignisse beobachten
Die Methode start ist asynchron. Sie gibt sofort einen Wert zurück und die App wird über den Listener, der an den Transformer-Builder übergeben wurde, ü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.
Fortschrittsaktualisierungen 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 der bereitgestellte ProgressHolder mit dem aktuellen Fortschritt in Prozent aktualisiert. Im folgenden Beispiel wird gezeigt, wie der Fortschritt einer Transformation regelmäßig abgefragt wird. Die Methode updateProgressInUi kann implementiert werden, um eine Fortschrittsanzeige zu aktualisieren.
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 einen Exportvorgang abbrechen möchte, rufen Sie Transformer.cancel auf. Ressourcen wie Hardware-Videocodecs sind begrenzt, insbesondere auf Geräten der unteren Preisklasse. Daher ist es wichtig, dies zu tun, um Ressourcen freizugeben, wenn die Ausgabe nicht benötigt wird.