Transformaciones

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.