Transcodificar entre formatos
Puedes especificar los formatos de audio y video de salida que deseas producir cuando compilas Transformer. Por ejemplo, en el siguiente código, se muestra cómo configurar Transformer para que genere video H.264/AVC y 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();
Si el formato de medios de entrada ya coincide con la configuración de audio o video, Transformer cambia automáticamente a transmuxing, es decir, copia las muestras comprimidas del contenedor de entrada al contenedor de salida sin modificaciones. Esto evita el costo de procesamiento y la posible pérdida de calidad de la decodificación y la recodificación en el mismo formato.
Cómo quitar audio o video
Quita el audio o el video con EditedMediaItem.Builder
, por ejemplo:
Kotlin
EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build()
Java
new EditedMediaItem.Builder(inputMediaItem).setRemoveAudio(true).build();
Cómo cortar un clip
Puedes quitar cualquier contenido multimedia fuera de las marcas de tiempo de inicio y finalización especificadas mediante la configuración de recorte en el elemento multimedia de entrada. Por ejemplo, para producir un clip que contenga solo el contenido multimedia de entre 10 y 20 segundos, haz lo siguiente:
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();
Ediciones de videos
Las EditedMediaItems
tienen listas de procesadores de audio y efectos de video que se pueden aplicar en orden. La biblioteca incluye implementaciones de efectos de video para casos de uso comunes, o bien puedes escribir efectos personalizados y pasarlos cuando compilas elementos multimedia editados.
Puedes cambiar la escala del contenido multimedia, lo que puede ser útil para ahorrar en recursos de procesamiento o ancho de banda cuando se trata de entradas de muy alta resolución, como videos en 4K u 8K. Por ejemplo, para escalar proporcionalmente a 480 píxeles de alto:
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, puedes ajustar la escala según un factor determinado, por ejemplo, para reducir a la mitad el tamaño:
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();
Puedes configurar la rotación de la misma manera:
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();
Efectos de video personalizados
El constructor Effects
acepta una lista de efectos de audio y video que se aplicarán.
De forma interna, el framework de efectos de Transformer convierte la lista de efectos de video en una secuencia de programas sombreadores GL que se aplican en orden. En algunos casos, el framework de efectos puede aplicar varios efectos con un programa sombreador.
Por ejemplo, un programa de sombreadores puede aplicar varias transformaciones de matrices consecutivas, lo que mejora la eficiencia y la calidad.
Los efectos de video también son compatibles con la vista previa en ExoPlayer, mediante ExoPlayer.setVideoEffects
.
La app de demostración incluye ejemplos de efectos de video personalizados.
Ediciones de audio
Los efectos de audio se implementan mediante la aplicación de una secuencia de instancias AudioProcessor
al audio sin procesar (PCM). ExoPlayer admite el paso de procesadores de audio a DefaultAudioSink.Builder
, lo que permite obtener una vista previa de las ediciones de audio.