Transcodifica tra formati
Puoi specificare i formati audio e video di output che vuoi produrre durante la creazione di Transformer. Ad esempio, il codice seguente mostra come 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 audio o video, Transformer passa automaticamente al transmuxing, ovvero copiando i campioni compressi dal contenitore di input al contenitore di output senza modifiche. In questo modo si evitano i costi di calcolo e la potenziale perdita di qualità della decodifica e della ricodifica nello stesso formato.
Rimuovere audio o video
Rimuovi audio o 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 tutti i contenuti multimediali al di fuori dei timestamp di inizio e 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();
Modifiche video
EditedMediaItems
include elenchi di processori audio ed effetti video da applicare in ordine. che include implementazioni di effetti video per casi d'uso comuni. In alternativa, puoi scrivere effetti personalizzati e trasmetterli durante la creazione di elementi multimediali modificati.
Puoi ridimensionare i contenuti multimediali, con un conseguente risparmio di risorse di elaborazione o larghezza di banda quando devi gestire input a risoluzione molto elevata, ad esempio video in 4K o 8K. Ad esempio, per ridimensionare proporzionalmente 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 ridimensionare in base a un determinato fattore, ad esempio, per dimezzare la dimensione:
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 di Shader GL che vengono applicati in ordine. In alcuni casi,
il framework degli effetti è in grado di applicare più effetti con un unico programma Shader.
Ad esempio, un programma mesh può applicare più trasformazioni
di matrici consecutive, migliorando l'efficienza e la qualità.
Gli effetti video sono supportati anche per l'anteprima in ExoPlayer, utilizzando
ExoPlayer.setVideoEffects
.
L'app dimostrativa include esempi di effetti video personalizzati.
Modifiche audio
Gli effetti audio vengono implementati applicando una sequenza di istanze AudioProcessor
all'audio non elaborato (PCM). ExoPlayer supporta il passaggio dei processori audio a DefaultAudioSink.Builder
, che consente di visualizzare l'anteprima delle modifiche audio.