Per iniziare a utilizzare Transformer
:
- Aggiungi Media3 Transformer come dipendenza nel progetto.
- Crea un
EditedMediaItem
che rappresenta i contenuti multimediali da elaborare e le modifiche da applicare. - Crea un
Transformer
, che descrive l'output richiesto e un listener per gli eventi di completamento ed errore. - Avvia l'operazione di esportazione, passando il parametro
EditedMediaItem
da modificare e un percorso di output. Durante l'esportazione, puoi eseguire una query sull'avanzamento attuale o annullare l'operazione. - 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
nell'app demo di transformer per un esempio completo.
Aggiungi Media3 Transformer come dipendenza
Il modo più semplice per iniziare a utilizzare Transformer è aggiungere dipendenze Gradle alla libreria nel file build.gradle
del modulo della tua app:
Kotlin
implementation("androidx.media3:media3-transformer:1.3.1") implementation("androidx.media3:media3-effect:1.3.1") implementation("androidx.media3:media3-common:1.3.1")
Alla moda
implementation "androidx.media3:media3-transformer:1.3.1" implementation "androidx.media3:media3-effect:1.3.1" implementation "androidx.media3:media3-common:1.3.1"
dove 1.3.1 è la tua versione preferita. Per trovare la versione più recente, consulta le note di rilascio.
Per ulteriori informazioni sui moduli della libreria disponibili, consulta la pagina Google Maven AndroidX Media3.
Attiva il supporto Java 8
Se non è già abilitato, devi attivare il supporto 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 video H.265/HEVC e inviare 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 ExoPlayer. L'input può essere un flusso progressivo o adattivo, ma l'output è sempre 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 container 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.
Nota sui thread
È necessario accedere alle istanze del trasformatore da un singolo thread dell'applicazione e i metodi di ascolto 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 ai metodi listener nel thread dell'applicazione.
Ascoltare gli eventi
Il metodo start
è asincrono. Viene restituito immediatamente e all'app vengono
inviati una notifica degli eventi tramite il listener passato al generatore di 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.
Ricevi aggiornamenti sui progressi
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 query periodiche 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
. Risorse come i codec video hardware sono limitate,
soprattutto sui dispositivi di fascia bassa, quindi è importante liberare risorse se l'output non è necessario.