Transformações

Transcodificar entre formatos

Você pode especificar os formatos de saída de áudio e vídeo que quer produzir ao criar o Transformer. Por exemplo, o código a seguir mostra como para 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 alterna automaticamente para transmuxing, ou seja, copiar as amostras compactadas do contêiner de entrada para o contêiner de saída sem modificação. Isso evita o custo computacional e a possível perda de qualidade do decodificação e 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

É possível 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 um clipe que contém 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();

Como otimizar os cortes

Ative o recurso para reduzir a latência do início de um vídeo otimização.

Kotlin

Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build()

Java

new Transformer.Builder(context)
    .experimentalSetTrimOptimizationEnabled(true)
    .build();

Isso acelera a exportação decodificando e recodificando o mínimo do vídeo possível, e juntar os dados recodificados com o resto do original vídeo. A otimização depende da capacidade de unir parte do arquivo de entrada com uma saída codificada recentemente, o que significa que o formato de saída do codificador e a o formato de entrada precisa ser compatível. Por exemplo, se o arquivo foi originalmente em um dispositivo com uma implementação de codificador diferente, é provável que não será possível aplicar a otimização. Para que a otimização seja bem-sucedida, o codificador fornecido ao Transformer por meio do EncoderFactory precisa ter um nível e um perfil compatíveis com o formato de entrada.

Esta otimização só funciona com entrada MP4 de recurso único, sem efeitos, exceto sem efeitos de vídeo op e rotações divisíveis em 90 graus. Se a otimização falha, o Transformer retorna automaticamente à exportação normal e relata o resultado da otimização em ExportResult.OptimizationResult.

Estamos validando essa funcionalidade e esperamos que ela se torne não experimental em uma versão posterior.

Edições de vídeos

EditedMediaItems tem 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, ou criar efeitos personalizados e transmiti-los ao criar uma mídia editada itens.

É 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 4k ou 8k. Por exemplo, para escalonar 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 escalonar com base em um determinado fator, por exemplo, para reduzir o tamanho pela metade:

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 é capaz de aplicar vários efeitos com um único programa de shader. Por exemplo, um programa de shader pode aplicar várias matrizes consecutivas transformações, o que melhora a eficiência e a qualidade.

Efeitos de vídeo também podem ser visualizados 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 usando uma sequência de AudioProcessor. instâncias em áudio bruto (PCM). O ExoPlayer oferece suporte à passagem de processadores de áudio para DefaultAudioSink.Builder, que permite visualizar edições de áudio.