Transcodifica tra formati
Puoi specificare i formati audio e video di output da produrre quando creando Transformer. Ad esempio, il seguente codice mostra come per configurare Transformer per l'output di video H.264/AVC e audio AAC:
Kotlin
Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build()
Java
new Transformer.Builder(context) .setVideoMimeType(MimeTypes.VIDEO_H264) .setAudioMimeType(MimeTypes.AUDIO_AAC) .build();
Se il formato multimediale di input corrisponde già alle configurazioni per l'audio o video, Transformer passa automaticamente alla transmuxing, ovvero alla copia i campioni compressi dal container di input al container di output senza modifica. In questo modo si evitano i costi di calcolo e la potenziale perdita di qualità decodifica e ricodifica nello stesso formato.
Rimuovere l'audio o il video
Rimuovi l'audio o il video utilizzando EditedMediaItem.Builder
, ad esempio:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Tagliare un clip
Puoi rimuovere qualsiasi contenuto multimediale esterno ai timestamp di inizio e di fine specificati impostando la configurazione di ritaglio sull'elemento multimediale di input. Ad esempio, per produrre un Clip contenente solo i contenuti multimediali di durata compresa tra 10 e 20 secondi:
Kotlin
val inputMediaItem = MediaItem.Builder() .setUri(uri) .setClippingConfiguration( ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build()
Java
MediaItem inputMediaItem = new MediaItem.Builder() .setUri(uri) .setClippingConfiguration( new MediaItem.ClippingConfiguration.Builder() .setStartPositionMs(10_000) .setEndPositionMs(20_000) .build()) .build();
Ottimizzazione dei ritagli
Per ridurre la latenza del taglio all'inizio di un video, attiva Taglia e ottimizzazione.
Kotlin
Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build()
Java
new Transformer.Builder(context) .experimentalSetTrimOptimizationEnabled(true) .build();
Questo accelera l'esportazione in quanto decodifica e ricodifica la parte minima del video
possibile, quindi unendo i dati ricodificati con il resto dell'originale
video. L'ottimizzazione si basa sulla possibilità di unire parte del file di input
con un output appena codificato, il che significa che il formato di output dell'encoder
deve essere compatibile. Quindi, ad esempio, se il file era originariamente
su un dispositivo con un'implementazione diversa di codifica, è probabile
che non sia possibile applicare l'ottimizzazione.
Affinché l'ottimizzazione vada a buon fine, l'encoder fornito a Transformer tramite
EncoderFactory
deve avere un livello e un profilo compatibili con il formato di input.
Questa ottimizzazione funziona solo con l'input MP4 con un singolo asset senza effetti, ad eccezione di
nessun effetto video operativo e rotazioni divisibili di 90 gradi. Se l'ottimizzazione
un errore, Transformer torna automaticamente all'esportazione normale e segnala
risultato dell'ottimizzazione in ExportResult.OptimizationResult
.
Stiamo convalidando questa funzionalità e ci aspettiamo che diventi non sperimentale in una release futura.
Modifiche video
EditedMediaItems
presenta elenchi di processori audio ed effetti video a cui applicare
ordine. La raccolta include implementazioni di effetti video per casi d'uso comuni,
oppure scrivere effetti personalizzati e trasmetterli durante la creazione di contenuti multimediali modificati
elementi.
Puoi ridimensionare i contenuti multimediali, il che può essere utile per risparmiare sulle risorse di elaborazione larghezza di banda molto elevata quando si ha a che fare con ingressi a risoluzione molto elevata, come video 4K o 8K. Ad esempio, per ridimensionare in modo proporzionale a un'altezza di 480 pixel:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf(Presentation.createForHeight(480)) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of(Presentation.createForHeight(480)))) .build();
In alternativa, puoi scalare in base a un determinato fattore, ad esempio, per dimezzare le dimensioni:
Kotlin
val editedMediaItem = EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setScale(.5f, .5f).build()))) .build();
Puoi configurare la rotazione nello stesso modo:
Kotlin
EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(Effects( /* audioProcessors= */ listOf(), /* videoEffects= */ listOf( ScaleAndRotateTransformation.Builder() .setRotationDegrees(90f) .build()) )).build()
Java
new EditedMediaItem.Builder(MediaItem.fromUri(uri)) .setEffects(new Effects( /* audioProcessors= */ ImmutableList.of(), /* videoEffects= */ ImmutableList.of( new ScaleAndRotateTransformation.Builder().setRotationDegrees(90f).build()))) .build();
Effetti video personalizzati
Il costruttore Effects
accetta un elenco di effetti audio e video da applicare.
Internamente, il framework degli effetti di Transformer converte l'elenco degli effetti video
in una sequenza di programmi GL Shar applicati in ordine. In alcuni casi,
il framework degli effetti è in grado di applicare più effetti con un unico programma shaker.
Ad esempio, un programma shaker può applicare più matrici consecutive
trasformazioni avanzate, con un conseguente miglioramento dell'efficienza e della qualità.
Gli effetti video sono supportati anche per l'anteprima in ExoPlayer, utilizzando
ExoPlayer.setVideoEffects
.
L'app demo include esempi di effetti video personalizzati.
Modifiche audio
Gli effetti audio vengono implementati applicando una sequenza di AudioProcessor
di Compute Engine all'audio RAW (PCM). ExoPlayer supporta il passaggio di processori audio
DefaultAudioSink.Builder
, che consente di visualizzare l'anteprima delle modifiche audio.