Ya está disponible Media3 1.9.0. Además de las correcciones de errores y las mejoras de rendimiento habituales, la versión más reciente también contiene cuatro módulos nuevos o reescritos en gran medida:
-
media3-inspector: Extrae metadatos y fotogramas fuera de la reproducción. -
media3-ui-compose-material3: Compila una IU de medios básica de Compose Material 3 en pocos pasos -
media3-cast: Controla automáticamente las transiciones entre la transmisión con Cast y la reproducción local. -
media3-decoder-av1: Reproducción de AV1 coherente con el decodificador de extensión reescrito basado en la biblioteca dav1d
También agregamos mejoras en la administración de la memoria y el almacenamiento en caché a PreloadManager, y proporcionamos varias simplificaciones nuevas de ExoPlayer, Transformer y MediaSession.
Esta versión también te brinda el primer acceso experimental a CompositionPlayer para obtener una vista previa de las ediciones de medios.
Sigue leyendo para obtener más información y, como siempre, consulta las notas de la versión completas para obtener una descripción general exhaustiva de los cambios en esta versión.
Extrae metadatos y fotogramas fuera de la reproducción
Hay muchos casos en los que deseas inspeccionar contenido multimedia sin iniciar la reproducción. Por ejemplo, es posible que desees detectar qué formatos contiene o cuál es su duración, o bien recuperar miniaturas.
El nuevo módulo media3-inspector combina todas las utilidades para inspeccionar contenido multimedia sin reproducción en un solo lugar:
-
MetadataRetrieverpara leer la duración, el formato y los metadatos estáticos de unMediaItem -
FrameExtractorpara obtener fotogramas o miniaturas de un elemento. -
MediaExtractorCompatcomo reemplazo directo de la clase MediaExtractor de la plataforma de Android para obtener información detallada sobre las muestras del archivo
MetadataRetriever y FrameExtractor siguen un patrón AutoCloseable simple. Consulta nuestras nuevas páginas de guía para obtener más detalles.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
Crea una IU de medios básica de Material 3 con Compose en unos pocos pasos
En versiones anteriores, comenzamos a proporcionar código de conector entre los elementos de la IU de Compose y tu instancia de Player. Con Media3 1.9.0, agregamos un nuevo módulo media3-ui-compose-material3 con botones y elementos de contenido de Material 3 con diseño completo. Te permiten compilar una IU de medios en unos pocos pasos y, al mismo tiempo, te brindan toda la flexibilidad para personalizar el diseño. Si prefieres crear tu propio estilo de IU, puedes usar los componentes básicos que se encargan de toda la lógica de actualización y conexión, de modo que solo debas concentrarte en diseñar el elemento de la IU. Consulta nuestras páginas de guía extendida para los módulos de la IU de Compose.
También seguimos trabajando en más componentes de Compose, como una barra de búsqueda prediseñada, un reemplazo completo y listo para usar de PlayerView, así como la integración de subtítulos y anuncios.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
IU del reproductor de Compose simple con elementos listos para usar
Controlar automáticamente las transiciones entre la reproducción local y la de Cast
Se reescribió el CastPlayer en el módulo media3-cast para controlar automáticamente las transiciones entre la reproducción local (por ejemplo, con ExoPlayer) y la reproducción remota de Cast.
Cuando configures tu MediaSession, simplemente crea un CastPlayer alrededor de tu ExoPlayer y agrega un MediaRouteButton a tu IU. ¡Listo!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Nueva integración de CastPlayer en la app de demostración de la sesión de Media3
Reproducción de AV1 coherente con la extensión reescrita basada en dav1d
La versión 1.9.0 contiene un módulo de extensión AV1 completamente reescrito basado en la popular biblioteca dav1d.
Al igual que con todos los módulos de decodificador de extensiones, ten en cuenta que se requiere compilar desde la fuente para agrupar el código nativo pertinente correctamente. Incluir un decodificador proporciona coherencia y compatibilidad de formato en todos los dispositivos, pero, como ejecuta la decodificación en tu proceso, es más adecuado para el contenido en el que puedes confiar.
Integra el almacenamiento en caché y la administración de memoria en PreloadManager
También mejoramos nuestro PreloadManager. Ya te permitía cargar previamente contenido multimedia en la memoria fuera de la reproducción y, luego, transferirlo sin problemas a un reproductor cuando fuera necesario. Si bien era bastante eficiente, debías tener cuidado de no exceder los límites de memoria por cargar previamente demasiado contenido de forma accidental. Por lo tanto, con Media3 1.9.0, agregamos dos funciones que hacen que esto sea mucho más fácil y estable:
-
Compatibilidad con el almacenamiento en caché : Cuando definas qué tan lejos se debe realizar la carga previa, ahora puedes elegir
PreloadStatus.specifiedRangeCached(0, 5000)como estado objetivo para los elementos cargados previamente. Esto agregará el rango especificado a tu caché en el disco en lugar de cargar los datos en la memoria. Con esto, puedes proporcionar un rango mucho más amplio de elementos para la carga previa, ya que los que están más lejos del elemento actual ya no necesitan ocupar memoria. Ten en cuenta que esto requiere establecer unCacheenDefaultPreloadManager.Builder. -
Administración automática de la memoria : También actualizamos nuestra interfaz de
LoadControlpara controlar mejor el caso de precarga, por lo que ahora puedes establecer un límite superior explícito de memoria para todos los elementos precargados en la memoria. El valor predeterminado es 144 MB, y puedes configurar el límite enDefaultLoadControl.Builder. ElDefaultPreloadManagerdetendrá automáticamente la carga previa una vez que se alcance el límite y liberará automáticamente la memoria de los elementos de menor prioridad si es necesario.
Aprovecha los nuevos comportamientos predeterminados simplificados en ExoPlayer
Como siempre, también agregamos muchas mejoras incrementales a ExoPlayer. Estos son solo algunos ejemplos:
-
Silenciar y reactivar el audio: Ya teníamos un método
setVolume, pero ahora agregamos los métodos de convenienciamuteyunmutepara restablecer fácilmente el volumen anterior sin tener que hacer un seguimiento por tu cuenta. -
Detección de reproductor atascado: En algunos casos poco frecuentes, el reproductor puede atascarse en un estado de almacenamiento en búfer o reproducción sin avanzar, por ejemplo, debido a problemas de códec o configuraciones incorrectas. Tus usuarios se sentirán molestos, pero nunca verás estos problemas en tus estadísticas. Para que esto sea más evidente, el reproductor ahora informa un
StuckPlayerExceptioncuando detecta un estado atascado. - Wakelock de forma predeterminada: Anteriormente, la administración de bloqueo de activación era opcional, lo que generaba casos extremos difíciles de encontrar en los que el progreso de la reproducción podía demorarse mucho cuando se ejecutaba en segundo plano. Ahora, esta función es opcional, por lo que no tienes que preocuparte por ella y también puedes quitar todo el control manual de la activación alrededor de la reproducción.
-
Parámetro de configuración simplificado para la lógica del botón de subtítulos: Cambiar
TrackSelectionParameterspara que diga "activar o desactivar los subtítulos" fue sorprendentemente difícil de hacer bien, por lo que agregamos una opción booleana simpleselectTextByDefaultpara este caso de uso.
Simplifica tus preferencias de botones de medios en MediaSession
Hasta ahora, definir tus preferencias sobre qué botones deberían aparecer en el panel de notificaciones de contenido multimedia en Android Auto o WearOS requería definir comandos y botones personalizados, incluso si solo querías activar un método de reproductor estándar.
Media3 1.9.0 tiene una nueva función que simplifica mucho este proceso: ahora puedes definir tus preferencias de botones de medios con un comando de reproductor estándar, sin necesidad de controlar comandos personalizados.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
Preferencias de botones de medios con botón de avance rápido
CompositionPlayer para la vista previa en tiempo real
La versión 1.9.0 presenta CompositionPlayer con una nueva anotación @ExperimentalApi. La anotación indica que está disponible para la experimentación, pero aún está en desarrollo.
CompositionPlayer es un componente nuevo de las APIs de edición de Media3 diseñado para la vista previa en tiempo real de las ediciones de medios. CompositionPlayer se basa en la interfaz familiar de Media3 Player y permite que los usuarios vean sus cambios en acción antes de confirmar el proceso de exportación. Utiliza el mismo objeto Composition que pasarías a Transformer para la exportación, lo que optimiza el flujo de trabajo de edición al unificar el modelo de datos para la vista previa y la exportación.
Te recomendamos que comiences a usar CompositionPlayer y compartas tus comentarios, y que estés atento a las próximas publicaciones y actualizaciones de la documentación para obtener más detalles.
InAppMuxer como muxer predeterminado en Transformer
Transformer ahora usa InAppMp4Muxer como el multiplexor predeterminado para escribir archivos de contenedor multimedia. Internamente, InAppMp4Muxer depende del módulo Muxer de Media3, lo que proporciona un comportamiento coherente en todas las versiones de la API.
Ten en cuenta que, si bien Transformer ya no usa el MediaMuxer de la plataforma de Android de forma predeterminada, puedes proporcionar FrameworkMuxer.Factory a través de setMuxerFactory si tu caso de uso lo requiere.
Nuevas APIs de ajuste de velocidad
La versión 1.9.0 simplifica las APIs de ajuste de velocidad para la edición de medios. Presentamos nuevos métodos directamente en EditedMediaItem.Builder para controlar la velocidad, lo que hace que la API sea más intuitiva. Ahora puedes cambiar la velocidad de un clip llamando a setSpeed(SpeedProvider provider) en el EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
Este nuevo enfoque reemplaza el método anterior de usar Effects#createExperimentalSpeedChangingEffects(), que dejamos de usar y quitaremos en una versión futura.
Presentamos los tipos de pistas para EditedMediaItemSequence
En la versión 1.9.0, EditedMediaItemSequence requiere que se especifiquen los tipos de pistas de salida deseados durante la creación de la secuencia. Este cambio garantiza que el manejo de pistas sea más explícito y sólido en toda la composición.
Esto se hace a través de un nuevo constructor EditedMediaItemSequence.Builder que acepta un conjunto de tipos de seguimiento (p.ej., C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Para simplificar la creación, agregamos nuevos métodos de conveniencia estáticos:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Te recomendamos que migres al nuevo constructor o a los métodos de conveniencia para obtener definiciones de secuencias más claras y confiables.
Ejemplo de creación de una secuencia solo de video:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
Si tienes preguntas, solicitudes de funciones o encuentras errores, comunícate con nosotros a través de la herramienta de seguimiento de errores de Media3. Esperamos noticias tuyas.
Seguir leyendo
-
Novedades sobre productos
Si eres desarrollador de Android y quieres implementar funciones innovadoras basadas en IA en tu app, hace poco lanzamos nuevas y potentes actualizaciones.
Thomas Ezan • Lectura de 3 min
-
Novedades sobre productos
Android 17 alcanzó la versión beta 4, la última versión beta programada de este ciclo de lanzamiento, un hito fundamental para la compatibilidad de las apps y la estabilidad de la plataforma.
Daniel Galpin • Lectura de 4 min
-
Novedades sobre productos
Hacer de Google Play la experiencia más segura y confiable posible Hoy anunciamos un nuevo conjunto de actualizaciones de políticas y una función de transferencia de cuentas para mejorar la privacidad de los usuarios y proteger tu empresa del fraude.
Bennet Manuel • Lectura de 3 min
Mantente al día
Recibe la información más reciente sobre el desarrollo de Android en tu bandeja de entrada todas las semanas.