Trasformazioni

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.