Transformações

Transcodificação entre formatos

Você pode especificar os formatos de áudio e vídeo de saída que quer produzir ao criar o Transformer. Por exemplo, o código a seguir mostra como configurar o Transformer para gerar vídeo H.264/AVC e áudio 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 o formato de mídia de entrada já corresponder às configurações de áudio ou vídeo, o Transformer alternará automaticamente para transmuxing, ou seja, copiará as amostras compactadas do contêiner de entrada para o de saída sem modificação. Isso evita o custo computacional e a potencial perda de qualidade da decodificação e da recodificação no mesmo formato.

Remover áudio ou vídeo

Remova áudio ou vídeo usando EditedMediaItem.Builder, por exemplo:

Kotlin

EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()

Java

new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();

Cortar um clipe

Você pode remover qualquer mídia fora dos carimbos de data/hora de início e término especificados definindo a configuração de recorte no item de mídia de entrada. Por exemplo, para produzir um clipe contendo apenas a mídia entre 10 e 20 segundos:

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();

Edições de vídeo

As EditedMediaItems têm listas de processadores de áudio e efeitos de vídeo para aplicar em ordem. A biblioteca inclui implementações de efeitos de vídeo para casos de uso comuns. Você também pode programar efeitos personalizados e transmiti-los ao criar itens de mídia editados.

É possível redimensionar mídia, o que pode ser útil para economizar recursos de processamento ou largura de banda ao lidar com entradas de resolução muito alta, como vídeos em 4K ou 8K. Por exemplo, para dimensionar proporcionalmente a 480 pixels de altura:

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();

Como alternativa, é possível dimensionar usando um determinado fator, por exemplo, para reduzir pela metade o tamanho:

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();

É possível configurar a rotação da mesma maneira:

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();

Efeitos de vídeo personalizados

O construtor Effects aceita uma lista de efeitos de áudio e vídeo para aplicar. Internamente, o framework de efeitos do Transformer converte a lista de efeitos de vídeo em uma sequência de programas de sombreador GL que são aplicados em ordem. Em alguns casos, o framework de efeitos pode aplicar vários efeitos com um programa de sombreador. Por exemplo, um programa de sombreador pode aplicar várias transformações de matriz consecutivas, o que melhora a eficiência e a qualidade.

Os efeitos de vídeo também têm suporte para visualização no ExoPlayer, usando ExoPlayer.setVideoEffects.

O app de demonstração inclui exemplos de efeitos de vídeo personalizados.

Edições de áudio

Os efeitos de áudio são implementados aplicando uma sequência de instâncias AudioProcessor ao áudio bruto (PCM). O ExoPlayer oferece suporte à transmissão de processadores de áudio para o DefaultAudioSink.Builder, o que permite visualizar edições de áudio.