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
CompositionPlayerse basa en la interfazPlayer, algunos de sus comportamientos difieren deExoPlayer, ya que depende de unaCompositionpara la reproducción. Por ejemplo,CompositionPlayersolo admite configurar el modo de repetición enREPEAT_MODE_OFFoREPEAT_MODE_ALL. - De forma predeterminada,
CompositionPlayerusa unaSingleInputVideoGraph.Factory, pero si tu Composition usa más de una secuencia con elementos de imagen o video, debes usarsetVideoGraphFactory()cuando compiles tuCompositionPlayerinstancia para usar unaMultipleInputVideoGraph.Factory. UnaSingleInputVideoGraph.Factoryes 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 conEditedMediaItem.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.