Per iniziare a utilizzare Transformer, segui questi passaggi:
- Aggiungi Media3 Transformer come dipendenza nel tuo progetto.
- Crea un
EditedMediaItemche rappresenti i contenuti multimediali da elaborare e le modifiche da applicare. - Crea un
Transformer, descrivendo l'output richiesto e un listener per gli eventi di completamento ed errore. - Avvia l'operazione di esportazione, passando l'oggetto
EditedMediaItemda modificare e un percorso di output. Durante l'esportazione, puoi eseguire query sull'avanzamento corrente o annullare l'operazione. - Al termine dell'esportazione, gestisci l'output in base alle esigenze. Ad esempio, puoi condividere l'output con un'altra app o caricarlo su un server.
Continua a leggere per maggiori dettagli su questi passaggi e consulta TransformerActivity nell'app demo Transformer per un esempio completo.
Aggiungi Media3 Transformer come dipendenza
Il modo più semplice per iniziare a utilizzare Transformer è aggiungere le dipendenze Gradle alla libreria nel file build.gradle del modulo dell'app:
Kotlin
implementation("androidx.media3:media3-transformer:1.11.1")
implementation("androidx.media3:media3-effect:1.11.1")
implementation("androidx.media3:media3-common:1.11.1")
Alla moda
implementation "androidx.media3:media3-transformer:1.11.1"
implementation "androidx.media3:media3-effect:1.11.1"
implementation "androidx.media3:media3-common:1.11.1"
dove 1.11.1 è la versione che preferisci. L'ultima versione è disponibile nelle note di rilascio.
Per saperne di più sui moduli della libreria disponibili, consulta la pagina Google Maven AndroidX Media3.
Attiva il supporto di Java 8
Se non è già attivo, devi attivare il supporto di Java 8 in tutti i file build.gradle che dipendono da Transformer aggiungendo quanto segue alla sezione android:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Avvia una trasformazione
Ecco un esempio di creazione di un EditedMediaItem per rimuovere l'audio da un file di input, quindi di creazione e configurazione di un'istanza Transformer per esportare un video H.265/HEVC, con l'output del risultato in 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 saperne di più sugli elementi multimediali, consulta la pagina relativa agli elementi multimediali di ExoPlayer. L'input può essere uno stream progressivo o adattivo, ma l'output è sempre uno stream progressivo. Per gli input adattivi, per la trasformazione vengono sempre selezionate le tracce con la risoluzione più alta. L'input può essere in qualsiasi formato contenitore supportato da ExoPlayer, ma l'output è sempre un file MP4.
Puoi eseguire più operazioni di esportazione in sequenza sulla stessa istanza Transformer, ma le esportazioni simultanee con la stessa istanza non sono supportate.
Per informazioni sulla generazione di media generativi mediante la composizione di più input, consulta Editing multi-asset.
Una nota sul threading
Le istanze di Transformer devono essere accessibili da un singolo thread dell'applicazione e i metodi del listener vengono chiamati sullo stesso thread. Nella maggior parte dei casi, il thread dell'applicazione può essere semplicemente il thread principale dell'applicazione. Internamente, Transformer esegue il suo lavoro in background e pubblica le sue chiamate ai metodi del listener sul thread dell'applicazione.
Ascolta gli eventi
Il metodo start è asincrono. Restituisce immediatamente un risultato e l'app riceve una notifica degli eventi tramite il listener passato al builder Transformer.
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, tra cui le dimensioni del file e i bitrate medi per audio e video, a seconda dei casi.
Ricevi aggiornamenti sullo stato di avanzamento
Chiama Transformer.getProgress per eseguire query sull'avanzamento attuale di una trasformazione. Il valore restituito indica lo stato di avanzamento. Se lo stato di avanzamento è PROGRESS_STATE_AVAILABLE, il valore ProgressHolder fornito viene aggiornato con la percentuale di avanzamento attuale. L'esempio seguente mostra come eseguire periodicamente query sull'avanzamento di una trasformazione, dove 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. Le risorse come i codec video hardware sono limitate, soprattutto sui dispositivi di fascia bassa, quindi è importante eseguire questa operazione per liberare risorse se l'output non è necessario.