Per iniziare

Per iniziare a utilizzare Transformer:

  1. Aggiungi Media3 Transformer come dipendenza nel progetto.
  2. Crea una EditedMediaItem che rappresenti i contenuti multimediali da elaborare e le modifiche vi si applicano.
  3. Crea un'Transformer, che descrive l'output richiesto e un listener per gli eventi di completamento e di errore.
  4. Avvia l'operazione di esportazione, passando il EditedMediaItem per la modifica e un del percorso di output. Durante l'esportazione, puoi eseguire una query sull'avanzamento attuale o annullare operativa.
  5. Al termine dell'esportazione, gestisci l'output in base alle tue esigenze. Ad esempio, puoi condividere l'output in un'altra app o caricarlo su un server.

Continua a leggere per ulteriori dettagli su questi passaggi e consulta TransformerActivity nel demo di transformer app per un un esempio completo.

Aggiungi Media3 Transformer come dipendenza

Il modo più semplice per iniziare a utilizzare Transformer è aggiungere dipendenze Gradle nella raccolta nel file build.gradle del modulo dell'app:

Kotlin

implementation("androidx.media3:media3-transformer:1.4.0")
implementation("androidx.media3:media3-effect:1.4.0")
implementation("androidx.media3:media3-common:1.4.0")

Alla moda

implementation "androidx.media3:media3-transformer:1.4.0"
implementation "androidx.media3:media3-effect:1.4.0"
implementation "androidx.media3:media3-common:1.4.0"

dove 1.4.0 è la tua versione preferita. L'ultima versione può essere trovate consultando il rilascio note.

Per ulteriori informazioni sui moduli della biblioteca disponibili, visita la Google Maven AndroidX Media3 .

Attiva il supporto Java 8

Se non è già abilitato, devi attivare il supporto Java 8 in tutti i build.gradle che dipendono da Transformer, aggiungendo quanto segue all'elemento android sezione:

compileOptions {
  targetCompatibility JavaVersion.VERSION_1_8
}

Avvia una trasformazione

Di seguito è riportato un esempio di creazione di un evento EditedMediaItem per rimuovere l'audio da un input del file, creando e configurando un'istanza Transformer da esportare Video H.265/HEVC con output del risultato su outputPath.

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);

Per ulteriori informazioni sugli elementi multimediali, consulta la sezione Elementi multimediali ExoPlayer . L'input può essere progressivo o adattivo ma l'output è sempre un flusso progressivo. Per gli input adattivi, vengono sempre selezionate tracce con la risoluzione più alta per la trasformazione. L'input può essere di qualsiasi formato container supportato da ExoPlayer, ma l'output è sempre un file MP4.

Puoi eseguire più operazioni di esportazione in sequenza sulla stessa Transformer, ma le esportazioni simultanee con la stessa istanza non lo sono supportati.

Nota sui thread

È necessario accedere alle istanze del trasformatore da un singolo thread dell'applicazione e i metodi listener vengono chiamati sullo stesso thread. Nella maggior parte dei casi, il thread dell'applicazione può essere solo il thread principale dell'applicazione. Internamente, Transformer svolge il proprio lavoro in background e pubblica le chiamate al listener sul thread dell'applicazione.

Ascoltare gli eventi

Il metodo start è asincrono. Viene visualizzata immediatamente e l'app una notifica degli eventi trasmessi al generatore di Transformer tramite il listener.

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 include informazioni sul file di output, incluso il file e le velocità in bit medie per audio e video, se applicabile.

Ricevi aggiornamenti sui progressi

Chiama Transformer.getProgress per eseguire una query sull'avanzamento attuale di una e la trasformazione dei dati. Il valore restituito indica lo stato di avanzamento. Se l'avanzamento lo stato è PROGRESS_STATE_AVAILABLE, il valore ProgressHolder fornito è aggiornato con la percentuale di avanzamento attuale. L'esempio seguente mostra come interrogano periodicamente l'avanzamento di una trasformazione, Il metodo updateProgressInUi può essere implementato per aggiornare una barra di avanzamento.

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);
        }
      }
    });

Annulla una trasformazione

Se l'utente sceglie di uscire da un flusso di esportazione, annulla l'operazione di esportazione con Transformer.cancel. Risorse come i codec video hardware sono limitate soprattutto sui dispositivi di fascia bassa. Questo passaggio è importante per liberare se l'output non è necessario.