Per iniziare a utilizzare Transformer
:
- Aggiungi Media3 Transformer come dipendenza al tuo progetto.
- Crea un
EditedMediaItem
che rappresenta i contenuti multimediali da elaborare e le modifiche da applicare. - Crea un
Transformer
, descrivendo l'output richiesto e un ascoltatore per gli eventi di completamento ed errore. - Avvia l'operazione di esportazione passando il
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 ulteriori dettagli su questi passaggi e consulta TransformerActivity
nell'app demo di transformer per un esempio completo.
Aggiungi Media3 Transformer come dipendenza
Il modo più semplice per iniziare a utilizzare Transformer è aggiungere le dipendenze Gradle
per la libreria nel file build.gradle
del modulo dell'app:
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")
Groovy
implementation "androidx.media3:media3-transformer:1.4.1" implementation "androidx.media3:media3-effect:1.4.1" implementation "androidx.media3:media3-common:1.4.1"
dove 1.4.1 è la versione che preferisci. Puoi trovare la versione più recente consultando le note di rilascio.
Puoi trovare ulteriori informazioni sui moduli della libreria disponibili nella pagina Media3 di Google Maven AndroidX.
Attivare il supporto di Java 8
Se non è già attivato, devi attivare il supporto di Java 8 in tutti i build.gradle
file che dipendono da Transformer aggiungendo quanto segue alla sezione android
:
compileOptions {
targetCompatibility JavaVersion.VERSION_1_8
}
Avvia una trasformazione
Di seguito è riportato un esempio di creazione di un EditedMediaItem
per rimuovere l'audio di un file di input, quindi di creazione e configurazione di un'istanza Transformer
per esportare video H.265/HEVC e di invio del 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 progressivo. Per gli input adattivi, per la trasformazione vengono sempre selezionati i canali con la risoluzione più elevata. L'input può essere in qualsiasi formato container supportato da ExoPlayer, ma l'output è sempre un file MP4.
Puoi eseguire più operazioni di esportazione in sequenza nella stessa istanzaTransformer
, ma le esportazioni simultanee con la stessa istanza non sono supportate.
Una nota sull'organizzazione in thread
È necessario accedere alle istanze di Transformer da un singolo thread di applicazione e i metodi di listener vengono chiamati nello stesso thread. Nella maggior parte dei casi, il thread dell'applicazione può essere semplicemente il thread principale dell'applicazione. Internamente, Transformer svolge il proprio lavoro in background e pubblica le chiamate ai metodi listener sul thread dell'applicazione.
Ascoltare gli eventi
Il metodo start
è asincrono. Restituisce immediatamente e l'app viene informata degli eventi tramite l'ascoltatore passato al costruttore 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 la velocità in bit media per audio e video, a seconda dei casi.
Ricevere aggiornamenti sull'avanzamento
Chiama Transformer.getProgress
per eseguire una query sull'avanzamento corrente 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 corrente. L'esempio seguente mostra come eseguire periodicamente query sull'avanzamento di una trasformazione, in cui 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 annullare 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.