Transcodificar entre formatos
Especifique 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, copiando as amostras compactadas do contêiner de entrada para o contêiner de saída sem modificações. Isso evita o custo computacional e a possível perda de qualidade da 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 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();
Como otimizar os cortes
Para reduzir a latência do corte do início de um vídeo, ative a otimização de corte.
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 possível do vídeo e juntando os dados recodificados com o restante do vídeo original. A otimização depende da capacidade de unir parte do arquivo de entrada
com a saída recém-codificada, o que significa que o formato de saída do codificador e o
formato de entrada precisam ser compatíveis. Por exemplo, se o arquivo foi originalmente
produzido em um dispositivo com uma implementação de codificador diferente, é provável
que não seja 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.
Essa otimização só funciona com entrada MP4 de recurso único, sem efeitos, exceto
efeitos de vídeo de operação e rotações divisíveis em 90 graus. Se a otimização
falhar, o Transformer voltará automaticamente à exportação normal e informará 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 serem aplicados em
ordem. A biblioteca inclui implementações de efeitos de vídeo para casos de uso comuns.
Além disso, você pode criar 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 entrada de resolução muito alta, como vídeos em 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 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.