Transformaciones

Transcodifica entre formatos

Puedes especificar los formatos de salida de audio y video que quieres producir cuando Transformer. Por ejemplo, el siguiente código muestra cómo para configurar Transformer para que emita 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 entrada de medios ya coincide con la configuración de audio video, Transformer cambia automáticamente a transmuxing, es decir, copia las muestras comprimidas del contenedor de entrada al contenedor de salida sin en caso de que haya modificaciones. Esto evita el costo de procesamiento y la posible pérdida de calidad de y volver a codificarlos en el mismo formato.

Cómo quitar audio o video

Quita audio o 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 la configuración de recorte en el elemento multimedia de entrada. Por ejemplo, para producir un clip que contenga solo el contenido multimedia entre 10 y 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();

Optimizando los recortes

Para reducir la latencia al cortar el comienzo de un video, habilita esta opción. la optimización de las conversiones.

Kotlin

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

Java

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

Esto acelera la exportación, ya que decodifica y vuelve a codificar la menor cantidad de partes del video. posible y, luego, unir los datos recodificados con el resto de la video. La optimización se basa en poder unir parte del archivo de entrada con una salida codificada recientemente, lo que significa que el formato de salida del codificador y la el formato de entrada debe ser compatible. Por ejemplo, si el archivo se creó originalmente producido en un dispositivo con una implementación de codificador diferente, es probable que que no será posible aplicar la optimización. Para que la optimización tenga éxito, se usa el codificador proporcionado a Transformer a través del EncoderFactory debe tener un nivel y un perfil compatibles con el formato de entrada.

Esta optimización solo funciona con la entrada MP4 de un solo elemento, sin efectos, excepto No hay efectos de video operacional ni rotaciones divisibles por 90 grados. Si la optimización falla, Transformer recurre automáticamente a la exportación normal e informa el resultado de la optimización en ExportResult.OptimizationResult.

Estamos validando esta funcionalidad y esperamos que no sea experimental en una versión posterior.

Ediciones de videos

EditedMediaItems tienen listas de procesadores de audio y efectos de video para aplicar en en el orden personalizado. La biblioteca incluye implementaciones de efectos de video para casos de uso comunes, o puedes escribir efectos personalizados y pasarlos cuando crees contenido multimedia editado elementos.

Puedes reescalar los medios, 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 4K u 8K. Por ejemplo, para escalar de manera proporcional 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 escalar por 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 para aplicar. 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 solo programa sombreador. Por ejemplo, un programa sombreador puede aplicar varias matrices consecutivas transformaciones, lo que mejora la eficiencia y la calidad.

Los efectos de video también son compatibles con la vista previa en ExoPlayer, con ExoPlayer.setVideoEffects

La app de demostración incluye ejemplos de efectos de video personalizados.

Ediciones de audio

Para implementar los efectos de audio, se debe aplicar una secuencia de AudioProcessor. de instancias a audio sin procesar (PCM). ExoPlayer admite el paso de procesadores de audio al DefaultAudioSink.Builder, que permite obtener una vista previa de las ediciones de audio.