Vista previa de las ediciones con CompositionPlayer

La biblioteca de Jetpack Media3 proporciona la API de CompositionPlayer, una potente implementación de Player para obtener una vista previa de las ediciones de video en tiempo real. Si tu app permite que los usuarios editen videos, como aplicar efectos, recortar o componer varios elementos multimedia de entrada, CompositionPlayer te ayuda a mostrar una vista previa precisa del resultado. Esto puede ser útil en los casos en los que no necesitas guardar las ediciones aplicadas o para validar que las ediciones estén configuradas según lo previsto antes de confirmarlas en el video final para la exportación.

¿Qué es CompositionPlayer?

CompositionPlayer es una implementación especializada de la interfaz Player, diseñada específicamente para reproducir objetos Composition. Una Composition define cómo se organizan los recursos multimedia de entrada, como los clips de video y las pistas de audio, y qué efectos de audio y video se deben aplicar a ellos. Para obtener más información sobre la Composition API, consulta Cómo definir una Composition de elementos multimedia.

El objetivo principal de CompositionPlayer es renderizar esta Composition, con todas las ediciones especificadas, en tiempo real, lo que permite a los usuarios ver exactamente cómo se verán sus ediciones antes de confirmar el proceso de exportación, que puede llevar mucho tiempo y recursos. Luego, se puede usar el mismo objeto Composition con una instancia de Transformer para la exportación, sobre la que puedes obtener más información en Cómo exportar una Composition.

CompositionPlayer en comparación con ExoPlayer

Si bien CompositionPlayer y ExoPlayer son implementaciones de Player en Media3, están optimizadas para diferentes casos de uso:

Función

CompositionPlayer

ExoPlayer

Entrada multimedia

Toma un solo objeto Composition, que puede constar de varias instancias de EditedMediaItem con efectos por elemento.

Toma un solo MediaItem o una lista de reproducción de instancias de MediaItem.

Cronograma

El cronograma y la duración se basan en toda la Composition.

El cronograma y la duración corresponden al MediaItem que se reproduce de forma activa.

Efectos

Los efectos se definen dentro de la Composition y se pueden aplicar a un EditedMediaItem individual o a toda la Composition.

Los efectos se configuran en la instancia de ExoPlayer con setVideoEffects(), y cada efecto se aplica de forma individual a cada elemento de la lista de reproducción.

En esencia, CompositionPlayer es más útil cuando necesitas renderizar un complejo Composition de contenido multimedia y efectos, por lo general, en un contexto de edición. Usa ExoPlayer para la reproducción de audio o video de uso general, o para obtener una vista previa de las ediciones de un solo recurso con setVideoEffects().

CompositionPlayer para la vista previa

La integración de CompositionPlayer en tu app implica algunos pasos clave. Primero, usa el patrón Builder para crear una instancia de CompositionPlayer, y, luego, configura el Composition que se reproducirá:

val compositionPlayer = CompositionPlayer.Builder(context).build()
compositionPlayer.setComposition(composition)
compositionPlayer.prepare()
compositionPlayer.play()

Para obtener instrucciones sobre cómo crear una Composition, consulta la sección Cómo crear una Composition.

Ten en cuenta que, como CompositionPlayer implementa la interfaz Player, puedes entonces configurar el resultado objetivo y controlar el reproductor a través de los métodos Player estándar.

Manejo de errores

Adjunta una instancia de Player.Listener a tu CompositionPlayer para reaccionar a los eventos y errores de reproducción. La devolución de llamada onPlayerError() también mostrará cualquier problema que provenga de componentes específicos de la edición, como Composition o VideoGraph.Factory. Lee la documentación sobre eventos de Player para obtener más detalles.

Consideraciones importantes

Estas son algunas funciones y limitaciones que debes tener en cuenta cuando uses CompositionPlayer:

  • Aunque CompositionPlayer se basa en la interfaz Player, algunos de sus comportamientos difieren de ExoPlayer, ya que depende de una Composition para la reproducción. Por ejemplo, CompositionPlayer solo admite configurar el modo de repetición en REPEAT_MODE_OFF o REPEAT_MODE_ALL.
  • De forma predeterminada, CompositionPlayer usa una SingleInputVideoGraph.Factory, pero si tu Composition usa más de una secuencia con elementos de imagen o video, debes usar setVideoGraphFactory() cuando compiles tu CompositionPlayer instancia para usar una MultipleInputVideoGraph.Factory. Una SingleInputVideoGraph.Factory es suficiente si solo una secuencia tiene elementos de imagen o video, y las demás son solo de audio.
  • Todos los elementos multimedia de tu Composition deben tener una duración establecida de forma explícita, ya sea con MediaItem.Builder.setImageDurationMs() para imágenes o con EditedMediaItem.Builder.setDurationUs() para audio o videos.

Se admiten los siguientes casos de uso:

  • Vista previa de un solo recurso
  • Vista previa de una sola secuencia (es decir, elementos multimedia secuenciales)
  • Vista previa de una sola secuencia de video + una sola secuencia de audio (por ejemplo, audio de fondo)

Los siguientes casos de uso están en desarrollo activo:

  • Vista previa de varios recursos, incluidos diseños como imagen en imagen, en paralelo y en cuadrícula, en los que se incluyen varias secuencias de video
  • Personalización de la canalización de edición con un motor de gráficos diferente

Solicitudes de funciones

Si tienes alguna solicitud de función o comentario para CompositionPlayer, registra un problema en el repositorio de GitHub de Media3.