Per iniziare a utilizzare Transformer
, segui questi passaggi:
- Aggiungi Media3 Transformer come dipendenza nel tuo progetto.
- Crea un
EditedMediaItem
che 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 in
EditedMediaItem
da modificare e un percorso di output. Durante l'esportazione, puoi eseguire query sullo stato di 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 di Transformer per un esempio completo.
Aggiungere 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.7.1") implementation("androidx.media3:media3-effect:1.7.1") implementation("androidx.media3:media3-common:1.7.1")
Groovy
implementation "androidx.media3:media3-transformer:1.7.1" implementation "androidx.media3:media3-effect:1.7.1" implementation "androidx.media3:media3-common:1.7.1"
dove 1.7.1 è la tua versione preferita. Per trovare l'ultima versione, consulta le note di rilascio.
Per ulteriori informazioni sui moduli della libreria disponibili, visita la pagina Google Maven AndroidX Media3.
Attivare il supporto di Java 8
Se non è già abilitato, 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
}
Avviare una trasformazione
Ecco un esempio di creazione di un EditedMediaItem
per rimuovere l'audio per un file di input, quindi di creazione e configurazione di un'istanza Transformer
per esportare video H.265/HEVC, restituendo il risultato a 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 pagina Elementi multimediali di ExoPlayer. L'input può essere un flusso progressivo o adattivo, ma l'output è sempre un flusso progressivo. Per gli input adattivi, le tracce con la risoluzione più alta vengono sempre selezionate per la trasformazione. L'input può essere di qualsiasi formato contenitore supportato da ExoPlayer, ma l'output è sempre un file MP4.
Puoi eseguire più operazioni di esportazione in sequenza sulla stessa istanza di Transformer
, ma le esportazioni simultanee con la stessa istanza non sono supportate.
Una nota sull'organizzazione in thread
È necessario accedere alle istanze del trasformatore 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. A livello interno, Transformer opera in background e pubblica le chiamate ai metodi listener sul thread dell'applicazione.
Ascolta gli eventi
Il metodo start
è asincrono. Viene restituito immediatamente 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 bit rate medi per audio e video, a seconda dei casi.
Ricevere aggiornamenti sullo stato di avanzamento
Chiama il numero Transformer.getProgress
per richiedere lo stato di 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 query periodiche sullo stato di avanzamento di una trasformazione, in cui è possibile implementare il metodo updateProgressInUi
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); } } });
Annullare 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 farlo per liberare
risorse se l'output non è necessario.