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.