Erste Schritte

Der Einstieg in Transformer umfasst die folgenden Schritte:

  1. Fügen Sie Media3 Transformer als Abhängigkeit in Ihr Projekt ein.
  2. Erstellt eine EditedMediaItem, die die zu verarbeitenden Medien und die zu bearbeitenden Medien darstellt anwenden können.
  3. Erstellt einen Transformer, der die erforderliche Ausgabe und einen Listener beschreibt für Abschluss- und Fehlerereignisse.
  4. Starten Sie den Exportvorgang und übergeben Sie die EditedMediaItem zur Bearbeitung sowie einen Ausgabepfad. Während des Exports können Sie den aktuellen Fortschritt abfragen oder den Vorgang abbrechen. .
  5. Verarbeiten Sie die Ausgabe nach Bedarf, wenn der Export abgeschlossen ist. So können Sie zum Beispiel die Ausgabe für eine andere App freigeben oder auf einen Server hochladen.

Im Folgenden finden Sie weitere Informationen zu diesen Schritten. Weitere Informationen finden Sie unter TransformerActivity in der Demo zum Transformator App für eine vollständiges Beispiel.

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

Hier ist ein Beispiel für das Erstellen eines EditedMediaItem, um Audio für eine Eingabe zu entfernen und dann eine Transformer-Instanz für den Export erstellen und konfigurieren. H.265/HEVC-Video, 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 unter ExoPlayer-Mediaelemente . Die Eingabe kann progressiv oder adaptiv sein die Ausgabe ist jedoch immer ein progressiver Stream. Bei adaptiven Eingaben Tracks mit der höchsten Auflösung werden immer für die Transformation 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 zum Threading

Auf Transformer-Instanzen muss über einen einzelnen Anwendungsthread zugegriffen werden und der Listener-Methoden 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 wurde, benachrichtigt werden.

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 Datei. je nach Größe und den durchschnittlichen Bitraten von Audio- und Videoinhalten.

Fortschrittsbenachrichtigungen erhalten

Rufen Sie Transformer.getProgress auf, um den aktuellen Fortschritt eines Transformation. Der zurückgegebene Wert gibt den Fortschrittsstatus an. Wenn der Fortschritt Zustand PROGRESS_STATE_AVAILABLE ist, dann ist die 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.