Guías

Media3 1.11: Novedades

Lectura de 3 min
Ver el perfil de Toni Heidenreich
Toni Heidenreich Ingeniero de software, Android

Ya está disponible Media3 1.11. Esta versión, que impulsa la gran mayoría de las principales apps de contenido multimedia para Android, incluye funciones nuevas, correcciones de errores y mejoras en los componentes de reproducción, edición y de la IU. Estamos expandiendo nuestros módulos de la IU de Jetpack Compose con ranuras personalizables Player y valores predeterminados fáciles de usar, gestos interactivos, observadores de estado y carga previa de videos de formato corto con PlayerPool. También modernizamos la integración de Media3 Cast con compatibilidad con el selector de salida de SystemUI, presentamos una nueva extensión de red de cliente HTTP de Ktor y agregamos nuevas utilidades de multiplexación para archivos Ogg y WAV.

Sigue leyendo para conocer los aspectos más destacados y consulta las notas de la versión completas para obtener una lista exhaustiva de los cambios.

IU de reproducción y Compose

A medida que Android se convierte en Compose-first, seguimos expandiendo los módulos media3-ui-compose y media3-ui-compose-material3. Esta actualización introduce un control más detallado sobre el diseño del reproductor, patrones de interacción más enriquecidos y una integración más profunda con Material3.

Diseño de reproductor personalizable

El elemento componible Player de Material 3 ahora admite ranuras de contenido dedicadas para topControls, centerControls, bottomControls y errorOverlay. Puedes colocar tus propios elementos componibles o usar los valores predeterminados listos para usar publicados en PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

El elemento componible Player también integra la compatibilidad con FocusRequester, lo que permite una navegación fluida con el pad direccional y el teclado en Android TV, dispositivos plegables y entornos de escritorio. 

player_video.png
Ejemplo de un reproductor componible con controles personalizados

Gestos y control de velocidad de reproducción

PlaybackSpeedState ahora proporciona una API de avance rápido y cámara lenta. El demo-compose app muestra esto con un gesto de presión prolongada para avanzar rápidamente la reproducción y buscar con un doble toque. En combinación con ProgressSlider introducido en 1.10, la IU del reproductor de Compose ahora ofrece interacciones táctiles y de gestos enriquecidas listas para usar.

Carga previa de videos de formato corto con PlayerPool

Para las apps con feeds de contenido multimedia de ventana deslizante (por ejemplo, videos verticales de formato corto), administrar varias instancias de ExoPlayer de manera eficiente es un desafío común. Media3 1.11 introduce PlayerPool (en common-ktx) y rememberPooledPlayer (en ui-compose) para controlar el reciclaje y la carga previa del reproductor automáticamente.

El nuevo ShortFormPlayerScreen en demo-compose muestra esto en acción, un feed de paginación vertical en el que los reproductores se agrupan, se cargan previamente y se reciclan sin problemas a medida que el usuario se desplaza.

MiniController

Un nuevo elemento componible MiniController en media3-ui-compose-material3 proporciona una barra de reproducción compacta que muestra el título, el artista, la ilustración y el progreso del elemento actual junto con los controles de reproducción y pausa. Como todos nuestros elementos componibles predeterminados en media3-ui-compose-material3, MiniController admite la integración de color dinámico de Material3, lo que le permite adaptarse automáticamente al tema de fondo de pantalla del usuario.Esto es ideal para las funciones persistentes de hoja inferior o reproductor en miniatura, por ejemplo, mientras el usuario navega por el contenido o durante las sesiones de Cast activas.

mini_player.png
El MiniController de Media3 que muestra la imagen del álbum, los metadatos de contenido multimedia y los controles básicos

Titulares de estado expandidos para metadatos y errores

Agregamos varios titulares de estado reactivos nuevos a media3-ui-compose:

  • rememberCurrentMediaItemState: Observa los metadatos sobre el elemento que se está reproduciendo.
  • rememberPlaylistState: Observa la playlist completa y los índices activos.
  • rememberErrorState: Realiza un seguimiento de los errores de reproducción, con un elemento componible ErrorText coincidente y ErrorOverlay predeterminado en Material3.

Seguiremos trabajando en nuevas incorporaciones y más opciones de personalización en las próximas versiones. Comparte tus opiniones en el seguimiento de errores del proyecto.

Integración de Cast modernizada

Media3 1.11 actualiza la extensión de Cast con opciones de configuración programática y compatibilidad con el enrutamiento a nivel del SO.

CastParams y selector de salida de SystemUI

Ahora puedes configurar la extensión de Cast con CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

Si configuras setShowSystemOutputSwitcherOnCastIconClick(true), se configura MediaRouteButton para abrir el selector de salida de SystemUI nativo de Android en las versiones de plataforma compatibles, lo que proporciona una experiencia unificada de selector de salida.

Estado reactivo de MediaRouteButton en Compose

Las apps que usan Jetpack Compose ahora pueden agregar fácilmente el botón para transmitir (también conocido como botón de Cast), que observa automáticamente el estado del diálogo y se actualiza en consecuencia. No se necesita más lógica cuando se usa junto con CastPlayer de Media3.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
Botón de ruta de contenido multimedia de Media3 en una app que inicia el diálogo predeterminado del selector de salida

Mejoras principales de la reproducción y la sesión

Video de Eclipsa: Metadatos HDR dinámicos de HAGC (API 37+)

Video de Eclipsa promete una experiencia HDR más coherente en todos los dispositivos, con un blanco HDR de referencia coherente, un margen de maniobra adaptable según la pantalla y el entorno, lo que garantiza que la intención creativa se conserve en todos los dispositivos.

ExoPlayer ahora admite la reproducción de los metadatos temporizados de HAGC (ST 2094-50) necesarios para el contenido multimedia progresivo (MP4, Matroska). El reproductor combina automáticamente las pistas de metadatos de HAGC con la pista de video asociada y entrega los metadatos fuera de banda al decodificador en dispositivos con API 37+. En dispositivos más antiguos, ExoPlayer recurre sin problemas a proporcionar una experiencia de reproducción HDR estándar sin los ajustes.  

eclipsa.png
Ilustración para mostrar los beneficios del HDR de video de Eclipsa, como un contrato de color más coherente

Nueva extensión de cliente HTTP de Ktor

Un nuevo media3-datasource-ktor módulo de extensión proporciona KtorDataSource, respaldado por la pila HTTP de Ktor. Esto ofrece una alternativa de Kotlin-first y compatible con corrutinas a los módulos de fuente de datos Cronet y OkHttp existentes.

Conexiones asíncronas de MediaSession

MediaSession.Callback ahora incluye onConnectAsync(), que te permite procesar los intentos de conexión del controlador de forma asíncrona, por ejemplo, para verificar la autorización antes de aceptar una conexión. Puedes mostrar un Future inmediato con Futures.immediateFuture(ConnectionResult) para el mismo comportamiento que el onConnect existente. 

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

Valores predeterminados de MediaSession más seguros

Para las apps que no anulan onConnect ni onConnectAsync en MediaSession.Callback, la biblioteca ahora usa una configuración más segura de forma predeterminada. En particular, los datos de la sesión ya no se comparten de forma predeterminada con los controladores no confiables, lo que significa que las apps de terceros o que no son del sistema que no tienen acceso a las notificaciones tienen restringido el acceso a los datos de la sesión, a menos que implementes explícitamente estos métodos de devolución de llamada para autorizar la conexión.

Nuevas implementaciones de Muxer y análisis de contenedores

OggMuxer y WavMuxer

Agregamos dos nuevos multiplexores dedicados: OggMuxer para multiplexar transmisiones OPUS y VORBIS en archivos .ogg estándar, y WavMuxer para generar archivos de audio .wav PCM sin comprimir y de punto flotante.

Análisis de contenedores y referencias de pistas

  • Referencias de pistas MP4 (tref): Mp4Muxer.addTrackReference permite vincular metadatos dependientes o pistas auxiliares a transmisiones de video principales.
  • Extracción de capítulos: Los capítulos de QuickTime y Nero de archivos MP4 (.m4a, .m4b) y los capítulos de Matroska ahora se extraen como entradas de metadatos Chapter para la navegación de audiolibros y podcasts.

Usa el seguimiento de errores para informar errores o si tienes preguntas o solicitudes de funciones. Esperamos noticias tuyas.

Escrito por
Continuar leyendo