Transcodificación entre formatos
Puedes especificar los formatos de audio y video de salida que deseas producir cuando compilas Transformer. Por ejemplo, el siguiente código muestra cómo configurar Transformer para generar 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 contenido multimedia de entrada ya coincide con las configuraciones de audio o video, Transformer cambia automáticamente a la transmuxing, es decir, copia las muestras comprimidas del contenedor de entrada al contenedor de salida sin modificaciones. Esto evita el costo computacional 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 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 recortar un clip
Puedes quitar cualquier contenido multimedia fuera de las marcas de tiempo de inicio y finalización especificadas si configuras el recorte en el elemento de contenido 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( MediaItem.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();
Cómo editar listas de MP4
Para un recorte más rápido, Transformer admite listas de edición de MP4, lo que permite ediciones más eficientes de "solo recorte" sin una recodificación completa del video. Este método utiliza muestras codificadas existentes y un anuncio previo al video dentro de la lista de edición, que le indica al reproductor que comience la reproducción en un punto específico, lo que omite de manera efectiva el segmento inicial no deseado.
Para que las ediciones de solo recorte sean mucho más rápidas, llama a experimentalSetMp4EditListTrimEnabled(true).
Kotlin
Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build()
Java
new Transformer.Builder(context).experimentalSetMp4EditListTrimEnabled(true).build();
Cómo optimizar los recortes
Para reducir la latencia del recorte del comienzo de un video, habilita la optimización del recorte.
Kotlin
Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build()
Java
new Transformer.Builder(context).experimentalSetTrimOptimizationEnabled(true).build();
Esto acelera la exportación mediante la decodificación y la recodificación de la menor cantidad posible del video y, luego, la unión de los datos recodificados con el resto del video original. La optimización se basa en la capacidad de unir parte del archivo de entrada con la salida recién codificada, lo que significa que el formato de salida del codificador y el formato de entrada deben ser compatibles. Por ejemplo, si el archivo se produjo originalmente en un dispositivo con una implementación de codificador diferente, es probable que no sea posible aplicar la optimización.
Para que la optimización se realice correctamente, el codificador proporcionado a Transformer a través de EncoderFactory debe tener un nivel y un perfil compatibles con el formato de entrada.
Esta optimización solo funciona con entradas MP4 de un solo recurso sin efectos, excepto los efectos de video no op y las rotaciones divisibles por 90 grados. Si falla la optimización, Transformer vuelve automáticamente a la exportación normal y muestra el resultado de la optimización en ExportResult.OptimizationResult.
Estamos validando esta funcionalidad y esperamos que deje de ser experimental en una versión posterior.
Ediciones de video
EditedMediaItems tiene listas de procesadores de audio y efectos de video para 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 compiles elementos de contenido multimedia editados.
Puedes cambiar la escala del contenido multimedia, lo que puede ser útil para ahorrar recursos de procesamiento o ancho de banda cuando se trata de entradas de alta resolución, como videos de 4K o 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 escalar por un factor determinado, por ejemplo, para reducir el tamaño a la mitad:
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.
Internamente, el framework de efectos de Transformer convierte la lista de efectos de video en una secuencia de programas de sombreador GL que se aplican en orden. En algunos casos, el framework de efectos puede aplicar varios efectos con un programa de sombreador.
Por ejemplo, un programa de sombreador puede aplicar varias transformaciones de matriz consecutivas, lo que mejora la eficiencia y la calidad.
Los efectos de video también se admiten para la vista previa en ExoPlayer, con ExoPlayer.setVideoEffects. Para ver un ejemplo de cómo usar esta API, consulta
la app de demostración de efectos.
La app de demostración incluye ejemplos de efectos de video personalizados.
entrada de imagen
Transformer admite entradas de imágenes tratándolas como clips de video estáticos. Para configurar una imagen como fuente de entrada, sigue estos pasos:
Crea un
MediaItemconMediaItem.Builder. Para especificar la duración de la imagen en el video de salida, llama asetImageDurationMs.Construye un
EditedMediaItemque ajuste elMediaItem. Especifica la velocidad de fotogramas objetivo para la transmisión de video generada conEditedMediaItem.Builder#setFrameRate.
En el siguiente ejemplo, se muestra cómo configurar una entrada de imagen para generar un video de 5 segundos a 30 fotogramas por segundo:
Kotlin
val imageMediaItem = MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build() val editedImageItem = EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build()
Java
MediaItem imageMediaItem = new MediaItem.Builder() .setUri(imageUri) .setImageDurationMs(5000) // 5 seconds .build(); new EditedMediaItem.Builder(imageMediaItem) .setFrameRate(30) // 30 frames per second .build();
Ediciones de audio
Los efectos de audio se implementan aplicando una secuencia de instancias de 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.