Media3

Admite bibliotecas para casos de uso de contenido multimedia.
Actualización más reciente Versión estable Versión potencial Versión beta Versión alfa
21 de octubre de 2026 1.11.1 - - 1.12.0-alpha01

Cómo declarar dependencias

Para agregar una dependencia en Media3, debes agregar el repositorio de Maven de Google a tu proyecto. Consulta el repositorio Maven de Google para obtener más información.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

Groovy

dependencies {
    def media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"
    // For applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")
    // For applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Para obtener más información sobre las dependencias, consulta Cómo agregar dependencias de compilación.

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Puedes usar la Herramienta de seguimiento de errores de Media3 para encontrar respuestas a preguntas, problemas conocidos y solicitudes de funciones, así como para informar problemas nuevos.

Versión 1.12.0

Versión 1.12.0-alpha01

21 de octubre de 2026

La versión 1.12.0-alpha01 contiene las siguientes confirmaciones.

  • Biblioteca común:
    • Se agregó C.COLOR_SPACE_DISPLAY_P3 y se admite el espacio de color Display P3 en las asignaciones de color ISO MediaFormatUtil y ColorInfo.
    • Se agregó un registro central de Flags para administrar las marcas de funciones experimentales y el lanzamiento en etapas (Flags.setCanaryModeEnabled). Se migraron muchos métodos existentes de @ExperimentalApi para usar la nueva API de marcas.
    • Agrega MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories y MediaMetadata.Builder.setCategories(List<String>).
    • Reemplaza androidx.media3.common.util.NonNullApi por JSpecify org.jspecify.annotations.NullMarked.
  • ExoPlayer:
    • Se corrigió un problema por el que la reproducción de varios períodos de DASH se detenía cuando no se cargaba el primer fragmento del siguiente período (#3396).
    • Informa wasCanceled = true en AnalyticsListener.onLoadError y MediaSourceEventListener.onLoadError cuando se agoten los reintentos de carga.
    • Se agregó compatibilidad para registrar varias instancias de VideoFrameMetadataListener con ExoPlayer.addVideoFrameMetadataListener y ExoPlayer.removeVideoFrameMetadataListener, y se dieron de baja ExoPlayer.setVideoFrameMetadataListener y ExoPlayer.clearVideoFrameMetadataListener.
    • Agrega compatibilidad con anuncios en contenido de varios períodos (p.ej., DASH) dividiendo y compensando el AdPlaybackState para cada período.
    • Se corrigió la condición de carrera en PreCacheHelper, en la que cancelar una solicitud de preparación en curso aún podía iniciar descargas en segundo plano.
    • Limita setLoadOnlySelectedTracks(true) en ProgressiveMediaSource y DefaultMediaSourceFactory para filtrar solo las pistas de video y de imagen no seleccionadas. Las pistas de audio y texto siempre se cargan para permitir el cambio de pista sin problemas y sin volver a almacenar en búfer.
    • Habilitar setLoadOnlySelectedTracks(true) de forma predeterminada en ProgressiveMediaSource y DefaultMediaSourceFactory. Esto ahorra memoria y permite que los cálculos de asignación de búfer de DefaultLoadControl funcionen con mayor precisión cuando no se seleccionan todas las pistas. Ten en cuenta que esto puede provocar un almacenamiento en búfer adicional si las pistas de video o imagen no seleccionadas se habilitan recientemente durante la reproducción.
    • Se corrigió un problema por el que Player.getCurrentPosition() podía devolver valores obsoletos (que se actualizaban solo unas pocas veces por segundo) cuando se habilitaba la programación dinámica (#3286).
    • Se corrigió un problema por el que una disminución o un restablecimiento inesperados en la posición del cabezal de reproducción de AudioTrack se podían tratar de forma incorrecta como un desbordamiento de números enteros, lo que provocaba que la reproducción se detuviera en el almacenamiento en búfer (#3407).
    • Quita el DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean) experimental.
    • Se evitan las fallas y las reactivaciones innecesarias del procesador cuando se regresa de anuncios o intersticiales al contenido recortado al final (#3371).
    • Se corrigió un problema por el que un error del renderizador en un elemento de la lista de reproducción que se reproduciría a continuación podía interrumpir de forma prematura la reproducción actual cuando se habilitaba Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Se corrigió un NullPointerException que podía ocurrir si ExoPlayer realizaba la transición de los renderizadores a un período de contenido multimedia no preparado cuando se habilitaba Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Se corrigió un problema por el que los fotogramas de video se podían omitir o descartar de forma inesperada durante la programación dinámica cuando se habilitaba Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS.
    • Se corrigió un error ArrayIndexOutOfBoundsException en los objetos de escucha de estadísticas que se producía cuando se detenía la reproducción durante un anuncio en una transmisión en vivo (#3423).
    • Se corrigió un problema por el que PreloadMediaSource podía publicar de forma inesperada un evento de precarga cuando nunca se llamaba a preload() (#3408).
    • Se corrigió un problema por el que se ignoraba Format.subsampleOffsetUs para las pistas de metadatos, lo que causaba marcas de tiempo de reproducción incorrectas en los comandos de empalme SCTE-35 decodificados (#3413).
    • Se corrigió una fuga de memoria en PreloadMediaSource y DefaultPreloadManager cuando se llama a preload() varias veces en la misma fuente (#3445).
    • Se corrigió un error NullPointerException que se producía cuando se liberaba AdsMediaSource mientras estaba pendiente una actualización del cronograma de contenido (#3442).
    • Se corrigió un problema por el que la reproducción de contenido multimedia progresivo podía saltar a la posición incorrecta cuando fallaba una carga después de una búsqueda (o cuando se iniciaba la reproducción en una posición distinta de cero) y se volvía a intentar (#3440).
    • Se agregó una solución alternativa para el decodificador H.264 de Xiaomi TV Stick 4K (MiTV-AYFR0) que se congela en los cambios de resolución sin interrupciones (#3457).
    • Se corrigió una NullPointerException en SteeringManifestTracker que se producía cuando se detenía el seguimiento antes de que se ejecutara una devolución de llamada de error o de finalización de carga publicada (#3443).
    • Se agregó compatibilidad con la reproducción de metadatos cronometrados de HAGC (ST 2094-50) desde pistas de metadatos en caja mebx en archivos MP4.
    • Se solucionó un problema por el que se podían omitir los períodos de contenido multimedia de preparación lenta en una playlist.
  • CompositionPlayer:
    • Admite la configuración de la velocidad de fotogramas de la agregación de fotogramas de video con Composition.Builder.setVideoFrameAggregationParameters para los flujos de trabajo de reproducción.
    • Se corrigieron las pérdidas de fotogramas en composiciones de varias secuencias causadas por discrepancias en la cuantización o el redondeo de marcas de tiempo. Para ello, se selecciona el fotograma con la marca de tiempo más cercana durante la agregación de fotogramas. Esto solo se habilita a partir de la API 29, ya que requiere mantener un fotograma adicional en tránsito por secuencia de video.
  • Transformador:
    • Se admite la configuración de la velocidad de fotogramas de la agregación de fotogramas de video con Composition.Builder.setVideoFrameAggregationParameters para los flujos de trabajo de exportación.
    • Se corrigieron las pérdidas de fotogramas en composiciones de varias secuencias causadas por discrepancias en la cuantización o el redondeo de marcas de tiempo. Para ello, se selecciona el fotograma con la marca de tiempo más cercana durante la agregación de fotogramas. Esto solo se habilita a partir de la API 29, ya que requiere mantener un fotograma adicional en tránsito por secuencia de video.
    • Respeta Transformer#setAudioMimeType(AUDIO_RAW) cuando se usan AudioProcessors. Antes de esta corrección, solicitar MimeTypes.AUDIO_RAW y aplicar un AudioProcessor generaba un resultado comprimido.
  • Selección de pistas:
    • Se corrigió un problema por el que se prefería incorrectamente una pista SDR en lugar de una pista Dolby Vision compatible en algunos dispositivos (#3135).
  • Extractores:
    • Mp4Extractor: Se corrigió el análisis de la caja dOps para Opus en MP4, en el que PreSkip, InputSampleRate y OutputGain no se convertían de big-endian a little-endian, lo que provocaba que se descartaran los primeros ~299 ms de audio cuando no había una lista de edición presente (#3431).
    • Se quitaron Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES y FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, ya que el análisis de dependencia de muestras dentro del GOP para H.264 y H.265 está habilitado de forma predeterminada.
    • Mp4Extractor: Se corrigió el análisis de metadatos de ubicación de los cuadros xyz que contienen coordenadas de altitud para propagar Mp4LocationData.
    • Se agregó ExtractorUtil.getFramesPerEncodedSample para calcular la cantidad de fotogramas de audio por muestra para los formatos de audio codificados (#3367).
    • Se agregó FLAG_READ_XMP_METADATA a Mp4Extractor para extraer metadatos de XMP de los cuadros de UUID de nivel superior.
    • Se corrigió el audio AC-3, DTS y LPCM dañado cuando se reproduce contenido MPEG-PS de estilo DVD, quitando el encabezado de transmisión secundaria private_stream_1 de cada paquete PES en PsExtractor antes de que la carga útil se pase al lector de audio (#3327).
    • Se corrigió la falla en FragmentedMp4Extractor cuando un cuadro tfdt de la versión 1 codifica un baseMediaDecodeTime negativo (#3412).
    • MPEG-TS: Se agregó compatibilidad con el análisis de mensajes SEI de disposición de empaquetado de fotogramas H.264 y H.265 para propagar Format.stereoMode (#3419).
    • Se analizaron los datos de configuración del perfil 20 de Dolby Vision y se rechazaron los perfiles de Dolby Vision no compatibles en lugar de reproducirlos como HEVC estándar con colores incorrectos (#3427).
    • MP3: Se revirtió el ajuste de metadatos de relleno y retraso del codificador LAME/Xing porque no es compatible con muchos decodificadores de MP3 de MediaCodec (#3425).
    • Matroska: Se corrigió NullPointerException cuando se analizan elementos ChapterAtom anidados (#3438).
    • Ogg: Se corrigió un error por el que un paquete cuyo tamaño es un múltiplo de 255 bytes y termina en un límite de página se combina con el siguiente paquete.
    • MP4: Analiza las pistas de metadatos cronometrados en cuadros mebx en Mp4Extractor y FragmentedMp4Extractor. Las pistas que llevan una clave it35 se exponen como MimeTypes.APPLICATION_ITUT_T35 (lo que habilita la reproducción de HAGC). Se ignoran otras pistas de mebx, a menos que se establezca FLAG_EMIT_RAW_MEBX_DATA, en cuyo caso todas las pistas de mebx se emiten como MimeTypes.APPLICATION_MEBX sin procesar.
    • Ogg: Se agregó compatibilidad para extraer el relleno final de Opus para la reproducción sin pausas (#2576) y se corrigieron las marcas de tiempo de las muestras después de buscar una página que comienza con un paquete continuo.
    • Ogg: Se corrigieron los errores de decodificación y los saltos de marca de tiempo de ~1 s en las transmisiones de Ogg Opus encadenadas ignorando los paquetes de encabezado de comentarios y el ID de Opus de transmisión intermedia.
  • Inspector:
    • Se agregó compatibilidad para recuperar metadatos de XMP de archivos MP4 con MetadataRetriever.
    • Se agregó compatibilidad para extraer pistas de metadatos cronometrados en caja mebx en MediaExtractorCompat como MimeTypes.APPLICATION_MEBX.
  • Marco del inspector:
    • Se corrigió el recorte de colores BT.2020 de amplia gama en la imagen base de SDR cuando se extraen fotogramas Ultra HDR con FrameExtractor. Los colores fuera de la gama ahora se comprimen de forma suave en la gama sRGB en lugar de limitarse.
  • Audio:
    • Se agregó una solución alternativa para los dispositivos que invocan android.media.AudioDeviceCallback en el subproceso incorrecto (#3386).
    • Se corrigieron posibles reproducciones bloqueadas después de las transiciones de pistas con descarga comprimida.
    • Se solucionó un problema en los dispositivos Amazon Fire TV Stick en el que el audio AC-3 podía congelarse durante las transiciones de períodos (#3448).
    • Se agregó compatibilidad para recortar el relleno del codificador al final de la transmisión para la reproducción sin pausas de Opus en Ogg y WebM/Matroska (#2576).
    • Se corrigieron las actualizaciones de relleno y retraso sin pausas de la descarga dinámica durante las transiciones de pistas para que se apliquen a la pista entrante en lugar de a la pista que se está reproduciendo.
    • Se recortó el relleno final del codificador en transmisiones individuales y la transmisión final en una playlist, además de las transiciones sin interrupciones en medio de la playlist (#2576).
    • Evita las copias innecesarias del búfer de audio en TrimmingAudioProcessor después de que se haya completado el recorte del retraso del codificador al inicio de la transmisión y no sea necesario recortar el relleno al final de la transmisión.
  • Video:
    • Se corrigieron los informes de fotogramas de video tardíos con marcas de tiempo de lanzamiento idénticas para que se informen como descartados en lugar de omitidos.
  • Texto:
    • Agrega MediaItem.SubtitleConfiguration.timeOffsetUs para cambiar las marcas de tiempo de los subtítulos de sideloading en relación con el contenido multimedia. El desplazamiento se puede cambiar durante la reproducción con Player.replaceMediaItem(int, MediaItem) sin interrumpirla (#1976).
    • SubRip: Se agregó compatibilidad para insertar un CharsetDetector en DefaultSubtitleParserFactory para detectar la codificación de caracteres de subtítulos de SubRip independientes sin una marca de orden de bytes (#2247).
  • Efecto:
    • Implementa SoundSeparationAudioProcessor para la separación de fuentes de audio con el módulo de GMSCore de StudioSound.
  • Multiplexores:
    • Se corrigió la escritura del cuadro dOps para Opus en Mp4Muxer y FragmentedMp4Muxer, en los que PreSkip, InputSampleRate y OutputGain se escribían en little-endian en lugar de big-endian (#3431).
    • Se agregó compatibilidad para escribir la altitud del GPS en Mp4LocationData con Mp4Muxer.
    • Se agregó Muxer.Factory.create(ParcelFileDescriptor) para permitir la multiplexación directamente a un ParcelFileDescriptor.
    • Escribe el cuadro tfdt (Track Fragment Base Media Decode Time) de forma predeterminada en los cuadros traf de los archivos MP4 fragmentados para proporcionar marcas de tiempo de decodificación de contenido multimedia.
    • Se agregó compatibilidad para escribir cuadros de contenedor dec3 de E-AC-3 y E-AC-3 JOC (Dolby Atmos) en Mp4Muxer.
    • Se agregó compatibilidad con el formato WebM a MediaMuxerCompat.
    • Escribe el cuadro mfra (acceso aleatorio a fragmentos de películas) al final de los archivos MP4 fragmentados para permitir la búsqueda en FragmentedMp4Extractor con FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Se corrigió la falla en Mp4Writer y FragmentedMp4Writer cuando se escribe una muestra de EOS antes de que se escriban otras muestras.
    • Se corrigió el cumplimiento del contenedor cuando se multiplexa contenido de Dolby en archivos MP4 o MP4 fragmentados anunciando la marca compatible con dby1 en el encabezado del contenedor (#3369).
    • Se admiten pistas de audio PCM de punto flotante de 32 bits en Mp4Muxer y FragmentedMp4Muxer (#3389).
    • Rechaza los perfiles de Dolby Vision no compatibles en Mp4Muxer y FragmentedMp4Muxer cuando agregues pistas.
    • Se agregó compatibilidad con pistas de audio PCM de números enteros de 24 y 32 bits en Mp4Muxer y FragmentedMp4Muxer.
  • Extensión IMA:
    • Reenvía los eventos de pausa y reanudación del reproductor al SDK de IMA en ImaServerSideAdInsertionMediaSource.
  • Sesión:
    • Agrega MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI y MediaConstants.EXTRAS_KEY_CATEGORIES para propagar los metadatos de la playlist y de los elementos a partir de los metadatos y las descripciones heredados, y MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE y MediaConstants.EXTRAS_KEY_TTL_SECONDS para la sugerencia LibraryParams.extras.
    • Se corrigió la falla de SecurityException que se producía cuando se creaba o liberaba un MediaSession en dispositivos que aplican límites estrictos de PendingIntent.
    • Se corrigió un problema por el que MediaSession.getControllerForCurrentRequest() devolvía null durante las solicitudes de reproducción en Android 12 (APIs 31 y 32) cuando MediaSessionService aún no estaba en primer plano.
    • Se corrigió la falla de IllegalArgumentException que se producía cuando un MediaController se conectaba a una sesión heredada que informaba un volumen máximo negativo.
    • Se solucionó un problema por el que llamar a MediaController.setMediaItem o setMediaItems seguido de play() en un MediaSessionCompat heredado en pausa podía enviar una devolución de llamada onPrepareFrom* no admitida en lugar de onPlayFrom*, o bien enviar onPlay() sin volver a inicializar el elemento multimedia solicitado.
    • Se corrigió el error NullPointerException en la versión heredada de MediaBrowser cuando se recibe una respuesta de comando personalizada (#3432).
    • Se corrigió la falla de IllegalArgumentException que se producía cuando se recibían metadatos heredados con claves duplicadas en su Bundle subyacente.
    • Se unificaron las llamadas salientes de MediaControllerCompat.TransportControls realizadas dentro de la misma iteración de Looper cuando se controla un MediaSessionCompat heredado (por ejemplo, llamar a setMediaItem, prepare y play juntos ahora envía una sola devolución de llamada de onPlayFrom*).
  • IU:
    • Se corrigió el posicionamiento de la puntuación de los subtítulos de derecha a izquierda y la preservación del rango de intervalos cuando se habilita el ajuste de texto bidireccional (#3454, #3455).
    • Agrega las clases TrackSelectionState y TrackSelectionParametersState, y sus funciones de recordatorio de estado de componibilidad correspondientes al módulo media3-ui-compose.
    • Se introdujo PresentationState.videoAspectRatio y se hizo que Modifier.resizeWithContentScale tome aspectRatio: Float? en lugar de sourceSizeDp: Size?.
    • Agrega la clase CuesState y la función de componibilidad rememberCuesState al módulo media3-ui-compose para escuchar las indicaciones actuales del reproductor.
    • Agrega compatibilidad con el modo de limpieza a ProgressSlider si se basa en ExoPlayer o CompositionPlayer.
    • Se agregó compatibilidad con showArtwork a PresentationState y se usó para cronometrar la renderización del elemento artwork componible opcional proporcionado en ContentFrame y Player. Agrega el elemento de componibilidad Artwork para usarlo como el valor predeterminado de la ranura artwork.
    • Agrega campos nuevos a PlayPauseButtonState (showBuffering, showRetry y showReplay) y úsalos en PlayPauseButton para renderizar más íconos y un indicador de almacenamiento en búfer.
    • Se agregó la clase PlaybackState para permitir la observación personalizada del estado de reproducción y se introdujo BufferingIndicator como un componente independiente del botón.
    • Se corrigió un problema por el que PlayerView y PlayerControlView mostraban marcadores de anuncios en los límites de los períodos para los marcadores de posición de anuncios post-roll en vivo en las transmisiones en vivo de varios períodos.
    • Las ranuras de componibilidad de Player, ContentFrame, PlayerDefaults y MiniController ya no reciben el reproductor ni la visibilidad de los controles como parámetros. En su lugar, captúralos desde el alcance de la llamada (por ejemplo, topControls ahora es @Composable BoxScope.() -> Unit). Este es un cambio rotundo en una API inestable.
    • Agrega el parámetro alignment a ContentFrame, Player y Modifier.resizeWithContentScale para posicionar el contenido ajustado dentro de su contenedor y recortar el contenido de ContentFrame a sus límites, de modo que el video ajustado con ContentScale.Crop ya no se dibuje fuera de él.
    • Se agregó compatibilidad con la IU de transmisión en vivo a ProgressSlider, ProgressStateWithTickCount y ProgressStateWithTickInterval exponiendo isLive y liveOffsetMs. Se agregó el elemento de componibilidad LiveButton a media3-ui-compose-material3 (#2213).
  • Extensión de Ktor:
    • Se corrigió un problema por el que KtorDataSource podía tratar los errores de conexión durante la transmisión como el final de la entrada en lugar de arrojar una HttpDataSourceException (#3460).
  • Extensión HLS:
    • Se analiza VIDEO-RANGE (PQ y HLG) en EXT-X-STREAM-INF y EXT-X-I-FRAME-STREAM-INF en Format.colorInfo (#3441).
    • Se corrigió NullPointerException cuando se analizan segmentos de inicialización EXT-X-MAP de MPEG-TS que contienen muestras de contenido multimedia de PES (#3456).
    • Se corrigió la regresión en la que Format.id y Format.metadata eran null para las pistas de HLS expuestas (#3402).
    • Recorta los anuncios de la lista de recursos a X-PLAYOUT-LIMIT y omite los que superen por completo el límite. Además, establece el desplazamiento de reanudación del contenido en 0 de forma predeterminada cuando un anuncio intersticial omita X-RESUME-OFFSET y se desconozca su duración, incluso si se establece X-PLAYOUT-LIMIT.
    • Se corrigió un problema por el que la resolución de un anuncio intersticial X-ASSET-LIST reemplazaba las contribuciones de compensación de reanudación de contenido de otros anuncios intersticiales del mismo grupo de anuncios.
  • Extensión DASH:
    • Se agregó compatibilidad para analizar los eventos de inserción (urn:mpeg:dash:event:alternativeMPD:insert:2025) y reemplazo (urn:mpeg:dash:event:alternativeMPD:replace:2025) de MPD alternativos en DashManifestParser y exponerlos como instancias de AlternativeMpdEvent en Period.alternativeMpdEvents. Este es un cambio rotundo para las apps que crean subclases de DashManifestParser: DashManifestParser.buildPeriod ahora toma un parámetro List<AlternativeMpdEvent> adicional y se quitó la sobrecarga anterior. Las apps que anulan DashManifestParser.parseEventStream(XmlPullParser) deben anular DashManifestParser.parseEventStream(XmlPullParser, String) en su lugar, ya que el primero dejó de estar disponible y se convertirá en privado en una versión futura.
    • Se analiza la información de color de CICP (ColourPrimaries, TransferCharacteristics, MatrixCoefficients y VideoFullRangeFlag) de los descriptores EssentialProperty y SupplementalProperty en Format.colorInfo (#3426).
    • Se admiten listas separadas por espacios en blanco de valores @id en los atributos @value del descriptor del modo de truco (http://dashif.org/guidelines/trickmode) (#3315).
    • Se agregó compatibilidad para analizar <ProducerReferenceTime> en DashManifestParser, exponerlo en AdaptationSet.producerReferenceTimes y usarlo para propagar Timeline.Window.presentationStartTimeMs y Timeline.Window.windowStartTimeMs para transmisiones de VOD.
    • Se agregó compatibilidad con la dirección de contenido de DASH (#1689).
    • Se corrigió un NullPointerException que podía ocurrir cuando se analizaba un manifiesto de DASH con un atributo faltante en el elemento <UTCTiming> (#3436).
  • Extensión RTSP:
    • Se corrigió una falla de IllegalStateException que se producía cuando se procesaban respuestas de red retrasadas después de que se cerraba el cliente RTSP.
    • Se corrigió un problema por el que el deslizamiento rápido podía activar de forma incorrecta el mecanismo de resguardo del protocolo TCP.
    • Se corrigió una falla de IllegalStateException que puede ocurrir cuando se procesan respuestas de red retrasadas después de que el cliente RTSP restablece el estado durante la nueva selección de pistas, la finalización de la sesión o el redireccionamiento de URI.
    • Se solucionó el problema por el que volver a buscar antes de reiniciar la reproducción podía provocar una falla de IllegalStateException.
    • Se solucionó un problema por el que retroceder mientras ya había una búsqueda pendiente podía causar la pérdida de audio y la detención de la reproducción de video.
    • Se corrigió un problema por el que las unidades de acceso de fotogramas clave H.264 y H.265 que terminaban con un paquete de agregación o que no era IDR no se marcaban como fotogramas clave, lo que provocaba que la reproducción se quedara atascada en el almacenamiento en búfer (#3434).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Extensión de Opus: Se corrigió una falla de JNI que se producía cuando se decodificaban datos de Opus no válidos.
    • Extensión de Opus: Se corrigió un problema por el que se ignoraba el padding de descarte cuando el padding de descarte y el de salto previo se encontraban en el mismo paquete (#2576).
  • Extensión Cast:
    • Se introdujo SessionAvailabilityListener.SessionUnavailableReason para representar el motivo de la falta de disponibilidad de la sesión y se proporcionó un método sobrecargado para que SessionAvailabilityListener.onCastSessionUnavailable lo exponga.
    • Se solucionó un problema por el que la reproducción se reanudaba de forma local inesperadamente después de detener una sesión de transmisión.
    • Se registra un error cuando las operaciones de RemoteMediaClient (como reproducción, pausa, cambio de velocidad, modo de repetición, volumen, silencio o selección de pista) fallan en RemoteCastPlayer (#3373).
    • Se corrigió ArrayIndexOutOfBoundsException en RemoteCastPlayer cuando la cola del receptor de Cast cambia o se reduce mientras hay una operación de búsqueda pendiente (#3372).
    • Se corrigió un problema con el receptor de Cast predeterminado en el que la línea de tiempo solo propagaba los elementos multimedia que rodeaban inmediatamente al elemento activo, en lugar de toda la lista de reproducción (#3129).
    • Actualiza la línea de tiempo y la posición de reproducción de inmediato cuando modifiques la lista de reproducción (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) o cuando busques en RemoteCastPlayer, y pon en cola las operaciones sucesivas de la lista de reproducción para que se ejecuten de forma confiable en orden (#2639, #3272).
    • Se corrigió un problema por el que, cuando se llamaba a addMediaItems en una fila vacía en RemoteCastPlayer, no se cargaban los elementos multimedia en el receptor de Cast (#2402).
    • Se corrigió un problema en RemoteCastPlayer por el que, cuando se llegaba al final de la fila del receptor de Cast, se borraba la línea de tiempo en lugar de conservar la playlist.
    • Se corrigió un problema por el que playWhenReady, repeatMode y playbackParameters no se transferían ni se aplicaban cuando se configuraban en RemoteCastPlayer antes de cargar elementos multimedia (por ejemplo, durante la transferencia de reproducción local a remota en CastPlayer) (#889).
  • App de demo:
    • Agrega compatibilidad con elementos multimedia protegidos por DRM y una transmisión de muestra de HLS adicional al catálogo de la app de demostración de la sesión.
    • Configura RemoteCastPlayer con un CastTrackSelector en la app de demostración de la sesión para habilitar la selección de subtítulos y pistas de audio durante la transmisión.
  • Se quitan los símbolos obsoletos:
    • Se quitaron DashUtil.buildDataSpec(Representation, RangedUri, int) y DashUtil.buildDataSpec(Representation, String, RangedUri, int). Usa DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>) en su lugar.
  • Compilación:
    • Aumenta el minSdk de Gradle a 24.

Versión 1.11.0

1.11.1

10 de septiembre de 2026

  • ExoPlayer:
    • Se movió la marca para habilitar o inhabilitar los metadatos de HAGC para el contenido multimedia progresivo de MediaSource.Factory a ExtractorsFactory. Se quitó el método setExperimentalEnableHagcPlayback anterior y se reemplazó por ExtractorsFactory.setParseHagcMetadata. Esto también resuelve un problema por el que la inhabilitación no funcionaba para los contenedores de Matroska/WebM.
    • Se corrigió un bloqueo de reproducción que se producía cuando se precalentaba un procesador secundario que no realizaba la transición.
    • Se corrigió un problema de precalentamiento en el que se debía devolver el Surface al renderizador principal cuando una búsqueda restablecía y, luego, inhabilitaba ambos renderizadores.
    • Se corrigió ArrayIndexOutOfBoundsException cuando una actualización de la línea de tiempo en vivo mueve la posición predeterminada más allá de un anuncio insertado del servidor que se está reproduciendo (#3348).
    • Se corrigió un problema del modo de desplazamiento en el que se podían mostrar brevemente fotogramas de video obsoletos cuando se buscaba con ScrubbingModeParameters.allowSkippingMediaCodecFlush habilitado.
  • Extractores:
    • Matroska: Se corrigió un problema por el que las pistas colocadas después de los clústeres no daban como resultado una línea de tiempo con capacidad de búsqueda (#3377).
  • Audio:
    • Se corrigió el cálculo del tamaño del búfer en SilenceSkippingAudioProcessor para que la duración mínima del silencio no se reduzca de forma incorrecta según el tamaño del fotograma (#3271).
    • Se corrigió el manejo de PCM de 8 bits en PcmAudioUtil para tratar las muestras como sin firma, según lo define Android (#3271).
    • Se corrigió un problema de descarga en el que la reproducción podía detenerse durante las transiciones previas al video o sin pausas debido a los tamaños limitados del búfer de hardware.
    • Se corrigió un error en DefaultAudioSink por el que el recuento de versiones no disminuía cuando el subproceso de reproducción ya no estaba activo (#3338).
  • Sesión:
    • Se corrigió NullPointerException cuando se libera un MediaController en proceso desde una devolución de llamada Player.Listener (#3375).
    • Se corrigió el interbloqueo en el subproceso principal cuando un MediaBrowser heredado se conecta a un servicio que devuelve un resultado asíncrono de onGetLibraryRoot() o onConnectAsync() (#3393).
  • Extensión HLS:
    • Se corrigió el cálculo del desplazamiento de reanudación del contenido cuando el segmento de destino para la alineación aún no está en la playlist (#3322).
    • Se corrigió un problema por el que un HlsMediaChunk completamente consumido volvía a intentar cargarse cuando recibía EOFException del extractor (#3350).
  • Extensión DASH:
    • Se corrigió el cálculo incorrecto de la marca de tiempo de la muestra para las pistas de imágenes con un presentationTimeOffset (#3334).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Opus: Se corrigió un daño en la memoria que se producía cuando se inicializaban varias instancias de OpusDecoder de forma simultánea.
    • MPEG-H: Se corrigió la fuga de memoria, el truncamiento de caracteres que no son ASCII y la posible falla por error en código nativo en condiciones de poca memoria cuando se envían comandos al MpeghUiManager (#3365).

Versión 1.11.0

5 de agosto de 2026

  • Biblioteca común:
    • Agrega Format.channelMask para representar de forma explícita la máscara del canal de audio y una nueva sobrecarga de Util.getAudioTrackChannelConfig(Format) para resolverla de forma segura.
    • Se actualizó Kotlin de la versión 2.0.20 a la 2.2.0.
  • ExoPlayer:
    • Se corrigió un error de simultaneidad dependiente del tiempo que podía causar una IllegalStateException o IndexOutOfBoundsException en ExoPlayer.
    • Se flexibilizaron las verificaciones del recuento de grupos de anuncios en AdsMediaSource para permitir que el recuento de grupos de anuncios disminuya cuando un grupo de anuncios se procesa por completo (hasUnplayedAds() es false), lo que permite cambiar el tamaño de los grupos de anuncios dinámicos durante los flujos de trabajo de restablecimiento.
    • Se agregaron getFlags() y FLAG_STRICT_DURATION a SampleStream para permitir que las transmisiones informen marcas y actualicen los renderizadores para que verifiquen estas marcas de forma dinámica.
    • Se recurre al estimador de velocidad de fotogramas en MediaCodecVideoRenderer y al formato de salida del códec en MediaCodecAudioRenderer para calcular la velocidad de funcionamiento del códec cuando los formatos de transmisión no proporcionan un valor válido y evitar restablecimientos innecesarios del códec.
    • Quita el recorte de contenido para los anuncios insertados del cliente en el reproductor principal. En cambio, AdsMediaSource se encarga de la lógica de recorte. Las fuentes de anuncios personalizados insertados del cliente deben actualizarse para implementar el recorte de contenido de forma interna.
    • Marca las pistas con un perfil o nivel de códec bien formado, pero no reconocido, como supported=NO_EXCEEDS_CAPABILITIES en lugar de supported=YES (que es como se marcan las pistas con información de perfil o nivel faltante o con formato incorrecto). Esto garantiza que estas pistas (que es poco probable que el dispositivo admita) no se seleccionen cuando haya alternativas mejor admitidas.
    • Agrega DefaultPreloadManager.SimpleRankingDataComparator, que es un RankingDataComparator que compara las clasificaciones de los elementos multimedia en función de sus distancias con el índice del elemento multimedia que se está reproduciendo. Las apps pueden anular su método compare(Integer, Integer) si se necesita una lógica de comparación más precisa. El SimpleRankingDataComparator personalizado se puede insertar a través de un constructor nuevo de DefaultPreloadManager.Builder.
    • Reduce el riesgo de OOM de DefaultLoadControl.prioritizeTimeOverSizeThresholds recurriendo a los límites de tamaño de bytes del búfer si la memoria del montón disponible parece ajustada.
    • Se alineó el manejo de imágenes estáticas cuando no se establece MediaItem.imageDurationUs: Las imágenes estáticas JPEG y HEIC ahora se "reproducen" con una duración predeterminada muy corta (de la misma manera que se comportaban antes las imágenes PNG y otras).
    • Agrega MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) para conectar BandwidthMeter a MediaSource. Sin embargo, el método obsoleto con implementación personalizada se seguirá llamando de forma predeterminada, por lo que se recomienda implementar el método nuevo y usar BandwidthMeter.getTransferListener() para obtener paridad con el método anterior.
    • En DefaultBandwidthMeter, agrega compatibilidad para un InitialBitrateSupplier personalizado. Esto permite que las apps proporcionen su propia lógica para determinar la estimación inicial de la tasa de bits, que se usará en la creación de DefaultBandwidthMeter y en los cambios de tipo de red. El proveedor se puede configurar con DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Habilitar la programación dinámica de forma predeterminada El bucle de trabajo de reproducción de ExoPlayer se ejecutará de forma dinámica, en lugar de hacerlo en un intervalo estático.
    • Se quitó un restablecimiento innecesario que puede ocurrir cuando se unen pistas con muestras previas al video a la reproducción activa.
    • En DefaultBandwidthMeter, optimiza getInitialBitrateCountryGroupAssignment para que devuelva las asignaciones de grupos de países empaquetadas en un número entero de 32 bits en lugar de un array, lo que reduce el tamaño del código y evita las asignaciones.
    • Se corrigieron las fallas de inicialización de AudioTrack en algunos dispositivos garantizando que la lógica de reintento siempre intente un tamaño de búfer mínimo de 1 segundo si otros reintentos (reduciendo a la mitad el tamaño del búfer) no tienen éxito (#3207).
    • Se corrigió un problema de códec en algunos dispositivos en los que el códec consumía todas las muestras si se vaciaba antes de recibir búferes de entrada.
    • Se agregó el ExoPlayer.Builder.enablePerStreamMediaProgression() experimental para permitir el procesamiento de contenido multimedia avanzado por transmisión. Esto reduce la latencia de inicio entre los elementos de la playlist y evita que la reproducción se "atasque" con contenido muy corto (#3122).
    • Se corrigió la condición de carrera relacionada con el uso del ID de sesión de audio, en la que se usaría el ID de sesión de audio inicial generado de forma automática por ExoPlayer en lugar del valor establecido por setAudioSessionId (#3241).
    • Se agregó compatibilidad experimental con la reproducción de metadatos sincronizados de HAGC (ST 2094-50) para contenido multimedia progresivo (p.ej., 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 la API 37 y versiones posteriores. Este comportamiento se puede inhabilitar con DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Se agregó Format.selectionPriority, que representa la preferencia relativa de Format en la selección de pistas (#3236).
    • Se corrigió un posible problema con el modo de limpieza en el que la limpieza podía detenerse cuando se buscaba el "final de la transmisión".
  • CompositionPlayer:
    • Se solucionó un problema por el que no se liberaban las instancias de TrackSelector.
  • Transformador:
    • Se corrigió un problema por el que se podía informar en exceso el valor de ExportResult.fileSizeBytes.
  • Selección de pistas:
    • Se expone BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR y se agrega AdaptiveTrackSelection.Factory.setTrackFormatComparator para permitir el ordenamiento de formatos personalizados y la prioridad de selección de ABR más allá del ordenamiento solo por tasa de bits.
    • Se corrigió un problema de simultaneidad dependiente del tiempo en el que las actualizaciones secuenciales rápidas de los parámetros de selección de pistas podían provocar que se perdieran o reemplazaran algunas actualizaciones.
  • Extractores:
    • MP4, MP3 y FLAC: Se agregó FLAG_DISABLE_ARTWORK_METADATA para permitir que se descarten las imágenes adjuntas y los metadatos de la portada durante el análisis del contenedor para reducir el consumo de memoria del entorno de ejecución (#2077). Esto también se puede habilitar de forma centralizada a través de DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: Se agregó compatibilidad para extraer pistas de metadatos cronometrados de ITU-T T.35 (it35).
    • MP4: Se agregó compatibilidad para extraer metadatos de capítulos (formatos Nero y QuickTime). Se prefieren los capítulos de QuickTime si ambos están presentes. La información de los capítulos extraídos se expone como entradas Chapter dentro de la Metadata de la pista, lo que permite la navegación nativa por capítulos en archivos MP4, M4A y M4B (como audiolibros y podcasts) (#2803).
    • WAV, Matroska y MP4: Se agregó compatibilidad con audio PCM de punto flotante de 64 bits (#3090).
    • Matroska: Usa los metadatos de flujo de bits del códec para propagar un ColorInfo preciso.
    • MP4: Se agregó compatibilidad para buscar en archivos MP4 fragmentados con el cuadro mfra cuando no hay un cuadro sidx. Para habilitar esta opción, proporciona FLAG_READ_MFRA_FOR_SEEK_MAP a FragmentedMp4Extractor, que ahora se hace de forma predeterminada en DefaultExtractorsFactory (#3088).
    • Ignora los datos de av1C con una versión no admitida.
    • MP4: Se agregó compatibilidad con PCM de punto flotante big-endian en cuadros fpcm.
    • Matroska: Analiza la información de los capítulos en las entradas Chapter de la Metadata de una pista.
    • MPEG-TS: Se mejoró la extracción de transmisiones de DTS-HD y DTS Express combinando la transmisión secundaria principal y la de extensión en una sola muestra, lo que corrige los problemas de reproducción en los que las dos se generaban anteriormente como muestras separadas (#3147).
    • MP4: Se evitaron los bucles infinitos y las lecturas fuera de los límites cuando se analizan elementos de etiquetas de metadatos ilst vacíos (#3191).
    • MPEG-TS: Se garantiza que se renderice el último fotograma para las transmisiones en las que el último paquete PES tenga una longitud conocida (#3206).
    • MP3: Se corrigió el informe de tasa de bits para los archivos con encabezado Xing y VBRI.
    • Matroska: Controla las pistas definidas en el último clúster (#3250).
    • Matroska: Se agregó compatibilidad con ALAC (#3268).
    • MP4: Se permiten cuadros sgpd de longitud variable en archivos MP4 fragmentados (#3243).
    • AVI: Se corrigió un problema por el que la reproducción de archivos sin marcas de fotogramas clave en las pistas de audio causaba la pérdida de audio y OutOfMemoryError.
    • MP3: Se usan duraciones que reconocen la reproducción sin pausas de los encabezados de Xing/Info (#3183).
    • MP3: Se ajustaron los metadatos de relleno y retraso del codificador LAME/Xing para que coincidan con el recorte de PCM decodificado (#3200).
  • Audio:
    • Se agregó un período de gracia de 100 ms en los renderizadores de audio de ExoPlayer cuando se pasa del estado listo al no listo para evitar el rebote de subdesbordamientos transitorios y los estados de almacenamiento en búfer inesperados durante la reproducción activa (#3210).
    • Se cambió la lógica del tamaño del búfer de PCM predeterminado en DefaultAudioTrackBufferSizeProvider para usar un búfer fijo de 500 ms y que dependa menos del dispositivo.
    • Se actualizó MediaCodecAudioRenderer para extraer la máscara de canal espacial del decodificador de la plataforma, lo que permite que DefaultAudioSink use esta máscara explícita en lugar de inferir una a partir del recuento de canales.
    • Convierte los parámetros de AudioSink.configure en una clase de datos. Las anulaciones personalizadas de ForwardingAudioSink.configure deben migrarse a la nueva firma del método.
    • Se agregó compatibilidad para mantener el tono cuando se estira el tiempo de una transmisión de audio con EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Se mejoró ToFloatPcmAudioProcessor para admitir la conversión de PCM de 8 bits, PCM big-endian de 16 bits y PCM de punto flotante de 64 bits a PCM de punto flotante de 32 bits (#3090).
    • Cambia el valor que se muestra de DecoderAudioRenderer.getChannelMapping a ImmutableIntArray.
    • Se corrigió un error por el que la reproducción se detenía cuando se reproducía una playlist de audio sin pausas en el modo de descarga comprimida.
    • Se reenviaron Timeline y el UID del período a AudioSink.configure y AudioProcessor.StreamMetadata para proporcionar contexto de la playlist a los procesadores de audio (#418).
    • Se estableció el AudioProcessor.StreamMetadata.positionOffsetUs correcto para permitir el procesamiento de audio basado en el tiempo (#418).
    • Se agregó compatibilidad con PCM de punto flotante de 32 y 64 bits big-endian.
    • Se quitó la ruta de acceso de resguardo de EAC3-JOC a EAC3 para la reproducción en dispositivos Google Pixel, ya que sus decodificadores EAC3 estándar no pueden decodificar transmisiones EAC3-JOC (#3257).
  • Video:
    • Se corrigió la lógica de unión de videos para contar los búferes descartados durante la unión como omitidos en lugar de descartados.
    • Se corrigió la decisión de renderización inmediata cuando se establece una superficie nueva para evitar la pérdida de fotogramas en dispositivos que no admiten superficies de marcador de posición.
    • Se corrigió la estimación de la velocidad de fotogramas en MediaCodecVideoRenderer para que sea más precisa, ya que se tienen en cuenta los fotogramas omitidos o descartados.
    • Permite configurar el umbral que se usa para programar fotogramas con anticipación. El valor predeterminado es 50 ms, pero se puede personalizar a través de MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Se corrigió un error en VideoFrameReleaseHelper por el que los cambios de visualización podían activar devoluciones de llamada de Choreographer redundantes y activaciones excesivas de la CPU en el subproceso principal.
  • Texto:
    • TTML: Se recurre a displayAlign desde style para las regiones (#2559).
    • TTML: Se hereda la hora de inicio de la indicación del elemento superior de los elementos <p> (#3246).
  • Metadatos:
    • Agrega el campo MediaMetadata.discSubtitle y analízalo desde los datos de ID3v2.4 TSST y Vorbis DISCSUBTITLE.
    • Se analiza el número y el recuento de discos del fotograma TPOS de ID3.
  • Efecto:
    • Borra el estado de actualización en FinalShaderProgramWrapper cuando se vacía para evitar que el reproductor se congele durante la búsqueda.
  • Multiplexores:
    • Se agregó compatibilidad con las referencias de pistas (el cuadro tref) en Mp4Muxer a través de una nueva API de addTrackReference. Esto permite establecer relaciones entre las pistas, como vincular una pista de metadatos a la pista de video que describe.
    • Agrega OggMuxer para permitir la multiplexación de transmisiones de contenido multimedia OPUS o VORBIS en el formato de archivo ogg.
    • Se agregó WavMuxer para la generación de archivos WAV (admite PCM de números enteros y de punto flotante).
    • Agrega setAttemptStreamableOutputEnabled a InAppMp4Muxer.Factory para permitir la escritura de archivos más pequeños que no se pueden transmitir sin espacio reservado.
    • Se agregó compatibilidad con audio IAMF en Mp4Muxer y FragmentedMp4Muxer.
  • Extensión IMA:
    • Agrega ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot para permitir que se proporcione un espacio publicitario que se use para los anuncios en contenido pausado.
    • Se corrigió un error por el que los anuncios de VAST que se pueden omitir consecutivos mostraban el botón para omitir de inmediato en el segundo anuncio (#3165).
  • Sesión:
    • Se corrigieron posibles interbloqueos y fallas de IllegalStateException dentro de MediaNotificationManager cuando se usa una sesión con un looper de reproductor de subprocesos en segundo plano.
    • Se aplican requisitos de subprocesos más estrictos para los métodos MediaSession. Los métodos nulos ahora publican automáticamente la ejecución en el subproceso del looper de la aplicación, y los descriptores de acceso de estado (getters) arrojan de forma explícita una IllegalStateException si se los llama desde un subproceso que no sea el looper de la aplicación.
    • Se corrigió una falla de combinación de cronograma fuera de los límites (IllegalStateException en MediaUtils.mergePlayerInfo) mediante el seguimiento de la coherencia del estado por controlador en el lado de la sesión.
    • Se agregó androidx.media3.session.MediaSessionManager para proporcionar compatibilidad con la consulta de sesiones multimedia activas y la devolución de instancias de SessionToken de Media3.
    • Cambia el comportamiento predeterminado de MediaSession.Callback.onConnect si no se anula el método para proporcionar solo acceso de lectura a los controladores no confiables.
    • Se agregó compatibilidad para anular el nombre del paquete mientras se crea MediaSession a través de una nueva API MediaSession.Builder#setPackageNameOverride. El emisor debe tener el permiso android.permission.OVERRIDE_MEDIA_SESSION_OWNER para anular el nombre del paquete de la sesión.
    • Agrega MediaSession.Callback.onConnectAsync(). El nuevo método permite procesar de forma asíncrona el intento de conexión de un controlador. Las apps pueden devolver un Future inmediato con Futures.immediateFuture(ConnectionResult) para lograr el comportamiento anterior. Se recomienda migrar al método nuevo porque Callback.onConnect es un candidato para dejar de estar disponible.
    • Se solucionó un problema por el que la navegación de AVRCP de Bluetooth no reconocía MediaLibraryService en las APIs 36 y 37.
    • Se corrigió la reducción doble de la escala de las ilustraciones en MediaSession cuando el tamaño de la imagen se acerca al límite de la plataforma, lo que resuelve el desenfoque en las notificaciones (#3134).
    • Se corrigió la falla de ForegroundServiceStartNotAllowedException en MediaNotificationManager cuando una devolución de llamada de carga de mapa de bits de material gráfico asíncrona intenta iniciar el servicio en primer plano mientras la app está en segundo plano (#3270).
    • Se corrigió un problema por el que los objetos PositionInfo que recibía un MediaController no tenían sus UID de Timeline originales. Ahora, la sesión traduce y propaga de forma confiable estos UID durante las actualizaciones de estado.
    • Se corrigió la falla detectando ForegroundServiceStartNotAllowedException en MediaSessionService.stopSelfSafely() (#3310).
    • Se corrigió la devolución de llamada onMediaItemTransition() inesperada en MediaController cuando se busca dentro del mismo elemento multimedia (#3248).
  • IU:
    • Se corrigió la renderización del primer fotograma con el tamaño incorrecto cuando se vuelve a componer ContentFrame a mitad de la reproducción (#3238).
    • Agrega la clase CurrentMediaItemState y el elemento de componibilidad rememberCurrentMediaItemState correspondiente al módulo media3-ui-compose. Este contenedor de estado se usa en demo-compose para mostrar información de metadatos sobre el MediaItem que se está reproduciendo.
    • Agrega la clase PlaylistState y el elemento que admite composición rememberPlaylistState correspondiente al módulo media3-ui-compose. Este contenedor de estado se usa en demo-compose para mostrar información de metadatos sobre el MediaItems establecido en el reproductor.
    • Se agregó la API de avance rápido y cámara lenta a PlaybackSpeedState. Usa esta funcionalidad en demo-compose para mostrar el avance rápido con una presión prolongada.
    • Agrega el elemento componible MiniController al módulo media3-ui-compose-material3. Proporciona una affordance compacta para controlar el Player mientras se muestran el título, el artista, la portada y el progreso del elemento multimedia actual.
    • Agrega la clase ErrorState y el elemento que admite composición rememberErrorState correspondiente al módulo media3-ui-compose. Agrega el elemento de componibilidad ErrorText a media3-ui-compose-material3 y conviértelo en una superposición predeterminada en Player.
    • Publica el objeto PlayerDefaults con elementos componibles para TopControls, CenterControls, BottomControls y ErrorOverlay.
    • Agrega FocusRequester a la función de componibilidad Player y sus ranuras de contenido.
    • Se publicaron PlayerPool (common-ktx) y rememberPooledPlayer (ui-compose) para admitir la carga previa de MediaItems en entornos de IU de ventana deslizante. Muestra esta funcionalidad en demo-compose con un ShortFormPlayerScreen nuevo.
    • Se corrigió el error de supresión del obturador en PlayerView y Compose PresentationState que causaba fallas en los cronogramas que no admiten la búsqueda de UID de período (#3264).
  • Descargas:
    • Se resuelven las variables de HLS en la lista de reproducción de contenido multimedia cuando se recupera para su descarga (#3258).
  • Extensión de Ktor:
    • Se agregó un nuevo módulo de extensión media3-datasource-ktor que proporciona un KtorDataSource respaldado por la pila HTTP de Ktor.
    • Se corrigió el problema KtorDataSource que cargaba todo el cuerpo de la respuesta HTTP en la memoria cuando se abría una conexión (#3305).
  • Extensión HLS:
    • Se agregó compatibilidad con la dirección de contenido de HLS y la clonación de rutas de acceso (#1689).
    • Se agregó setWithAssetListReset a HlsInterstitialsAdsLoader para permitir que las apps restablezcan los anuncios intersticiales de la lista de recursos completamente procesados a un estado no disponible para volver a resolverlos a pedido.
    • Se analiza el atributo SCORE de EXT-X-STREAM-INF y EXT-X-I-FRAME-STREAM-INF, y se propaga a Format.selectionPriority (#3236).
    • Se corrigió un error por el que las actualizaciones programadas de la lista de reproducción de HLS continuaban incluso si la lista de reproducción ya no era principal ni estaba activa (#3254).
    • Se corrigió el cálculo del desplazamiento de reanudación del contenido cuando se resuelven las listas de recursos intersticiales (#3322).
    • Se corrigió la discontinuidad inesperada de la marca de tiempo de la pista de audio cuando se reanudaba la reproducción en vivo de baja latencia después de un error en la solicitud de la lista de reproducción (#3311).
    • Se corrigió un error en HlsMediaPeriod.getStreamKeys() por el que la pista ID3 en las representaciones de audio se consideraba como subtítulos (#3333).
  • Extensión DASH:
    • Se separaron los subtítulos de CEA en diferentes TrackGroup según el idioma (#3113).
    • Se agregó compatibilidad para analizar varios elementos Location del manifiesto (MPD) y realizar un resguardo de ubicación en DashMediaSource cuando fallan las cargas del manifiesto.
    • Se corrigió una falla (IndexOutOfBoundsException) que se producía cuando se abrían manifiestos con un elemento <SegmentTimeline/> vacío (#3326).
  • Extensión RTSP:
    • Se corrigieron las detenciones o fallas transitorias de la reproducción durante la preparación de la reproducción de RTSP causadas por errores de vinculación de puertos UDP.
  • Extensión Cast:
    • Se agregó la nueva clase CastParams para permitir la configuración de Cast llamando a Cast.initialize(CastParams).
    • Se agregó la nueva opción CastParams.getShowSystemOutputSwitcherOnCastIconClick(), que activa el uso del selector de salida de la IU del sistema en lugar del selector de dispositivos para transmitir integrado en la app cuando está disponible.
    • Se agregaron MediaRouteButtonState y rememberMediaRouteButtonState para admitir la observación del estado de visibilidad del selector de rutas de medios, y se agregó el parámetro state a MediaRouteButton (#3172).
    • Se corrigió un error por el que RemoteCastPlayer podía quedar bloqueado de forma permanente en un estado de enmascaramiento de pistas después de una selección de pistas, lo que provocaba que ignorara las actualizaciones de pistas posteriores del receptor de Cast (#3237).
    • Se corrigió un error por el que DefaultMediaItemConverter arrojaba una NullPointerException cuando intentaba unirse a una sesión de transmisión iniciada desde un remitente que no era de Media3.
    • Evita que CastPlayer transfiera MediaItems que no se pueden reproducir cuando se cambia el reproductor activo (#3199).
    • Se corrigió un error por el que las transmisiones en vivo sin configurar (liveConfiguration == UNSET) se ponían en cola como STREAM_TYPE_BUFFERED (#3318).
  • Utilidades de prueba:
    • Expande DataSourceContractTest para incluir compatibilidad con solicitudes POST con encabezados y cuerpos, agrega algunos recursos POST a HttpDataSourceTestEnv y agrega aserciones para el método, los encabezados y el cuerpo HTTP esperados en WebServerDispatcher.
    • Se ajustaron las aserciones en DataSourceContractTest para las longitudes que se muestran desde DataSource.open(). Los recursos que pueden generar C.LENGTH_UNSET deben indicarlo con TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • Se agregó setPlaybackLooper a TestExoPlayerBuilder.
  • Se quitan los símbolos obsoletos:
    • Se quitó androidx.media3.exoplayer.MetadataRetriever. Se usa androidx.media3.inspector.MetadataRetriever en su lugar.
    • Se quita androidx.media3.exoplayer.MediaExtractorCompat. Se usa androidx.media3.inspector.MediaExtractorCompat en su lugar.
    • Se quita Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. En su lugar, usa HeifExtractor para extraer metadatos de fotos en movimiento de archivos HEIC.
    • Se quita androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Se usa androidx.media3.extractor.metadata.MotionPhotoMetadata en su lugar.
    • Se quita androidx.media3.extractor.DummyTrackOutput. Se usa androidx.media3.extractor.DiscardingTrackOutput en su lugar.
    • Se quita androidx.media3.extractor.DummyExtractorOutput. Se usa androidx.media3.extractor.NoOpExtractorOutput en su lugar.
    • Se quita androidx.media3.common.C.generateAudioSessionIdV21. Se usa androidx.media3.common.util.Util.generateAudioSessionId en su lugar.
  • Compilación
    • Se actualizaron las instrucciones de README.md para que dependan de Media3 de forma local para usar compilaciones compuestas de Gradle (includeBuild). Se quitó la secuencia de comandos core_settings.gradle y ya no se usan las propiedades androidxMediaModulePrefix ni androidxMediaEnableMidiModule.

1.11.0-rc01

Usa la versión estable 1.11.0.

1.11.0-beta01

7 de julio de 2026

Usa la versión estable 1.11.0.

1.11.0-alpha01

24 de junio de 2026

Usa la versión estable 1.11.0.

Versión 1.10.0

1.10.1

12 de mayo de 2026

  • Biblioteca común:
    • Se corrigió el manejo de onAudioSessionIdChanged en SimpleBasePlayer y ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Se corrigió una condición de carrera relacionada con la generación de IDs de sesiones de audio que podía provocar un IllegalStateException con el modo de túnel. (#3099).
    • Se corrigieron posibles fallas de la app cuando se recuperaba de errores del decodificador con el calentamiento previo del renderizador.
    • Se corrigió un problema por el que se producían artefactos de video debido al suministro de datos de inicialización cuando se usaba un códec Dolby Vision basado en AV1 (#3153).
  • Selección de pistas:
    • Se ajustó la lógica de selección de pistas en VideoTrackInfo para resolver los tipos de MIME de resguardo y mover las preferencias de puntuación de HDR y códecs a las preferencias de calidad (#3135).
  • Extractores:
    • MP3: Se ignora la longitud de los datos de Xing si es mayor que la longitud conocida de la transmisión (#3117).
    • Se corrigió la ArrayIndexOutOfBoundsException en Mp4Extractor cuando se establece FLAG_OMIT_TRACK_SAMPLE_TABLE y la pista no tiene un cuadro de muestra de sincronización (stss).
  • Audio:
    • Se corrigió un error por el que los eventos de audio se podían enrutar de forma incorrecta si se agregaban varios renderizadores de audio al reproductor.
  • Video:
    • Se ajustó la lógica para la reutilización de códecs en los cambios de velocidad de fotogramas en la API inferior a 30 para evitar restablecimientos de códecs en los que no son beneficiosos (#3120).
    • Se inhabilitó la solución alternativa de sincronización forzada en queueSecureInputBuffer para la API 31 y versiones posteriores. La solución alternativa era un cuello de botella artificial que forzaba la ejecución de la desencriptación en serie, lo que evitaba que el video se distorsionara debido a un problema del framework que existía antes de la API 31.
  • Imagen:
    • Se corrigió un problema en el modo de limpieza en el que las actualizaciones de imágenes solo se aplicaban cuando el usuario "detenía la limpieza" (#2815).
  • Sesión:
    • Se corrigió un error por el que ForegroundServiceStartNotAllowedException no se propagaba entre los límites de los subprocesos en caso de que el subproceso de la aplicación no fuera el principal (#2499).
    • Se corrigió un error por el que COMMAND_SEEK_TO_MEDIA_ITEM no estaba disponible en un MediaController cuando se conectaba a una sesión solo de plataforma que admite la búsqueda de otros elementos, pero no las modificaciones de la lista de reproducción.
    • Se solucionó un problema por el que MediaController no podía establecer elementos multimedia en sesiones multimedia de la plataforma que no permitían acciones de PREPARE_FROM.
    • Se corrigió un error por el que el proceso propio no se marcaba con Controller.isTrusted() en la API 27 o versiones anteriores cuando se conectaba a través de controladores de plataforma.
  • Extensión HLS:
    • Se corrigió un error por el que se generaba una ArrayIndexOutOfBoundsException durante el resguardo de la transmisión si la selección de pistas era un subconjunto de las pistas disponibles (#3161).
    • Se corrigió un problema por el que el segmento de inicialización no se transfería entre las actualizaciones de la lista de reproducción de contenido multimedia si la etiqueta #EXT-X-MAP no se repetía en las actualizaciones posteriores (#3105).
  • Extensión DASH:
    • Se corrigió una falla en SampleQueue que se producía cuando se buscaba un fragmento que se estaba cancelando.

1.10.0

26 de marzo de 2026

  • Biblioteca común:
    • Se ascienden Player.mute() y Player.unmute() de UnstableApi a estable.
    • Se ascienden Format.pcmEncoding y C.PcmEncoding de UnstableApi a estable.
    • Se agregó Format.primaryTrackGroupId para identificar el grupo principal de instancias de Format incorporadas (#294).
  • ExoPlayer:
    • Se agregaron funciones de recorte a AdsMediaSource.
    • Se agregó compatibilidad con la programación dinámica en MediaCodecVideoRenderer para alinear mejor el trabajo de programación y los ciclos de activación de la CPU con el momento en que se pueden procesar los fotogramas de video. Puedes habilitar esta opción con experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() en DefaultRenderersFactory.
    • Permite establecer un DataSource.Factory personalizado en DefaultPreloadManager.Builder.
    • Permite que se simule ExoPlayer sin Robolectric moviendo algunas constantes predeterminadas a ExoPlayer.Builder. Por lo general, no se recomienda simular esta interfaz compleja, solo cuando el uso es mínimo, simple o incidental (#2985).
      • Esto requirió mover DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS de ExoPlayer a ExoPlayer.Builder (sin baja).
    • Se corrigió un error por el que ProgressiveMediaSource propagaba información de cronograma desactualizada al reproductor y los períodos en cola se quitaban de forma inesperada (#3016).
    • Se corrigió un problema por el que ExoPlayer no solicitaba el foco de audio retrasado cuando se solicitaba la reproducción durante las llamadas telefónicas.
    • Se corrigió un error por el que las transiciones de contenido on demand a contenido en vivo podían causar que se volviera a almacenar en búfer al final del contenido on demand (#3052).
    • Se agregó compatibilidad con el perfil 10 de Dolby Vision (#2830).
    • Se corrigió un error por el que un anuncio previo al video sin inicializar producía una ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Se agregó compatibilidad con EditedMediaItem.removeVideo.
  • Transformador:
    • EditedMediaItem.Builder.setFrameRate() ahora puede establecer una velocidad de fotogramas de salida máxima para el video, lo que es particularmente útil cuando se aumenta la velocidad de los medios con setSpeed().
  • Selección de pistas:
    • Cambia la firma de DefaultTrackSelector.selectAllTracks para incluir el array de salida como un parámetro, prepropagado con anulaciones de pistas.
    • Se corrigió un problema por el que se seleccionaban pistas de metadatos incorporadas, independientemente de si se seleccionaba la pista principal correspondiente (#294).
    • Estabiliza las opciones de TrackSelectionParameters para preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels y selectTextByDefault.
  • Extractores:
    • MP4: Se agregaron archivos de compatibilidad con cuadros uuid grandes antes de otros cuadros, como moov (#3046).
    • MP4: Se agregó compatibilidad con pistas de codificación de video versátil (VVC) en contenedores MP4.
  • Inspector:
    • Cambio rotundo: Se quitó FrameExtractor. Ahora, los usuarios deben depender del nuevo módulo :media3-inspector-frame y actualizar las importaciones a androidx.media3.inspector.frame.FrameExtractor.
    • Se introdujo un módulo nuevo para extraer y procesar fotogramas de video decodificados.
  • Audio:
    • Se cambió la biblioteca de decodificación subyacente para la extensión del decodificador de IAMF de libiamf a iamf_tools.
    • La decodificación de IAMF admite la salida binaural a través del decodificador (cuando se usa la extensión del decodificador de IAMF) o a través del Spatializer de Android.
    • Se quitó correctamente la compatibilidad con AC4Profile22 y otros perfiles heredados cuando se evalúa la compatibilidad con el decodificador AC-4 en situaciones de Automotive (#2609).
    • Se mejoró la lógica de reintento de la inicialización de AudioOutput en DefaultAudioSink (#2905).
    • Intenta hacer coincidir el diseño de salida de las bocinas (o el espacializador, si corresponde) cuando decodifiques IAMF, tanto con la extensión de IAMF como con los decodificadores de códecs multimedia, compatibles con los campos y la lógica nuevos en AudioCapabilities y AudioCapabilitiesReceiver.
    • Se corrigió un error por el que la reproducción se detenía cuando se reproducía una playlist de audio sin pausas en el modo de descarga comprimida.
  • Texto:
    • VobSub: Se usan los comandos de control de SPU START y STOP para derivar la duración de la indicación en lugar de establecer siempre un valor predeterminado de 5 segundos (#2935).
  • Metadatos:
    • Se aumentó a cuatro el recuento predeterminado de renderizadores de metadatos para abarcar todas las pistas de metadatos potenciales publicadas por variantes y representaciones de HLS (#3043).
  • Efecto:
    • Mover LottieOverlay a un módulo :media3-effect-lottie nuevo (lo que también implicó cambiarle el nombre de androidx.media3.effect.LottieOverlay a androidx.media3.effect.lottie.LottieOverlay)
  • Efecto de Lottie:
    • Se introdujo un nuevo módulo :media3-effect-lottie que proporciona funcionalidad para aplicar efectos de Lottie a los fotogramas de video.
  • Extensión IMA:
    • Actualiza la versión del SDK de IMA a la 3.39.0 para tener acceso a la API de información de medios de anuncios más reciente.
    • Se corrigió un error por el que el tipo de MIME del anuncio no coincidía con el tipo de MIME proporcionado en el evento IMA LOADED. La corrección ahora asigna el tipo de MIME del anuncio con la información de medios del anuncio que proporciona IMA.
    • Agrega setEnableCustomTabs a ImaAdsLoader y ImaServerSideAdInsertionMediaSource para permitir que los usuarios controlen si las URLs de clic en el anuncio se inician con pestañas personalizadas.
    • Agrega ImaAdTagUriBuilder, una clase que ofrece una forma alternativa de construir un adTagUri. Contiene la API de setPreferredLinearOrientation. Esta es una API en pruebas alfa que te permitirá establecer tu orientación preferida para los anuncios lineales. Si quieres unirte al grupo de pruebas alfa, comunícate con tu socio de cuenta.
  • Sesión:
    • Se corrigió un error por el que los arrays grandes en MediaMetadata.artworkData podían provocar fallas en la app.
    • Se usa el tipo int para el argumento @Player.Command en la interfaz ActionFactory (#2933).
    • Se convirtieron MediaSessionService y MediaLibraryService en un LifecycleService, lo que permite adjuntar operaciones optimizadas para ciclos de vida al ciclo de vida del servicio (#187).
    • Dejar de admitir los comandos de cambio de volumen del dispositivo de MediaController y MediaBrowser para las reproducciones locales Las apps no deben cambiar el volumen del dispositivo local y, si es necesario, pueden usar las APIs de AudioManager para este propósito.
    • Detecta instancias de Intent inactivas que iniciaron el servicio como un servicio en primer plano. Esto evita que el sistema arroje una ForegroundServiceDidNotStartInTimeException. Este es un cambio rotundo en una API inestable para las apps que implementan un MediaNotification.Provider personalizado, ya que hay un nuevo método obligatorio.
    • Se agregaron compiladores para instancias de PendingIntent que se usarán con widgets de la pantalla principal (#2933).
    • Se agregaron métodos estáticos para crear instancias de Intent para widgets de la pantalla principal basados en Compose (#2933).
    • Se corrigió un error por el que no se informaba la transición de elementos multimedia a los controladores cuando la reproducción pasaba de un índice de elemento multimedia determinado a otro con el mismo elemento multimedia por motivos de discontinuidad "AUTO" y "SEEK" (#2997).
    • Se corrigió un problema por el que la solución alternativa para la ubicación de los botones de la IU del sistema afectaba de forma negativa a otras plataformas de IU, como Android Auto, o a los fabricantes que no necesitaban la solución alternativa (#3041).
    • Se corrigió un problema por el que no se sincronizaba el acceso a las suscripciones (#3056).
    • Se solucionó un error de SysUI en la API 29 en el que la carátula de la sesión multimedia de un tamaño en particular puede provocar una falla en SysUI y forzar el reinicio del dispositivo (#3118).
    • Se corrigió el ajuste de escala del ícono de la carátula de la notificación en Android Q (#3084).
  • IU:
    • Agrega el elemento componible PlaybackSpeedControl a media3-ui-compose para mostrar y modificar la velocidad de reproducción.
    • Agrega el elemento de componibilidad PlaybackSpeedToggleButton a media3-ui-compose-material3 para controlar la velocidad de reproducción.
    • Se agregó el elemento de componibilidad ProgressSlider a media3-ui-compose-material3 para mostrar el progreso del reproductor y realizar búsquedas arrastrando y presionando (#2288).
    • Evita el búfer grande fuera de pantalla en la animación de PlayerControlView.
    • Se agregó el elemento de componibilidad Player a media3-ui-compose-material3, que combina un ContentFrame con controles personalizables alineados en la parte superior, el centro y la parte inferior.
    • Oculta la posición de reproducción del servicio de accesibilidad para evitar la actualización continua de anuncios cuando PlayerControlView esté visible.
  • Extensión HLS:
    • Se agregó compatibilidad con X-PLAYOUT-LIMIT con anuncios intersticiales de HLS (#2484).
    • Se admite el atributo QUERYPARAM con #EXT-X-DEFINE (#1854).
    • Se optimizó el análisis de la lista de reproducción de HLS almacenando en caché los comparadores de expresiones regulares (#3008).
    • Se expuso la pista de metadatos ID3 (EMSG) en las representaciones de audio (#3043).
    • Se permite el resguardo de ubicación cuando se encuentran errores de carga, si hay transmisiones redundantes disponibles desde diferentes ubicaciones (#1988).
    • Se corrigió el comportamiento de X-SNAP para que los anuncios intersticiales de HLS calculen correctamente la posición de inicio y reanudación (#3013).
  • Extensión DASH:
    • Se corrigió un problema por el que las pistas con horas de inicio de segmentos no alineadas causaban demoras o muestras faltantes al comienzo de la reproducción (#3057).
    • Se corrigió el error por el que las marcas de tiempo de los metadatos de EMSG v0 en banda no se configuraban correctamente (#3024).
  • Extensión RTSP:
    • Se corrigió la regresión en la transmisión de H.264 y H.265 que analizaba de forma incorrecta las muestras de la misma unidad de acceso que abarcaba varios paquetes RTP. Esto generaba artefactos visuales y daños en el video (#3121).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Se agregó compatibilidad con el administrador de IU de MPEG-H a la extensión del decodificador de MPEG-H (#3066).
  • Extensión Cast:
    • Se agregó el método RemoteCastPlayer.Builder#setTrackSelector, que habilita la implementación de la selección de pistas para las reproducciones de Cast.
  • Se quitan los símbolos obsoletos:
    • Se quitó ExperimentalFrameExtractor. Se usa androidx.media3.inspector.frame.FrameExtractor en su lugar.
    • Se quita ChannelMixingMatrix.create(). Se usa ChannelMixingMatrix.createForConstantGain() en su lugar.
    • Se quita androidx.media3.extractor.metadata.flac.VorbisComment. Se usa androidx.media3.extractor.metadata.vorbis.VorbisComment en su lugar.
    • Se quita MediaSource.prepareSource(MediaSourceCaller, TransferListener). Usa MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId) en su lugar.

1.10.0-rc03

25 de marzo de 2026

Usa la versión estable 1.10.0.

1.10.0-rc02

16 de marzo de 2026

Usa la versión estable 1.10.0.

1.10.0-rc01

10 de marzo de 2026

Usa la versión estable 1.10.0.

1.10.0-beta01

25 de febrero de 2026

Usa la versión estable 1.10.0.

1.10.0-alpha01

6 de febrero de 2026

Usa la versión estable 1.10.0.

Versión 1.9.0

1.9.4

16 de mayo de 2026

La versión 1.9.4 incluye las siguientes confirmaciones.

  • Efecto:
    • Establece de forma explícita GL_DRAW_BUFFER y GL_READ_BUFFER cuando realices la transición desde un contexto sin plataforma.

1.9.3

16 de marzo de 2026

La versión 1.9.3 incluye las siguientes confirmaciones.

  • Audio:
    • Se corrigió un error por el que la reproducción se detenía cuando se reproducía una playlist de audio sin pausas en el modo de descarga comprimida.

1.9.2

6 de febrero de 2026

La versión 1.9.2 incluye las siguientes confirmaciones.

  • ExoPlayer:
    • Se corrigió un error por el que ProgressiveMediaSource propagaba información de la línea de tiempo desactualizada al reproductor y los períodos en cola se quitaban de forma inesperada (#3016).
  • Sesión:
    • Se corrigió un problema por el que la solución alternativa para la ubicación de los botones de la IU del sistema afectaba de forma negativa a otras plataformas de IU, como Android Auto, o a los fabricantes que no necesitaban la solución alternativa (#3041).
  • Extensión Cast:
    • Se corrigió un error por el que se interrumpía la transferencia de la transmisión a la reproducción local.

1.9.1

26 de enero de 2026

La versión 1.9.1 incluye estas confirmaciones.

  • Biblioteca común:
    • Se admiten cadenas de fecha y hora con solo horas en la diferencia de zona horaria (#2929).
  • ExoPlayer:
    • Permite que la programación dinámica ralentice el intervalo de doSomeWork solo después de que el audio comience a admitir una sincronización de audio y video más fluida al comienzo de la reproducción.
    • Se corrigió un error en DefaultLoadErrorHandlingPolicy por el que FileNotFoundException y tipos de excepciones similares se reintentaban varias veces.
    • Se corrigió un error con la programación dinámica en la que el tiempo calculado para el siguiente doSomeWork se redujo por error por el tiempo transcurrido de la iteración actual de doSomeWork. Si se soluciona este problema, se espera que se extienda el tiempo de inactividad de la CPU y se ahorre energía.
    • Se corrigió un problema por el que algunas reproducciones de archivos Dolby Vision fallaban cuando se intentaba usar un códec AVC o HEVC de resguardo.
    • Se corrigió un error por el que la carga continuaba después de que finalizaba la reproducción cuando se quitaba el elemento que se estaba reproduciendo de una playlist (#2873).
    • Se evita la filtración de instancias de MediaItem cuando se usa ExoPlayer.replaceMediaItem de forma repetida en el mismo elemento (#2993).
    • Se evitan posibles errores de ANR causados por liberaciones de bloqueos de activación de emergencia (#2979).
  • Extractores:
    • MP3: Se analizan los datos de ReplayGain de LAME (#2840).
  • Audio:
    • Se quitó correctamente la compatibilidad con AC4Profile22 y otros perfiles heredados cuando se evalúa la compatibilidad con el decodificador AC-4 en situaciones de Automotive (#2609).
  • Video:
    • Se descartan los códecs de video en dispositivos con un nivel de API inferior al 30 cuando cambia la velocidad de fotogramas del contenido para evitar que se interrumpa la reproducción (#2941).
  • Texto:
    • VobSub: Se corrigieron algunos subtítulos faltantes mediante el manejo correcto de las SPU que contienen solo una secuencia de control o que tienen información crítica dividida en varias secuencias de control (#2935).
  • Extensión IMA:
    • Corrección de errores: Se corrigió un problema por el que el tipo de MIME del anuncio no coincidía con el tipo de MIME proporcionado en el evento IMA LOADED. La corrección ahora asigna el tipo de MIME del anuncio con el índice del grupo de anuncios y la posición del anuncio.
    • Agrega una verificación de nulos antes de acceder al resultado de getAdsManager() y AdEvent.getAd().
  • Sesión:
    • Se corrigió un error por el que, si se detenía un MediaController conectado a una sesión de plataforma, la app fallaba si la detención se producía durante la reproducción de un anuncio (#2948).
    • Agrega verificaciones adicionales en las instancias de extras Bundle en varias clases para protegerte contra las instancias de Bundle con formato incorrecto que se envían desde otros procesos.
    • Se corrigió un problema por el que los comandos faltantes para COMMAND_SEEK_NEXT o COMMAND_SEEK_BACK podían causar brechas en la notificación de contenido multimedia del sistema (#2976).
    • Se quitó el escalamiento de mapas de bits para el ícono de notificación del subproceso principal (#2829).
    • Se corrigió un error por el que el autor, el escritor y el compositor no se usaban como resguardo cuando se convertían desde MediaMetadataCompat y MediaDescriptionCompat heredados (#3018).
  • Descargas:
    • Se corrigieron posibles bucles infinitos cuando SegmentDownloader controla un PriorityTooLowException (para DASH, HLS y SmoothStreaming). Las anulaciones personalizadas de SegmentDownloader que usan el método execute protegido deben proporcionar su tarea unida en un Supplier para que se pueda volver a crear (#2931).
  • Extensión HLS:
    • Pasa el documento JSON de la lista de recursos sin procesar a la devolución de llamada Listener.onAssetListLoadCompleted. Este es un cambio rotundo en una API inestable que requiere que las apps que implementan esta devolución de llamada agreguen un argumento adicional de tipo JSONObject (#2950).
  • Extensión RTSP:
    • Se controlan correctamente los paquetes RTP con marcas de tiempo que se ajustan (#2930).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Se corrigió un posible NullPointerException que puede ocurrir cuando se busca antes de procesar el primer fotograma de video (#2965).
  • Extensión Cast:
    • Se corrigió un error que impedía que la línea de tiempo de RemoteCastPlayer se actualizara correctamente cuando se reemplazaba la playlist.

1.9.0

17 de diciembre de 2025

  • Biblioteca común:
    • Se actualizó minSdk a 23 de acuerdo con otras bibliotecas de AndroidX.
    • Agrega PlayerTransferState, que facilita la transferencia del estado de reproducción entre instancias de Player.
    • Agrega los métodos void mute() y void unmute() a Player para conservar y, en consecuencia, restablecer el volumen de Player antes y después de establecerlo en cero.
    • Se publicaron las clases de utilidad WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager y StuckPlayerDetector que antes usaba ExoPlayer de forma interna para permitir la reutilización en otros reproductores (#1893).
    • Se corrigió el control de objetos de escucha de ForwardingPlayer cuando el reproductor delegado subyacente usa la igualdad de referencia para comparar instancias de objetos de escucha (#2675).
    • Agrega una función de extensión de suspensión Player.listenTo en la biblioteca media3-common-ktx que especifique el Player.Events particular sobre el que se debe actuar.
    • Se corrigió una falla en BasePlayer.getBufferedPercentage que se producía por un desbordamiento de números enteros cuando la posición almacenada en búfer informada era inverosímilmente mucho mayor que la duración informada (#2750).
    • Se corrigió la detección automática del tipo de pista TrackGroup, ya que no se ignora el tipo de MIME de muestra personalizado y se recurre al tipo de pista potencialmente incorrecto del tipo de MIME del contenedor (#2860).
  • ExoPlayer:
    • Se agregó una detección de reproductor bloqueado que activa un error de reproductor StuckPlayerException si el reproductor parece estar bloqueado. Esto sucede en los siguientes casos, en los que cada tiempo de espera predeterminado se puede configurar en ExoPlayer.Builder si es necesario:
      • Después de 10 minutos de STATE_BUFFERING mientras se intenta reproducir y no hay progreso en el almacenamiento en búfer.
      • Después de 10 segundos de STATE_READY mientras se intenta reproducir y no hay progreso en la reproducción.
      • Después de 1 minuto de STATE_READY más allá de la duración declarada sin llegar al final del elemento.
      • Después de 10 minutos con un motivo de supresión de la reproducción mientras se intenta reproducir
    • Habilita el control de bloqueo de activación de forma predeterminada para solucionar problemas con el almacenamiento en búfer durante la reproducción en segundo plano. Esto equivale a configurar ExoPlayer.Builder.setWakeMode en C.WAKE_MODE_LOCAL.
    • Agrega lógica de escucha para actualizar automáticamente el ID del dispositivo virtual cuando se informe un cambio en el Context que se pasó originalmente a ExoPlayer.Builder.
    • Agrega ExoPlayer.setVirtualDeviceId para actualizar manualmente el ID del dispositivo virtual obtenido del Context que se pasó a ExoPlayer.Builder.
    • Asegúrate de que los renderizadores no consuman datos del siguiente elemento de la playlist más de 10 segundos antes de que finalice el elemento actual.
    • Se agregaron setSeekBackIncrementMs, setSeekForwardIncrementMs y setMaxSeekToPreviousPositionMs a ExoPlayer para actualizar estos parámetros de configuración después de la construcción (#2736).
    • Agrega la funcionalidad de almacenamiento previo en caché en DefaultPreloadManager. Ahora, las apps pueden devolver DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) o DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) a través de TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) para indicar que un elemento multimedia se debe almacenar previamente en caché.
    • Usa la funcionalidad de almacenamiento previo en caché de DefaultPreloadManager en la app de demostración de formato corto.
    • Agrega métodos set de DefaultLoadControl.Builder para la reproducción local y ajusta los valores predeterminados de DefaultLoadControl para que funcionen bien con una amplia variedad de archivos locales.
    • Se corrigió un error por el que configurar una playlist vacía podía dejar al reproductor en STATE_READY o STATE_BUFFERING.
    • Mejora las APIs del administrador de precarga:
      • Agrega addMediaItems(List<MediaItem>, List<T>) y addMediaSources(List<MediaSource>, List<T>) que agreguen los elementos o las fuentes multimedia en lote y, luego, llamen automáticamente a invalidate().
      • Agrega removeMediaItems((List<MediaItem>) y removeMediaSources(List<MediaSource>) que quiten los elementos multimedia o las fuentes multimedia en lote, y asegúrate de que el administrador de precarga no comience a precargar ni continúe precargando ninguno de ellos después de la eliminación.
      • Permite que DefaultPreloadManager.setCurrentPlayingIndex(int) se invalide automáticamente. Las apps ya no necesitan llamar a invalidate() de forma explícita después de actualizar el índice de reproducción actual.
    • Se agregó la capacidad de omitir el restablecimiento de fotogramas clave para las búsquedas hacia adelante dentro del mismo grupo de imágenes en el modo de desplazamiento.
    • Se agregó DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) para que las apps establezcan un valor de bytes de búfer objetivo para un reproductor con el playerName especificado. Ahora, el DefaultLoadControl puede tomar decisiones para cada reproductor por separado en función de sus propios bytes asignados y bytes de búfer objetivo.
    • Agrega SkipInfo a AdPlaybackState.AdGroup para incluir información de omisión para cada anuncio del grupo de anuncios.
    • Se corrigió un error por el que llamar a removeMediaItems(List) durante la reproducción de un anuncio al final del video provocaba una falla (#2746).
    • Se corrigieron algunos problemas de tartamudeo en la reproducción de playlists en las que los fotogramas se configuraban y renderizaban por error siempre como la última muestra.
    • Se habilitó la ruta de reintento si el reproductor no puede generar el ID de sesión de audio (#2382, #2678).
    • Se agregó compatibilidad para controlar el total de bytes del búfer de las fuentes en DefaultPreloadManager para evitar que el total de bytes del búfer para la carga previa crezca de forma arbitraria. Para usar la lógica de control predeterminada, las apps pueden establecer los bytes de búfer de destino para la carga previa a través de DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) para un playerName de PlayerId.Preload.name ("preload") y, luego, insertar el DefaultLoadControl creado a través de DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Se agregó cloneAndSet(int, int) a ShuffleOrder con una implementación predeterminada (#2834).
    • Se agrega el desplazamiento de reanudación del contenido cuando se omite la reproducción de anuncios después del ajuste de búsqueda o la transición automática (#2484).
    • Se agregó la API para establecer y observar los parámetros de códec de las pistas de audio y video. Esta función se implementa para los renderizadores basados en MediaCodec y requiere el nivel de API 29 o uno posterior.
      • Usa ExoPlayer.setAudioCodecParameters() y ExoPlayer.setVideoCodecParameters() para aplicar parámetros.
      • Usa ExoPlayer.addAudioCodecParametersChangeListener() y ExoPlayer.addVideoCodecParametersChangeListener() para detectar cambios. La observación de claves específicas del proveedor requiere la API 31 o una versión posterior.
    • Se corrigió el error IllegalStateException que se producía cuando se configuraba una fuente de contenido multimedia vacía después de buscar una posición distinta de cero y, luego, se preparaba el reproductor con una fuente de contenido multimedia no vacía.
    • Se corrigió un error por el que la búsqueda en otros elementos multimedia durante el modo de limpieza podía causar IllegalStateException.
    • Se corrigió un posible NullPointerException en DefaultPlaybackSessionManager (#2885).
    • Habilita las mejoras en el rendimiento de la búsqueda para los videos aptos.
    • Se volvió a habilitar el uso de la desencriptación asíncrona en MediaCodec en la API 36 y versiones posteriores, en las que se corrigieron los problemas de tiempo de espera con esta API de la plataforma (#1641).
    • Cambia el valor predeterminado de MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs a 15 ms y habilita la eliminación más eficiente de fotogramas de video antes de decodificar los videos aptos.
    • Agrega un límite máximo de memoria al cálculo automático de memoria en DefaultLoadControl. Esto solo debería tener efecto si se selecciona una cantidad excesiva de pistas (#2860).
    • Se corrigió un error por el que, si se reproducía en una playlist o en el modo de repetición, la búsqueda en el modo de desplazamiento cerca del final podía provocar una búsqueda del siguiente elemento multimedia.
  • CompositionPlayer:
    • Publica CompositionPlayer con una anotación @ExperimentalApi nueva para indicar que está disponible para experimentación, pero que aún está en desarrollo. Es probable que algunas APIs cambien de forma significativa en versiones futuras, y hay problemas y limitaciones conocidos con algunos casos de uso (algunos no documentados).
    • Agrega compatibilidad con COMMAND_SET_AUDIO_ATTRIBUTES y el control del foco de audio en CompositionPlayer.
    • Se agregó compatibilidad para cambiar la velocidad en secuencias secundarias en CompositionPlayer.
    • Se agregó compatibilidad con EditedMediaItem.removeVideo.
  • Transformador:
    • Usa InAppMp4Muxer como multiplexor predeterminado.
    • Se agregó EditedMediaItem.Builder#setSpeed() y se marcó como obsoleta la clase Effects#createExperimentalSpeedChangingEffects().
    • Reemplaza forceAudioTrack y forceVideoTrack por trackTypes en EditedMediaItemSequence.
  • Selección de pistas:
    • Agrega TrackSelectionParameters.selectTextByDefault para preferir la selección de cualquier pista de texto sin especificar otras preferencias más específicas.
    • Se agregaron preferredVideoLabels, preferredAudioLabels y preferredTextLabels en TrackSelectionParameters para especificar una preferencia para las pistas con una etiqueta específica, por ejemplo, las que se leen de las etiquetas NAME de HLS (#1666).
  • Extractores:
    • FLAC: Se ajustó la detección de encabezados para reducir la posibilidad de encontrar encabezados falsos en los datos de FLAC codificados, lo que generaba errores de decodificación (#558).
    • MP3: Permite espacios entre las etiquetas ID3 (y antes de ellas) al principio de los archivos MP3 (#811, #5718).
    • MP3: Se aumentó el límite de detección a 128 kB para que coincida con el límite de búsqueda existente para un byte de sincronización (#2713).
    • MP3: Se cambió FLAG_ENABLE_INDEX_SEEKING para que prefiera buscar información de los encabezados de metadatos (como Xing y VBRI) cuando estén disponibles, y recurra a la búsqueda basada en índices si no hay otra información de búsqueda presente. Esto mejora el rendimiento de los archivos con metadatos de búsqueda (#2839).
    • MP3: Se cambió Mp3Extractor para que, de forma predeterminada, se asuma una tasa de bits constante (CBR) cuando no se encuentren metadatos de búsqueda (p.ej., Xing, VBRI), incluso cuando se establezca FLAG_ENABLE_INDEX_SEEKING. Esto se basa en el historial de especificaciones de MP3, en el que CBR era el estándar y VBR requiere encabezados explícitos. Esto mejora la capacidad de búsqueda inmediata de archivos sin metadatos, a costa de la precisión potencial de los archivos VBR que no tienen encabezados. Ahora, la búsqueda de índices se usa como resguardo si la suposición de CBR no se puede buscar (p.ej., para transmisiones de longitud desconocida) (#2848).
    • MP4: Se eliminó la ambigüedad entre los tipos de MIME audio/mpeg (MP3), audio/mpeg-L1 y audio/mpeg-L2 con una vista previa del valor de capa de la primera muestra antes de emitir un formato de pista desde el extractor (#2683).
    • MP4: Se mejoró la eficiencia de detección de archivos muy grandes, ya que se asume que un cuadro stbl de más de 1 MB implica que el archivo no debe estar fragmentado (#2650).
    • MP4: Se agregó compatibilidad con los metadatos ©mvn (nombre del movimiento) y ©mvi (índice del movimiento). Ahora se emiten como objetos TextInformationFrame en Format.metadata con los IDs MVNM y MVIN, respectivamente (#2754).
    • MP4: Ignora las pistas a las que les falta el cuadro stsd (en lugar de no analizar todo el archivo).
    • Matroska: Se agregó compatibilidad con la detección de DTS-HD (#6225).
    • Se corrigió un problema en MatroskaExtractor en el que la búsqueda podía ser imprecisa para archivos con varias pistas. Los puntos de inserción ahora se asocian correctamente con sus pistas respectivas, lo que genera saltos más precisos.
    • MPEG-TS: Se corrigió el error IllegalArgumentException de ReorderingBufferQueue causado por paquetes PES sin marca de tiempo (#2764).
    • Se agregó compatibilidad para extraer fotos en movimiento en formato HEIC. HeifExtractor ahora puede analizar archivos HEIC que contienen pistas de video y audio incorporadas.
  • Inspector:
    • Se introdujo un nuevo módulo :media3-inspector para que sirva como el lugar dedicado para las utilidades de inspección de contenido multimedia. Este módulo ahora aloja un nuevo androidx.media3.inspector.MetadataRetriever, que proporcionará una API unificada para la extracción de metadatos y fotogramas. La función androidx.media3.exoplayer.MetadataRetriever existente ahora dejó de estar disponible y se reemplazó por esta nueva versión.
    • Se introdujo androidx.media3.inspector.FrameExtractor, una nueva API pública para la extracción de fotogramas. Esta clase AutoCloseable proporciona una forma de extraer fotogramas con compatibilidad con video HDR, efectos de video y selección de decodificador personalizado. Se debe crear a través de su Builder para un MediaItem específico.
    • FrameExtractor: Se agregó getThumbnail() para extraer un fotograma de miniatura representativo de un archivo multimedia sin necesidad de una marca de tiempo específica.
    • Agrega androidx.media3.inspector.MediaExtractorCompat, un reemplazo directo para android.media.MediaExtractor de la plataforma que proporciona una forma de extraer muestras de contenido multimedia codificado sin procesar de un archivo multimedia. La clase androidx.media3.exoplayer.MediaExtractorCompat existente ahora está obsoleta y se reemplazó por esta nueva clase.
  • Audio:
    • Haz que las instancias de AudioProcessor estén al tanto de la búsqueda.
    • Permite insertar la nueva interfaz AudioOutputProvider en DefaultAudioSink.Builder para admitir rutas de acceso de salida de audio personalizadas. El valor predeterminado es AudioTrackAudioOutputProvider.
    • Controla las búsquedas en GainProcessor.
    • Se utilizan las capacidades de perfil y nivel del decodificador AC-4 en la evaluación de compatibilidad con el formato de pista (#2580).
    • Se evitan posibles demoras causadas por el control de las devoluciones de llamada de cambio de enrutamiento al comienzo de la reproducción (#2646).
    • Se permite la reutilización de códecs para los formatos EAC3, EAC3-JOC y AC-4 (#1346).
    • Se agregó compatibilidad con muestras de PCM flotantes en Sonic.
    • Se agregó compatibilidad con muestras de PCM de 16 bits en ToFloatPcmAudioProcessor.
  • Video:
    • Inhabilitar la reutilización de códecs para el contenido de Dolby Vision con diferentes perfiles
    • Se volvió a habilitar la solución alternativa para los puntos de rendimiento informados de forma incorrecta para los códecs seguros (#2856).
  • Texto:
    • Se corrigió el análisis de los subtítulos CEA-6/708 en el contenido de Dolby Vision (#2775).
  • Imagen:
    • Se corrigió el problema de ScrubbingMode en el que el reproductor se atasca mientras se limpia una pista de miniaturas de DASH (#2815).
  • DRM:
    • Se cambió el tipo de datos que se devuelve de los métodos MediaDrmCallback de byte[] a un nuevo tipo MediaDrmCallback.Response para permitir que se devuelva información opcional adicional. Este es un cambio rotundo de origen, pero las fallas se pueden resolver fácilmente uniendo el valor de retorno byte[] anterior con new Response antes de que se devuelva.
    • Se agregó información clave de la solicitud, como la URL y la latencia, a AnalyticsListener.onDrmKeysLoaded (#1001).
    • Mueve los datos de la solicitud de aprovisionamiento de un parámetro de URL al cuerpo de la solicitud POST.
  • Efecto:
    • Agrega Presentation.copyWithUnsetSideRoundedTo para redondear el lado de salida sin establecer cuando se crea Presentation con una sola longitud de lado.
  • Multiplexores:
    • Se agregó MediaMuxerCompat, un reemplazo directo para el framework MediaMuxer.
    • Agrega MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() para permitir la creación de fotos en movimiento.
    • Agrega WebmMuxer para permitir la multiplexación de flujos de contenido multimedia OPUS, VORBIS, VP8 y VP9 en un formato de archivo webm.
  • Extensión IMA:
    • Se quitaron las reglas de ProGuard personalizadas para que las apps puedan usar las que se lanzaron en el archivo de IMA para Android.
    • Se agregó ImaServerSideAdInsertionUriBuilder.setNetworkCode, una nueva API para establecer el código de red de Google Ad Manager para que el SDK de IMA controle los identificadores de anuncios como se especifica en la configuración de Google Ad Manager. Los códigos de red son opcionales, pero se recomiendan para las solicitudes de transmisión de servicio completo. Para encontrar el código de red, consulta este artículo.
    • Se aumentó la dependencia de IMA a la versión 3.37.0, que requiere habilitar la expansión de sintaxis de la biblioteca principal. Las apps dependientes también deben habilitar esta opción. Consulta las notas de configuración del IMA. * Se agregaron opciones de IU personalizada de IMA para DAI en el compilador de URI de SSAI. Las opciones de IU personalizada para la inserción de anuncios del servidor incluyen la compatibilidad con la renderización de "Omitible" y "Acerca de este anuncio". Actualmente, la función está disponible para publicadores seleccionados que se encuentran en una lista de entidades permitidas. Este cambio también actualiza la versión del SDK de IMA a la 3.38.0 (notas de la versión) para acceder a la API de opciones de IU personalizada.
    • Se corrige un problema por el que el error de preparación del contenido después de un anuncio se informaba de forma incorrecta como un error de reproducción de anuncios (#2656).
  • Sesión:
    • Se agregó un parámetro nuevo a MediaSession.Callback.onPlaybackResumption para indicar si la llamada se realiza solo para recopilar información o para iniciar la reproducción (#1764).
    • Se actualizó MediaSession.ControllerInfo.isTrusted para que también declare como confiables los controladores de la propia app (#2542).
    • Se agregó MediaSessionService.triggerNotificationUpdate para activar manualmente una actualización de notificaciones (#1833).
    • Agrega ProgressListener a los métodos de comandos personalizados.
    • Cambia el valor predeterminado de MediaLibrarySession.Builder.setLibraryErrorReplicationMode a no fatal.
    • Se agregó un parámetro Context a MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Lee el ID de control de volumen de la plataforma PlaybackInfo en lugar de recuperarlo a través de Binder. Esto garantiza que el tipo de reproducción y el ID de control de volumen se lean de forma atómica y coincidan entre sí.
    • Se corrigió un error por el que se filtraban los eventos de teclas ACTION_UP antes de pasarlos a la devolución de llamada para el control personalizado. Esto aporta paridad con lo que hacía media1 y lo que hace la plataforma (#2637).
    • Se corrigió un error por el que PlayerWrapper llamaba a getCurrentTimeline() incluso cuando el comando no estaba disponible (#2665).
    • Se corrigió un error por el que se dejaba un mensaje en la cola de mensajes del looper principal, lo que causaba una fuga de memoria después de que finalizaba el servicio (#2692).
    • Cuando se conecta a una app de sesión heredada con un MediaBrowser, los comandos personalizados se envían a la sesión solo si la acción personalizada se anuncia como una acción personalizada en PlaybackStateCompat de la sesión heredada. Todas las demás acciones personalizadas se envían al servicio.
    • Se implementó onAudioSessionIdChanged para notificar a los controladores de contenido multimedia cuando la sesión establece un ID de sesión de audio (#244).
    • Se corrigió un error por el que KEYCODE_HEADSETHOOK no iniciaba el reproductor cuando llegaba el evento de tecla multimedia Intent en onStartCommand(). Esto se corrige controlando "KEYCODE_HEADSETHOOK" como KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Se corrigió un error por el que no se comunicaba el tamaño de Surface entre la sesión y el controlador, lo que provocaba que no se aplicaran los efectos de video en demo-session. Si usas un controlador, este podría ser un cambio rotundo si tu reproductor no puede controlar una llamada a setVideoSurfaceHolder.
    • Se corrigió la propagación de valores de metadatos CharSequence que no son String, como las cadenas con estilo de intervalo (#2853).
    • Agrega CommandButton.executeAction para que los controles puedan activar la acción prevista con mayor facilidad. También permiten especificar parámetros para algunos comandos de reproductor y sesión para definir qué acción activar.
    • Agrega retrocompatibilidad para las instancias de CommandButton con Player.Command o SessionCommand no personalizado para definir su acción. Ahora, se representan correctamente en las sesiones multimedia de la plataforma, por ejemplo, para la IU del sistema o Android Auto.
    • Se solucionó un problema por el que se comprimía el mismo Bitmap varias veces cuando se conectaba un MediaController a una sesión multimedia de la plataforma.
  • IU:
    • Agrega la clase ProgressStateWithTickInterval y el elemento que admite composición rememberProgressStateWithTickInterval correspondiente al módulo media3-ui-compose. Este contenedor de estado se usa en demo-compose para mostrar la posición y la duración actuales en formato de texto.
    • Agrega MuteButtonState a ui-compose para controlar el silenciamiento del volumen de Player. Este contenedor de estado se usa en demo-compose para mostrar el botón de activación o desactivación de silencio.
    • Agrega clases ProgressStateWithTickCount y el elemento que admite composición rememberProgressStateWithTickCount correspondiente al módulo media3-ui-compose. Este contenedor de estado se usa en demo-compose para mostrar el progreso como una barra de progreso horizontal de solo lectura.
    • Agrega el elemento componible ContentFrame a media3-ui-compose, que combina la administración de PlayerSurface con el cambio de tamaño de la relación de aspecto y la cobertura con un obturador.
    • Se solucionó un error conocido de la plataforma de la API 34 que causaba videos estirados o recortados cuando se usaba SurfaceView dentro de un AndroidView de Compose y, por lo tanto, afectaba a los elementos componibles ContentFrame y PlayerSurface con SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Crea un nuevo módulo media3-ui-compose-material3 y agrégale elementos componibles con el tema de Material 3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton y MuteButton).
    • Agrega el elemento componible TimeText a media3-ui-compose-material3 para mostrar el progreso del reproductor en forma de texto. Se puede configurar para que muestre la posición actual, la duración o el tiempo restante.
    • Agrega compatibilidad para colocar un botón de ruta de acceso de contenido multimedia en PlayerView.
    • Usa BidiFormatter para mostrar correctamente la puntuación en los subtítulos de texto de derecha a izquierda (#11214).
  • Extensión HLS:
    • Analiza los atributos de omisión de anuncios intersticiales de HLS.
    • Asigna los atributos de control de omisión de la playlist de HLS y el documento de la lista de recursos al AdPlaybackState para el acceso público.
    • Se corrigió un error por el que se descartaba la hora de inicio de la lista de reproducción cuando se quitaba de ella la etiqueta EXT-X-PROGRAM-START-DATE que definía la hora de inicio (#2760).
    • Se usa la búsqueda binaria para encontrar el índice de segmento de una posición determinada en la lista de reproducción (#2826).
    • Agrega HlsInterstitialsAdsLoader.skipCurrentAd() y skipCurrentAdGroup(), y los métodos correspondientes para omitir anuncios y grupos de anuncios por índice.
    • Se agregó HlsInterstitialsAdsLoader.Listener.onAdStarted para informar el inicio de un período de anuncio (#2859).
    • Acepta el espacio como separador de fecha y hora en las cadenas de fecha y hora ISO 8601.
    • Se controla correctamente la recuperación del siguiente fragmento para un HlsMediaPlaylist sin segmentos (#2821).
    • Usa la posición de inicio predeterminada para los anuncios previos al video en las transmisiones en vivo.
  • Extensión DASH:
    • Se corrigió el error UnsupportedOperationException que se producía cuando se reproducían transmisiones de DASH con un manifiesto de URI data: no jerárquico (#2688).
    • Restablece LiveConfiguration al valor proporcionado por el MediaItem de DashMediaSource cuando se lance y cuando el usuario actualice el elemento multimedia (#2606).
    • Se evitan las fallas causadas por actualizaciones de manifiestos no válidas que no se informaron como errores del reproductor (#2805).
  • Extensión RTSP:
    • Se controla el error de paquetes RTP faltantes cuando se procesan unidades NAL fragmentadas para H264 y H265 (#2613).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Extensión AV1: El decodificador de software AV1 ahora usa la biblioteca dav1d de alto rendimiento, que reemplaza la implementación anterior de libgav1 para mejorar la velocidad de decodificación.
    • Extensión de FFmpeg: Se corrigió un problema que impedía que se reprodujeran algunos archivos FLAC, ya que se garantizaba que el bloque STREAMINFO se analizara y pasara correctamente al decodificador (#2887).
  • Extensión Cast:
    • Agrega CastPlayer.Builder, que permite que CastPlayer realice la reproducción local y de Cast. Para mantener el comportamiento anterior de CastPlayer, que solo admite la reproducción de Cast, puedes usar RemoteCastPlayer. Los constructores CastPlayer preexistentes conservan su comportamiento anterior, pero están obsoletos y se recomienda usar los compiladores CastPlayer o RemoteCastPlayer en su lugar.
    • Se dejó de aplicar un tipo de MIME no nulo en DefaultMediaItemConverter.
    • Usa MediaItem.mediaMetadata.mediaType para inferir el MEDIA_TYPE de Cast que se usará en DefaultCastOptionsProvider#toMediaQueueItem, cuando esté disponible.
    • Habilita las transferencias de remoto a local en DefaultCastOptionsProvider.
    • Agrega compatibilidad con Cast en la demostración de Session.
    • Se agregó compatibilidad para mostrar un botón de ruta de acceso de contenido multimedia en una IU de Compose.
    • Agrega compatibilidad para mostrar un botón de ruta de acceso de contenido multimedia en un menú de la barra de acciones.
    • Se agregó compatibilidad para mostrar un botón de ruta de acceso de contenido multimedia como una IU de View.
  • Utilidades de prueba:
    • Se agregó una diferencia de tiempo máxima para el comportamiento de avance automático de FakeClock. El valor predeterminado es de 1 segundo, pero se puede configurar a través de FakeClock.Builder.
    • Se agregó la diferencia de tiempo máxima entre los mensajes para RobolectricUtil.runMainLooperUntil (y runLooperUntil). El valor predeterminado es de 1 segundo, pero se puede configurar a través de nuevas sobrecargas de estos métodos.
    • Transfiere CapturingRenderersFactory de test-utils a test-utils-robolectric.
  • Se quitan los símbolos obsoletos:
    • Se quitó el constructor DefaultPreloadManager obsoleto. Se usa DefaultPreloadManager.Builder en su lugar.
    • Se quitaron los constructores EditedMediaItemSequence obsoletos. Se usa EditedMediaItemSequence.Builder en su lugar.
    • Se quita BitmapFactoryImageDecoder.BitmapDecoder. Se usa ExternallyLoadedImageDecoder en su lugar.
    • Se quitó ShadowMediaCodecConfig.forAllSupportedMimeTypes(), que estaba obsoleto. Usa ShadowMediaCodecConfig.withAllDefaultSupportedCodecs() en su lugar.
    • Se quitó ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(), que ya no se usa. Se usa ShadowMediaCodecConfig.withNoDefaultSupportedCodecs() en su lugar.

1.9.0-rc01

1 de diciembre de 2025

Usa la versión estable 1.9.0.

1.9.0-beta01

20 de noviembre de 2025

Usa la versión estable 1.9.0.

1.9.0-alpha01

22 de octubre de 2025

Usa la versión estable 1.9.0.

Versión 1.8.0

1.8.1

21 de mayo de 2026

La versión 1.8.1 incluye las siguientes confirmaciones.

  • Efecto:
    • Establece de forma explícita GL_DRAW_BUFFER y GL_READ_BUFFER cuando realices la transición desde un contexto sin plataforma.

Versión 1.8.0

30 de julio de 2025

La versión 1.8.0 incluye estas confirmaciones.

  • Biblioteca común:
    • Se agregó compatibilidad para reemplazar el reproductor en ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Se agregó un método get para el modo aleatorio a la interfaz ExoPlayer (#2522).
    • Se arroja una excepción de forma más clara si se accede a DefaultAudioSink desde varios subprocesos. Si esto sucede debido a una llamada a RendererCapabilities.getFormatSupport fuera del reproductor, asegúrate de llamar a este método en el mismo subproceso que el de reproducción de ExoPlayer o usa una instancia diferente de la que se usa para la reproducción (#1191).
    • Se corrigió un error por el que DefaultTrackSelector podía marcar como no compatibles los formatos de audio que no son estéreo en las TVs.
    • Asegúrate de que el último fotograma se renderice correctamente cuando uses la marca DECODE_ONLY de MediaCodec (que está habilitada de forma predeterminada en el modo de limpieza).
    • Se agregó compatibilidad para usar el ID de dispositivo virtual del Context que se pasa a ExoPlayer.Builder.
    • Habilita la programación dinámica de forma predeterminada en el modo de limpieza.
    • Se evita la recarga innecesaria de una fuente cuando se busca el final de un elemento.
    • Usa MediaCodec.BUFFER_FLAG_DECODE_ONLY de forma predeterminada en el modo de limpieza.
    • Se arroja IllegalStateException cuando un ExoPlayer reproduce PreloadMediaSource con un subproceso de reproducción diferente del subproceso de precarga (#2495).
    • Se agregó cloneAndMove a ShuffleMode con una implementación predeterminada (#2226).
    • Se cambió el comportamiento predeterminado de Renderer.getMinDurationToProgressUs para que devuelva un valor mayor si no se requiere una llamada a render.
    • Se corrigió un error por el que la programación interna retrasaba el último fotograma cuando se buscaba el final durante la pausa. Por el momento, la corrección de errores solo tiene efecto si ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled está habilitado.
    • Agrega el método ExoPlayer.setScrubbingModeEnabled(boolean). Esto optimiza el reproductor para muchas búsquedas frecuentes (por ejemplo, cuando un usuario arrastra una barra de desplazamiento). El comportamiento del modo de limpieza se puede personalizar con setScrubbingModeParameters(..) en ExoPlayer y ExoPlayer.Builder.
    • Permite personalizar la tolerancia de búsqueda fraccionaria en el modo de desplazamiento.
    • Aumenta la tasa de funcionamiento del códec en el modo de limpieza.
    • Se corrigió un error por el que es posible que nunca se informen los errores de preparación en el contenido de AdsMediaSource (#2337).
    • Se corrigió la fuga de memoria en MergingMediaSource, por ejemplo, cuando se realiza la carga lateral de subtítulos (#2338).
    • Se permite que CmcdConfiguration.Factory devuelva null para inhabilitar el registro de CMCD para elementos multimedia específicos (#2386).
    • Se aumentó el tamaño predeterminado del búfer de imágenes de 128 kB (error de copiar y pegar de las pistas de texto) a 26 MB, que es lo suficientemente grande para imágenes Ultra HDR de 50 MP (#2417).
    • Se agregó PreCacheHelper, que permite que las apps almacenen en caché previa un solo elemento multimedia con la posición de inicio y la duración especificadas.
    • Se agregó compatibilidad con la carga previa desde la posición especificada en DefaultPreloadManager.
  • Transformador:
    • Agrega CodecDbLite, que habilita optimizaciones específicas del chipset para la configuración de codificación de video.
    • Agrega la marca setEnableCodecDbLite a DefaultEncoderFactory para habilitar la optimización de la configuración de CodecDB Lite. De forma predeterminada, esta marca se configura con el valor falso.
    • Ahora, para llenar un espacio inicial (agregado a través de addGap()) con audio silencioso, se requiere configurar de forma explícita experimentalSetForceAudioTrack(true) en EditedMediaItemSequence.Builder. Si la brecha se encuentra en el medio de la secuencia, no se requiere esta marca.
    • Mueve la interfaz Muxer de media3-transformer a media3-muxer.
    • Establece el parámetro de configuración MediaItem.Builder().setImageDuration(long) como obligatorio para importar un elemento multimedia como imagen.
    • Se agregó Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean), que incluye una lista de edición de MP4 cuando se recorta para indicarles a los reproductores que ignoren las muestras entre el fotograma clave antes del punto de inicio del recorte y el punto de inicio del recorte.
    • Actualiza la app de Composition Demo para usar Kotlin y Jetpack Compose, y agrega un VideoCompositorSettings personalizado para organizar las secuencias en un diseño de 2 x 2 o PiP.
  • Extractores:
    • Se analizan los metadatos de los archivos MP4 fragmentados (#2084).
    • JPEG: Se agregó compatibilidad con fotos en movimiento que no tienen un segmento Exif al principio (#2552).
    • Se agregó compatibilidad para buscar en MP4 fragmentados con varios átomos sidx. Este comportamiento se puede habilitar con la marca FLAG_MERGE_FRAGMENTED_SIDX en FragmentedMp4Extractor (#9373).
    • Se ignoran las tablas de búsqueda vacías en los archivos FLAC (incluidas las que solo contienen puntos de búsqueda de marcador de posición) y se recurre a la búsqueda binaria si se conoce la duración del archivo (#2327).
    • Se corrigió el análisis de las unidades SEI de H.265 para omitir por completo los tipos de SEI no reconocidos (#2456).
    • Actualiza WavExtractor para usar los datos de SubFormat de la extensión de encabezado para el formato de audio cuando se analiza un archivo de tipo WAVE_FORMAT_EXTENSIBLE.
    • MP4: Se agregó compatibilidad con los cuadros ipcm y fpcm que definen pistas de audio PCM sin procesar (no se admite PCM de punto flotante de 64 bits).
    • MP4: Controla la parte de rotación de las matrices de transformación tkhd que rotan y reflejan el video. Esto garantiza que los videos reflejados que se toman con la cámara frontal del iPhone se muestren de forma correcta, pero se reflejen de forma incorrecta en el eje Y (#2012).
    • MP3: Se usan la duración y el tamaño de los datos de los metadatos de tasa de bits variable de Xing, VBRI y similares que no se pueden buscar cuando se recurre a la búsqueda de tasa de bits constante debido a FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Audio:
    • Se corrigió un error por el que no se llamaba a AnalyticsListener.onAudioPositionAdvancing cuando la reproducción de audio se iniciaba muy cerca del final del contenido multimedia.
    • Se agregó compatibilidad con todos los formatos de muestra de PCM lineal en ChannelMappingAudioProcessor y TrimmingAudioProcessor.
    • Se agregó compatibilidad con las brechas de audio en CompositionPlayer.
    • Quita la llamada falsa a BaseAudioProcessor#flush() de BaseAudioProcessor#reset().
    • Permite la mezcla ascendente o descendente de potencia constante en DefaultAudioMixer.
    • Se hicieron públicos ChannelMappingAudioProcessor, TrimmingAudioProcessor y ToFloatPcmAudioProcessor (#2339).
    • Usa AudioTrack#getUnderrunCount() en AudioTrackPositionTracker para detectar subdesbordamientos en DefaultAudioSink en lugar de la estimación de mejor esfuerzo.
    • Se mejoró la suavización de la marca de tiempo de audio para la desviación de posición inesperada del dispositivo de salida de audio.
    • Se corrigió un error por el que se interrumpía la sincronización de audio y video durante los primeros 10 segundos después de reanudar la reproducción tras una pausa cuando se conectaban dispositivos Bluetooth.
    • Se corrigió un error por el que AnalyticsListener.onAudioPositionAdvancing no informaba la hora en que el audio comenzaba a avanzar, sino la hora de la primera medición.
    • Se corrigió la recuperación del audio multicanal después de recurrir al audio estéreo en algunos dispositivos (#2258).
  • Video:
    • Se extendió la solución alternativa de superficie desconectada a los dispositivos "lenovo" y "motorola" (#2059).
    • Se mejoró la fluidez de la liberación de fotogramas de video durante el inicio cuando las muestras de audio no comienzan exactamente en la posición solicitada.
    • Se extendió la solución alternativa de superficie desconectada a los dispositivos "realme" (#2059).
    • Se agregó la API experimental de ExoPlayer para incluir la marca MediaCodec.BUFFER_FLAG_DECODE_ONLY cuando se ponen en cola los búferes de entrada de solo decodificación. Este parámetro de configuración le indicará al decodificador que omita los búferes de solo decodificación, lo que acelerará la búsqueda. Habilítala con DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Se mejoraron las verificaciones de rendimiento de los códecs de video de software. Esto puede hacer que algunas pistas adicionales se marquen como EXCEEDS_CAPABILITIES.
    • Se corrigieron los errores de reproducción de Widevine VP9 en algunos dispositivos (#2408).
  • Texto:
    • Se agregó compatibilidad con pistas de VobSub en archivos MP4 (#2510).
    • Se corrigió un bloqueo de reproducción que se producía cuando un segmento de subtítulos no se cargaba inicialmente y, luego, se cargaba correctamente, seguido de varios segmentos de subtítulos vacíos (#2517).
    • Se corrigieron SSA y SubRip para mostrar una indicación en curso cuando se habilitan los subtítulos (#2309).
    • Se corrigió un problema por el que la reproducción se detenía cuando se cambiaba de una transmisión con un error de subtítulos a una transmisión en vivo con una pista de subtítulos vacía (#2328).
    • Se corrigieron los subtítulos CEA-608 distorsionados cuando se reproducen transmisiones H.262 que contienen fotogramas B (#2372).
    • Se agregó compatibilidad con subtítulos de SSA con CodecId = S_TEXT/SSA en archivos de Matroska. Anteriormente, MatroskaExtractor solo admitía CodecId = S_TEXT/ASS, que representa la variante "avanzada" (v4+) de los subtítulos de SubStation Alpha (pero la lógica de análisis de ExoPlayer es la misma para ambas variantes) (#2384).
    • Se agregó compatibilidad con la propiedad layer en los archivos de subtítulos de SubStation Alpha (SSA), que se usa para definir el orden Z de las indicaciones cuando se muestra más de una en pantalla al mismo tiempo (#2124).
  • Metadatos:
    • Se agregó compatibilidad para recuperar la duración del contenido multimedia y Timeline a MetadataRetriever, y se migró a una API de AutoCloseable basada en instancias. Usa el nuevo Builder para crear una instancia de un MediaItem y, luego, llama a retrieveTrackGroups(), retrieveTimeline() y retrieveDurationUs() para obtener ListenableFuture para los metadatos. Los métodos estáticos anteriores dejaron de estar disponibles (#2462).
  • Imagen:
    • Limita los mapas de bits decodificados al tamaño de visualización en BitmapFactoryImageDecoder para evitar que una app falle con Canvas: trying to draw too large bitmap. de PlayerView cuando intente mostrar imágenes muy grandes (p.ej., de 50 MP).
    • Cambia la firma de DefaultRenderersFactory.getImageDecoderFactory() para que tome un parámetro Context.
    • Alinea el tamaño máximo de salida del mapa de bits que se usa en CompositionPlayer con el que ya se usa en Transformer (lo que significa que CompositionPlayer no tiene en cuenta el tamaño de la pantalla cuando decodifica mapas de bits, a diferencia de ExoPlayer).
  • DRM:
    • Se agregó una nueva sobrecarga de OfflineLicenseHelper.newWidevineInstance que acepta un MediaItem.DrmConfiguration para que los encabezados de la solicitud HTTP se puedan aplicar correctamente (#2169).
  • Efecto:
    • Agrega Presentation.createForShortSide(int), que crea un Presentation que garantiza que el lado más corto siempre coincida con el valor dado, independientemente de la orientación de entrada.
  • Multiplexores:
    • Se corrigió un error por el que no se establecían las marcas de muestra correctas para las muestras de audio en MP4 fragmentado.
    • La API de writeSampleData() ahora usa la clase BufferInfo específica del multiplexor en lugar de MediaCodec.BufferInfo.
    • Agrega Muxer.Factory#supportsWritingNegativeTimestampsInEditList, que se establece como falso de forma predeterminada.
  • Extensión IMA:
    • Se corrigió un error por el que un error de carga en un anuncio podía invalidar accidentalmente otro grupo de anuncios.
    • Se corrigió un error por el que los grupos de anuncios después del final de una ventana de VOD detenían la reproducción. Los grupos de anuncios con una hora de inicio posterior a la ventana ya no se ponen en cola en el MediaPeriodQueue (#2215).
  • Sesión:
    • Se corrigió un error por el que se ignoraban las conexiones de controladores de Media3 de terceros sin privilegios.
    • Se quitó la verificación de comandos disponibles cuando se envían comandos personalizados a un MediaBrowserServiceCompat heredado. Esto es similar al comportamiento de los controladores o navegadores heredados cuando se conectan a una app heredada.
    • Se corrigió un error que causaba que el primer error de reproducción de un reproductor se tratara de forma incorrecta como una excepción personalizada persistente. Esto evita que la aplicación se recupere.
    • Se corrigió un error por el que algunos cambios del controlador que no controla la sesión podían causar IllegalStateExceptions.
    • Se corrigió un error por el que las acciones del control que no controla la sesión podían dejar el control en un estado no válido.
    • Se corrigió la advertencia de incumplimiento de inicio no seguro de StrictMode (#2330).
    • Se corrigió un error por el que llamar a setSessionExtras desde el subproceso principal cuando se ejecutaba el reproductor desde un subproceso de la aplicación diferente del subproceso principal causaba un IllegalStateException (#2265).
    • No muestres automáticamente una notificación si un reproductor está configurado con elementos multimedia sin prepararlos ni reproducirlos (#2423https://github.com/androidx/media/issues/2423). Este comportamiento se puede configurar a través de MediaSessionService.setShowNotificationForIdlePlayer.
    • Agrega PlaybackException personalizados para todos los controladores o los seleccionados.
    • Se corrigió un error por el que la búsqueda en una transmisión en vivo en un MediaController podía causar un IllegalArgumentException.
    • En el caso de las transmisiones en vivo, se detiene la publicación de una posición de reproducción y la capacidad de buscar en el elemento actual para los controladores multimedia de la plataforma, con el objetivo de evitar artefactos de posición en la IU de Android Auto (y otros controladores que usan esta información de la sesión multimedia de la plataforma) (#1758).
    • Se corrigió un error por el que pasar un valor nulo a getLibraryRoot de un MediaBrowser conectado a un MediaBrowserServiceCompat heredado producía una NullPointerException.
    • Se corrigió un error por el que el envío de acciones personalizadas, un resultado de la búsqueda o una solicitud de getItem provocaban que la app de sesión heredada fallara con un ClassNotFoundException.
    • Se corrigió un error por el que se compartía MediaItem.LocalConfiguration.uri con el MediaMetadata de las sesiones de la plataforma. Para compartir un URI de forma intencional y permitir que los controladores vuelvan a solicitar el contenido multimedia, establece MediaItem.RequestMetadata.mediaUri en su lugar.
  • IU:
    • Se corrigió un error por el que PlayerSurface dentro de componentes reutilizables, como LazyColumn, no funcionaba correctamente (#2493).
    • Se corrigió un error de Compose que generaba una brecha entre la configuración de los estados iniciales de los botones y la observación del cambio de estado (p.ej., las formas de los íconos o la habilitación). Ahora se detectan los cambios realizados en el reproductor fuera del período de observación (#2313).
    • Agrega contenedores de estado y elementos componibles al módulo media3-ui-compose para SeekBackButtonState y SeekForwardButtonState.
    • Se agregó compatibilidad con el modo de desplazamiento de ExoPlayer a PlayerControlView. Cuando está habilitado, el reproductor entra en modo de arrastre cuando el usuario comienza a arrastrar la barra de arrastre, emite una llamada player.seekTo para cada movimiento y, luego, sale del modo de arrastre cuando se levanta el toque de la pantalla. Esta integración se puede habilitar con time_bar_scrubbing_enabled = true en XML o el método setTimeBarScrubbingEnabled(boolean) de Java o Kotlin.
    • Haz que PlayerSurface acepte un argumento Player anulable.
  • Descargas:
    • Se agregó compatibilidad con la descarga parcial para transmisiones progresivas. Las apps pueden preparar una transmisión progresiva con DownloadHelper y solicitar un DownloadRequest del asistente especificando las posiciones de inicio y finalización del contenido multimedia basado en el tiempo que debe abarcar la descarga. El objeto DownloadRequest que se muestra contiene el rango de bytes resuelto, con el que se puede crear un objeto ProgressiveDownloader y descargar el contenido correspondiente.
    • Agrega DownloadHelper.Factory con el que se reemplazan los métodos DownloadHelper.forMediaItem() estáticos.
    • Agrega Factory para las implementaciones de SegmentDownloader.
    • Se agregó compatibilidad con la descarga parcial de transmisiones adaptables. Las apps pueden preparar una transmisión adaptable con DownloadHelper y solicitar un DownloadRequest del asistente especificando las posiciones de inicio y finalización del contenido multimedia basado en el tiempo que debe abarcar la descarga. El DownloadRequest que se devuelve contiene el período resuelto, con el que se puede crear un SegmentDownloader concreto y descargar el contenido correspondiente.
  • Extensión de Cronet:
    • Se agregó el control automático de cookies (#5975).
  • Extensión HLS:
    • Se corrigió un error por el que HlsSampleStreamWrapper intentaba buscar dentro del búfer cuando no había fragmentos disponibles en él (#2598).
    • Se corrigió un error por el que los cambios en la selección de pistas después de cargar partes de baja latencia y las sugerencias de carga previa podían hacer que la reproducción se detuviera o se congelara (#2299).
    • Se evita que se realicen demasiadas recargas esperando la mitad de la duración objetivo cuando el servidor no respeta CAN-BLOCK-RELOAD=YES (#2317).
    • Se corrigió un error por el que se detenía la reproducción cuando se iniciaba una transmisión de anuncios intersticiales antes de un anuncio durante el video y se intentaba resolver la lista de recursos para el anuncio incorrecto (#2558).
    • Se corrigió el análisis de la playlist para aceptar \f (salto de página) en los valores de los atributos de cadena entre comillas (#2420).
    • Se agregó compatibilidad para actualizar anuncios intersticiales con el mismo ID (#2427).
    • Se corrigió un error por el que, a veces, los errores de carga de la playlist no se propagaban una vez que una transmisión en vivo se quedaba sin segmentos para cargar (#2401https://github.com/androidx/media/issues/2401).
    • Se agrupan las representaciones de subtítulos por etiqueta NAME, de manera similar a como ya se agrupan las representaciones de audio (#1666).
    • Admite X-ASSET-LIST y transmisiones en vivo con HlsInterstitialsAdsLoader.
  • Extensión DASH:
    • Se corrigió un problema por el que el conjunto de adaptación de reproducción rápida se combinaba con su conjunto de adaptación principal para formar un TrackGroup no válido (#2148).
    • Se corrigió un error por el que acortar la duración de un período de DASH podía arrojar una excepción cuando la canalización de renderización ya había leído muestras más allá de la nueva duración (#2440).
    • Se corrigió un error por el que no se seguía el redireccionamiento cuando se usaban parámetros de consulta de CMCD (#2475).
  • Extensión RTSP:
    • Se agregó compatibilidad con el paquete de agregación de RTP para H265 de conformidad con RFC 7798#4.4.2 (#2413).
    • Se corrigió RtspClient para usar el URI de ubicación según se proporciona cuando se procesa una respuesta HTTP 302 (#2398).
    • Se agregó compatibilidad con el análisis de SessionDescriptions que contienen líneas con caracteres de espacio en blanco al final (#2357).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Se corrigió un error por el que DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange no tenía efecto para las extensiones de decodificador de audio (#2258).
  • Extensión Cast:
    • Se agregó compatibilidad con setVolume() y getVolume() (#2279).
    • Se evita que CastPlayer ingrese a STATE_BUFFERING mientras el cronograma está vacío.
    • Se agregó compatibilidad con getDeviceVolume(), setDeviceVolume(), getDeviceMuted() y setDeviceMuted() (#2089).
  • Utilidades de prueba:
    • Agrega advance(player).untilPositionAtLeast y untilMediaItemIndex a TestPlayerRunHelper para avanzar el reproductor hasta que se alcance una posición especificada. En la mayoría de los casos, estos métodos son más confiables que los métodos untilPosition y untilStartOfMediaItem existentes.
    • Mueve FakeDownloader al módulo test-utils-robolectric para reutilizarlo en otras pruebas.
    • Se quitaron transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) y transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). En su lugar, usa ShadowMediaCodecConfig para configurar codificadores y decodificadores de sombra.
    • Se reemplazó el prefijo "exotest" por "media3" en los nombres de códecs que informa ShadowMediaCodecConfig.
  • Se quitan los símbolos obsoletos:
    • Se quitó el constructor SegmentDownloader obsoleto SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) y los constructores correspondientes en sus subclases DashDownloader, HlsDownloader y SsDownloader.
    • Se quitaron las funciones obsoletas Player.hasNext() y Player.hasNextWindow(). Usa Player.hasNextMediaItem() en su lugar.
    • Se quitó Player.next(), que estaba obsoleto. Se usa Player.seekToNextMediaItem() en su lugar.
    • Se quitó Player.seekToPreviousWindow(), que estaba obsoleto. Se usa Player.seekToPreviousMediaItem() en su lugar.
    • Se quitó Player.seekToNextWindow(), que ya no se usa. Se usa Player.seekToNextMediaItem() en su lugar.
    • Se quitó el objeto BaseAudioProcessor obsoleto del módulo exoplayer. Usa BaseAudioProcessor en el módulo common.
    • Se quitó el constructor MediaCodecVideoRenderer obsoleto MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Versión 1.8.0-rc02

24 de julio de 2025

Usa la versión estable 1.8.0.

Versión 1.8.0-rc01

16 de julio de 2025

Usa la versión estable 1.8.0.

Versión 1.8.0-beta01

2 de julio de 2025

Usa la versión estable 1.8.0.

Versión 1.8.0-alpha01

19 de mayo de 2025

Usa la versión estable 1.8.0.

Versión 1.7.0

Versión 1.7.1

16 de mayo de 2025

Esta versión tiene el mismo código que la 1.6.1 y se lanza para garantizar que aparezca como una versión "más reciente" que la 1.7.0, que era una versión alfa etiquetada accidentalmente como estable (consulta más abajo).

Versión 1.7.0

16 de mayo de 2025

Esta versión debería haber sido 1.7.0-alpha01, pero se etiquetó accidentalmente como 1.7.0 (es decir, estable) en maven.google.com. No la uses. Quédate en la versión 1.6.1 o actualiza a la 1.7.1 (que tiene el mismo código que la 1.6.1).

Versión 1.6.0

1.6.1

14 de abril de 2025

Lanzamiento de androidx.media3:media3-*:1.6.1. La versión 1.6.1 contiene estas confirmaciones.

  • Biblioteca común:
    • Se agregó el método PlaybackParameters.withPitch(float) para copiar fácilmente un PlaybackParameters con un nuevo valor pitch (#2257).
  • ExoPlayer:
    • Se corrigió un problema por el que fallaba la transición de elementos multimedia debido a un error recuperable del renderizador durante la inicialización del siguiente elemento multimedia (#2229).
    • Se corrigió un problema por el que ProgressiveMediaPeriod arrojaba una IllegalStateException cuando PreloadMediaSource intentaba llamar a su getBufferedDurationUs() antes de que estuviera preparado (#2315).
    • Se corrigió el envío de CmcdData en las solicitudes de manifiesto para DASH, HLS y SmoothStreaming (#2253).
    • Asegúrate de que se pueda usar AdPlaybackState.withAdDurationsUs(long[][]) después de que se hayan quitado los grupos de anuncios. El usuario aún debe pasar un array de duraciones para los grupos de anuncios quitados, que puede estar vacío o ser nulo (#2267).
  • Extractores:
    • MP4: Analiza alternate_group del cuadro tkhd y lo expone como una entrada Mp4AlternateGroupData en el Format.metadata de cada pista (#2242).
  • Audio:
    • Se corrigió un problema de descarga en el que la posición podía quedar bloqueada cuando se reproducía una playlist de contenido breve (#1920).
  • Sesión:
    • Se redujo el tiempo de espera de agregación para las devoluciones de llamada de la plataforma MediaSession de 500 a 100 milisegundos y se agregó un método set experimental para permitir que las apps configuren este valor.
    • Se corrigió un problema por el que las notificaciones volvían a aparecer después de que el usuario las descartaba (#2302).
    • Se corrigió un error por el que la sesión mostraba un cronograma de un solo elemento cuando el reproductor unido estaba vacío. Esto sucedía cuando el reproductor unido no tenía COMMAND_GET_TIMELINE disponible, mientras que COMMAND_GET_CURRENT_MEDIA_ITEM sí estaba disponible y el reproductor unido estaba vacío (#2320).
    • Se corrigió un error por el que se ignoraba de forma silenciosa la llamada a MediaSessionService.setMediaNotificationProvider después de otras interacciones con el servicio, como setForegroundServiceTimeoutMs (#2305).
  • IU:
    • Habilita PlayerSurface para que funcione con ExoPlayer.setVideoEffects y CompositionPlayer.
    • Se corrigió un error por el que PlayerSurface no se podía recomponer con un Player nuevo.
  • Extensión HLS:
    • Se corrigió un problema por el que no se establecía la duración del fragmento en CmcdData para el contenido multimedia de HLS, lo que causaba un error de aserción cuando se procesaban segmentos de contenido multimedia encriptados (#2312).
  • Extensión RTSP:
    • Se agregó compatibilidad con el URI con el esquema RTSPT como una forma de configurar la sesión de RTSP para usar TCP (#1484).
  • Extensión Cast:
    • Se agregó compatibilidad con los metadatos de las playlists (#2235).

1.6.0

26 de marzo de 2025

Lanzamiento de androidx.media3:media3-*:1.6.0. La versión 1.6.0 incluye estas confirmaciones.

  • Biblioteca común:
    • Se agregaron AudioManagerCompat y AudioFocusRequestCompat para reemplazar las clases equivalentes en androidx.media.
    • Actualiza Kotlin de la versión 1.9.20 a la 2.0.20 y usa el complemento de Gradle del compilador de Compose. Se actualizó la biblioteca de corrutinas de KotlinX de la versión 1.8.1 a la 1.9.0.
    • Se quitó el método Format.toBundle(boolean excludeMetadata). En su lugar, usa Format.toBundle().
    • Se corrigió un error en SimpleBasePlayer por el que, cuando se establecía un nuevo currentMediaItemIndex en State después de setPlaylist con null MediaMetadata, no se volvían a evaluar los metadatos (#1940).
    • Se cambió el acceso de SimpleBasePlayer.State de protegido a público para facilitar el manejo de las actualizaciones en otras clases (#2128).
  • ExoPlayer:
    • Se agregó MediaExtractorCompat, una clase nueva que proporciona funciones equivalentes a la plataforma MediaExtractor.
    • Se agregó compatibilidad experimental con el precalentamiento de "ExoPlayer" para la reproducción con MediaCodecVideoRenderer. Puedes configurar DefaultRenderersFactory a través de experimentalSetEnableMediaCodecVideoRendererPrewarming para proporcionar un MediaCodecVideoRenderer secundario a ExoPlayer. Si se habilita, ExoPlayer preprocesa el video de los elementos multimedia consecutivos durante la reproducción para reducir la latencia de transición de los elementos multimedia.
    • Reduce los valores predeterminados de bufferForPlaybackMs y bufferForPlaybackAfterRebufferMs en DefaultLoadControl a 1,000 y 2,000 ms, respectivamente.
    • Inicializa DeviceInfo y el volumen del dispositivo de forma asíncrona (si se habilita con setDeviceVolumeControlEnabled). Estos valores no están disponibles de inmediato después de ExoPlayer.Builder.build(), y Player.Listener notifica los cambios a través de onDeviceInfoChanged y onDeviceVolumeChanged.
    • El ID de sesión de audio inicial ya no está disponible de inmediato después de crear el reproductor. Puedes usar AnalyticsListener.onAudioSessionIdChanged para escuchar la actualización inicial si es necesario.
    • Considera el idioma cuando selecciones una pista de video. De forma predeterminada, selecciona una pista de video "principal" que coincida con el idioma de la pista de audio seleccionada, si está disponible. Las preferencias explícitas de idioma de video se pueden expresar con TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Agrega el parámetro selectedAudioLanguage al método DefaultTrackSelector.selectVideoTrack().
    • Agrega el parámetro retryCount a MediaSourceEventListener.onLoadStarted y los métodos MediaSourceEventListener.EventDispatcher correspondientes.
    • Se corrigió un error por el que los elementos de la playlist o los períodos en las transmisiones de DASH de varios períodos con duraciones que no coinciden con el contenido real podían causar que se congelaran los fotogramas al final del elemento (#1698).
    • Mueve BasePreloadManager.Listener a un PreloadManagerListener de nivel superior.
    • Se puede implementar RenderersFactory.createSecondaryRenderer para proporcionar renderizadores secundarios para el calentamiento previo. El precalentamiento permite transiciones más rápidas de los elementos multimedia durante la reproducción.
    • Se habilitó el envío de CmcdData para solicitudes de manifiesto en formatos de transmisión adaptable DASH, HLS y SmoothStreaming (#1951).
    • Se proporciona el MediaCodecInfo del códec que se inicializará en MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Cambia AdsMediaSource para permitir que AdPlaybackStates crezca agregando grupos de anuncios. Se detectan las modificaciones no válidas y se arroja una excepción.
    • Se corrigió un problema por el que se podían mostrar fotogramas adicionales de solo decodificación en una sucesión rápida cuando se realizaba la transición al contenido multimedia después de un anuncio durante el video.
    • Haz que DefaultRenderersFactory agregue dos instancias de MetadataRenderer para permitir que las apps reciban dos esquemas diferentes de metadatos de forma predeterminada.
    • Se volvió a evaluar si se debe cancelar la carga en curso de un fragmento cuando se pausa la reproducción (#1785).
    • Se agregó la opción a ClippingMediaSource para permitir el recorte en contenido multimedia que no se puede buscar.
    • Se corrigió el error por el que la búsqueda con precalentamiento podía bloquear la transición del siguiente elemento multimedia.
    • Se corrigió un error por el que ExoPlayer.isLoading() permanecía en true mientras se realizaba la transición a STATE_IDLE o STATE_ENDED (#2133).
    • Se agregó lastRebufferRealtimeMs a LoadControl.Parameter (#2113).
  • Transformador:
    • Agrega compatibilidad para la transmultiplexación en formatos alternativos retrocompatibles.
    • Se agregó compatibilidad con la transcodificación y la transmultiplexación del formato Dolby Vision (perfil 8).
    • Actualiza los parámetros de VideoFrameProcessor.registerInputStream y VideoFrameProcessor.Listener.onInputStreamRegistered para usar Format.
    • Genera metadatos estáticos de HDR cuando uses DefaultEncoderFactory.
    • Habilita la compatibilidad con el diagnóstico de la plataforma de Android a través de MediaMetricsManager. Transformer reenvía eventos de edición y datos de rendimiento a la plataforma, lo que ayuda a proporcionar información de rendimiento y depuración del sistema en el dispositivo. Google también puede recopilar estos datos si el usuario del dispositivo habilita compartir los datos de uso y diagnóstico. Las apps pueden inhabilitar la opción de contribuir al diagnóstico de la plataforma para Transformer con Transformer.Builder.setUsePlatformDiagnostics(false).
    • Divide InAppMuxer en InAppMp4Muxer y InAppFragmentedMp4Muxer. Usa InAppMp4Muxer para producir un archivo MP4 no fragmentado, mientras que InAppFragmentedMp4Muxer se usa para producir un archivo MP4 fragmentado.
    • Mueve la interfaz Muxer de media3-muxer a media3-transformer.
    • Se agregó MediaProjectionAssetLoader, que proporciona contenido multimedia de un MediaProjection para la grabación de pantalla, y se agregó compatibilidad con la grabación de pantalla a la app de demo de Transformer.
    • Agrega #getInputFormat() a la interfaz de Codec.
    • Se cambia la responsabilidad de liberar el GlObjectsProvider al emisor en DefaultVideoFrameProcessor y DefaultVideoCompositor cuando sea posible.
  • Extractores:
    • AVI: Se corrigió el manejo de archivos con audio comprimido de tasa de bits constante en el que el encabezado de la transmisión almacena la cantidad de bytes en lugar de la cantidad de fragmentos.
    • Se corrigió el manejo de unidades NAL con longitudes expresadas en 1 o 2 bytes (en lugar de 4).
    • Se corrigió el error ArrayIndexOutOfBoundsException en las listas de edición de MP4 cuando la lista de edición comienza en un fotograma que no es de sincronización y no tiene un fotograma de sincronización anterior (#2062).
    • Se solucionó un problema por el que las transmisiones de TS podían atascarse en algunos dispositivos (#2069).
    • FLAC: Se agregó compatibilidad con archivos FLAC de 32 bits. Anteriormente, no se podían reproducir con IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Audio:
    • Se corrigió onAudioPositionAdvancing para que se llame cuando se reanude la reproducción (antes se llamaba cuando se pausaba la reproducción).
    • No omitas SonicAudioProcessor cuando SpeedChangingAudioProcessor esté configurado con parámetros predeterminados.
    • Se corrigió el subdesbordamiento en Sonic#getOutputSize() que podía causar que DefaultAudioSink se detuviera.
    • Corrige MediaCodecAudioRenderer.getDurationToProgressUs() y DecoderAudioRenderer.getDurationToProgressUs() para que las búsquedas restablezcan correctamente las duraciones proporcionadas.
    • Establecer androidx.media3.common.audio.SonicAudioProcessor como definitivo.
    • Se agregó compatibilidad con PCM de punto flotante a ChannelMappingAudioProcessor y TrimmingAudioProcessor.
  • Video:
    • Se cambió MediaCodecVideoRenderer.shouldUsePlaceholderSurface a protegido para que las aplicaciones puedan anular el bloqueo del uso de las plataformas de marcador de posición (#1905).
    • Se agregó el análisis experimental de dependencias de muestras de AV1 de ExoPlayer para acelerar la búsqueda. Habilítala con la nueva API de DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Se agregó la API experimental de ExoPlayer para descartar los búferes de entrada del decodificador de MediaCodecVideoRenderer tardíos de los que no se depende. Habilítala con DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Se corrigió un problema por el que un reproductor sin una plataforma estaba listo de inmediato y decodificaba muy lentamente los fotogramas pendientes (#1973).
    • Se excluyeron los dispositivos Xiaomi y OPPO del modo de superficie desconectada para evitar el parpadeo de la pantalla (#2059).
  • Texto:
    • Se agregó compatibilidad con los subtítulos de VobSub (#8260).
    • Se detuvo la carga inmediata de todos los archivos de subtítulos configurados con MediaItem.Builder.setSubtitleConfigurations y, en su lugar, solo se carga uno si se selecciona mediante la selección de pistas (#1721).
    • TTML: Se agregó compatibilidad para hacer referencia a tts:origin y tts:extent con style (#2953).
    • Restringe las marcas de tiempo de WebVTT y SubRip a exactamente 3 decimales. Anteriormente, analizábamos de forma incorrecta cualquier cantidad de decimales, pero siempre suponíamos que el valor estaba en milisegundos, lo que generaba marcas de tiempo incorrectas (#1997).
    • Se corrigió un problema por el que se detenía la reproducción cuando una playlist contenía elementos recortados con subtítulos CEA-608 o CEA-708.
    • Se corrigió IllegalStateException cuando un archivo SSA contiene un indicador con duración cero (hora de inicio y finalización iguales) (#2052).
    • Se suprimen (y registran) los errores de análisis de subtítulos cuando estos se multiplexan en el mismo contenedor que el audio y el video (#2052).
    • Se corrigió el manejo de caracteres UTF-8 de varios bytes en archivos WebVTT con finales de línea CR (#2167).
  • DRM:
    • Se corrigió el error MediaCodec$CryptoException: Operation not supported in this configuration que se producía cuando se reproducía contenido de ClearKey en dispositivos con nivel de API inferior a 27 (#1732).
  • Efecto:
    • Se movió la funcionalidad de OverlaySettings a StaticOverlaySettings. Se puede crear una subclase de OverlaySettings para permitir la configuración dinámica de la superposición.
  • Multiplexores:
    • Se movió MuxerException fuera de la interfaz Muxer para evitar un nombre completamente calificado muy largo.
    • Se cambió el nombre del método setSampleCopyEnabled() por setSampleCopyingEnabled() tanto en Mp4Muxer.Builder como en FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() y FragmentedMp4Muxer.addTrack() ahora devuelven un ID de seguimiento int en lugar de un TrackToken.
    • Mp4Muxer y FragmentedMp4Muxer ya no implementan la interfaz Muxer.
    • Inhabilitar el procesamiento por lotes y la copia de muestras de Mp4Muxer de forma predeterminada
    • Se corrigió un error en FragmentedMp4Muxer que creaba muchos fragmentos cuando solo se escribía la pista de audio.
  • Sesión:
    • Mantener el estado del servicio en primer plano durante 10 minutos adicionales cuando la reproducción se pausa, se detiene o falla Esto permite que los usuarios reanuden la reproducción dentro de este tiempo de espera sin arriesgarse a que se apliquen restricciones del servicio en primer plano en varios dispositivos. Ten en cuenta que ya no se puede usar solo la llamada a player.pause() para detener el servicio en primer plano antes de stopSelf() cuando se anula onTaskRemoved. En su lugar, usa MediaSessionService.pauseAllPlayersAndStopSelf().
    • Mantén la notificación visible cuando la reproducción entre en un estado de error o se detenga. La notificación solo se quita si se borra la playlist o se libera el reproductor.
    • Se mejoró el manejo de las acciones ACTION_PLAY y ACTION_PAUSE de MediaSession de la plataforma de Android para establecer solo una de ellas según los comandos disponibles y también aceptar si solo se establece una de ellas.
    • Se agregó Context como parámetro a MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Se corrigió un error por el que llamar a un método Player en un MediaController conectado a una sesión heredada descartaba los cambios de una actualización pendiente.
    • Se hizo que MediaSession.setSessionActivity(PendingIntent) acepte valores nulos (#2109).
    • Se corrigió un error por el que una notificación inactiva permanecía visible cuando se borraba la playlist (#2211).
  • IU:
    • Agrega contenedores de estado y elementos de componibilidad al módulo media3-ui-compose para PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState y PlaybackSpeedState.
  • Descargas:
    • Se corrigió un error en CacheWriter que dejaba abiertas las fuentes de datos y bloqueadas las áreas de caché en caso de que la fuente de datos arrojara una Exception que no fuera IOException (#9760).
  • Extensión HLS:
    • Agrega una primera versión de HlsInterstitialsAdsLoader. El cargador de anuncios lee los anuncios intersticiales de HLS de una playlist de contenido multimedia de HLS y los asigna al AdPlaybackState que se pasa al AdsMediaSource. Esta versión inicial solo admite transmisiones de VOD de HLS con atributos X-ASSET-URI.
    • Agrega HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Las apps pueden usarlo para crear instancias de AdsMediaSource que usen un HlsInterstitialsAdsLoader de forma conveniente y segura.
    • Se analiza la etiqueta SUPPLEMENTAL-CODECS de la playlist de HLS para detectar formatos de Dolby Vision (#1785).
    • Se flexibilizó la condición para buscar posiciones de sincronización en una transmisión HLS (#2209).
  • Extensión DASH:
    • Se agregó compatibilidad con el formato AC-4 de nivel 4 para DASH (#1898).
    • Se corrigió un problema que se producía cuando se calculaba el intervalo de actualización para la inserción de anuncios en transmisiones en vivo de varios períodos (#1698).
    • Se analiza el atributo scte214:supplementalCodecs del manifiesto de DASH para detectar formatos de Dolby Vision (#1785).
    • Se mejoró el manejo de las transiciones de períodos en las transmisiones en vivo en las que el período contiene muestras de contenido multimedia que superan la duración declarada del período (#1698).
    • Se corrigió un problema por el que se combinaban los conjuntos de adaptación marcados con adaptation-set-switching, pero con diferentes idiomas o marcas de rol (#2222).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Se agregó el módulo decodificador de MPEG-H, que usa el decodificador de MPEG-H integrado para decodificar audio MPEG-H (#1826).
  • Extensión MIDI:
    • Conecta instancias personalizadas de AudioSink y AudioRendererEventListener a MidiRenderer.
  • Extensión Cast:
    • Se aumentó la dependencia de play-services-cast-framework a 21.5.0 para corregir una falla de FLAG_MUTABLE en apps orientadas al nivel de API 34 o versiones posteriores en dispositivos con los Servicios de Google Play instalados, pero inhabilitados (#2178).
  • App de demo:
    • Se extendió demo-compose con botones adicionales y se mejoró la integración de PlayerSurface con compatibilidad para el escalamiento y el obturador.
  • Se quitan los símbolos obsoletos:
    • Se quitó el método AudioMixer.create() obsoleto. Se usa DefaultAudioMixer.Factory().create() en su lugar.
    • Se quitaron los siguientes métodos Transformer.Builder obsoletos:
      • setTransformationRequest(), usa setAudioMimeType(), setVideoMimeType() y setHdrMode() en su lugar.
      • setAudioProcessors(), configura el procesador de audio en un EditedMediaItem.Builder.setEffects() y, en su lugar, pásalo a Transformer.start().
      • setVideoEffects(), establece el efecto de video en un EditedMediaItem.Builder.setEffects() y, en su lugar, pásalo a Transformer.start().
      • setRemoveAudio(), usa EditedMediaItem.Builder.setRemoveAudio() para quitar el audio del EditedMediaItem que se pasa a Transformer.start().
      • setRemoveVideo(), usa EditedMediaItem.Builder.setRemoveVideo() para quitar el video de la EditedMediaItem que se pasa a Transformer.start().
      • setFlattenForSlowMotion(), usa EditedMediaItem.Builder.setFlattenForSlowMotion() para compactar el EditedMediaItem que se pasa a Transformer.start().
      • setListener(), usa addListener(), removeListener() o removeAllListeners() en su lugar.
    • Se quitaron los siguientes métodos Transformer.Listener obsoletos:
      • onTransformationCompleted(MediaItem), usa onCompleted(Composition, ExportResult) en su lugar.
      • onTransformationCompleted(MediaItem, TransformationResult), usa onCompleted(Composition, ExportResult) en su lugar.
      • onTransformationError(MediaItem, Exception), usa onError(Composition, ExportResult, ExportException) en su lugar.
      • onTransformationError(MediaItem, TransformationException), usa onError(Composition, ExportResult, ExportException) en su lugar.
      • onTransformationError(MediaItem, TransformationResult, TransformationException), usa onError(Composition, ExportResult, ExportException) en su lugar.
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), usa onFallbackApplied(Composition, TransformationRequest, TransformationRequest) en su lugar.
    • Se quitó la clase obsoleta TransformationResult. Se usa ExportResult en su lugar.
    • Se quitó la clase obsoleta TransformationException. Se usa ExportException en su lugar.
    • Se quitó Transformer.PROGRESS_STATE_NO_TRANSFORMATION, que estaba obsoleto. Se usa Transformer.PROGRESS_STATE_NOT_STARTED en su lugar.
    • Se quitó Transformer.setListener(), que estaba obsoleto. En su lugar, usa Transformer.addListener(), Transformer.removeListener() o Transformer.removeAllListeners().
    • Se quitó Transformer.startTransformation(), que estaba obsoleto. Se usa Transformer.start(MediaItem, String) en su lugar.
    • Se quitó SingleFrameGlShaderProgram, que estaba obsoleto. Se usa BaseGlShaderProgram en su lugar.
    • Se quita Transformer.flattenForSlowMotion. Se usa EditedMediaItem.flattenForSlowMotion en su lugar.
    • Se quitaron ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent y ExoPlayer.DeviceComponent.
    • Se quitó androidx.media3.exoplayer.audio.SonicAudioProcessor.
    • Se quitaron los siguientes métodos obsoletos de DownloadHelper:
      • Se usa el constructor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList) en su lugar.
      • getRendererCapabilities(RenderersFactory), se puede lograr una funcionalidad equivalente creando un DefaultRendererCapabilitiesList con un RenderersFactory y llamando a DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Se quitó el método PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). En su lugar, usa PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) y pasa (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19 de marzo de 2025

Usa la versión estable 1.6.0.

1.6.0-rc01

12 de marzo de 2025

Usa la versión estable 1.6.0.

1.6.0-beta01

26 de febrero de 2025

Usa la versión estable 1.6.0.

Versión 1.6.0-alpha03

6 de febrero de 2025

Usa la versión estable 1.6.0.

Versión 1.6.0-alpha02

30 de enero de 2025

Usa la versión estable 1.6.0.

Versión 1.6.0-alpha01

20 de diciembre de 2024

Usa la versión estable 1.6.0.

Versión 1.5

Versión 1.5.1

December 19, 2024

Lanzamiento de androidx.media3:media3-*:1.5.1. La versión 1.5.1 incluye estas confirmaciones.

  • ExoPlayer:
    • Se inhabilitó el uso de la desencriptación asíncrona en MediaCodec para evitar problemas de tiempo de espera de códec informados con esta API de la plataforma (#1641).
  • Extractores:
    • MP3: No detengas la reproducción antes de tiempo cuando el índice de un fotograma VBRI no cubra todos los datos de MP3 de un archivo (#1904).
  • Video:
    • Se revirtió el uso de los valores de relación de aspecto de píxeles proporcionados por MediaCodecAdapter cuando se proporcionan durante el procesamiento de onOutputFormatChanged (#1371).
  • Texto:
    • Se corrigió un error en ReplacingCuesResolver.discardCuesBeforeTimeUs por el que se descartaba incorrectamente el indicador activo en timeUs (que se inició antes, pero aún no finalizó; #1939).
  • Metadatos:
    • Se extraen la numeración de discos y pistas, y el género de los comentarios de Vorbis en MediaMetadata (#1958).

Versión 1.5.0

27 de noviembre de 2024

Lanzamiento de androidx.media3:media3-*:1.5.0. La versión 1.5.0 incluye estas confirmaciones.

  • Biblioteca común:
    • Se agregó ForwardingSimpleBasePlayer, que permite reenviar a otro reproductor con pequeños ajustes, a la vez que se garantiza la coherencia total y el manejo de objetos de escucha (#1183).
    • Reemplaza SimpleBasePlayer.State.playlist por el método getPlaylist().
    • Se agregó una anulación para SimpleBasePlayer.State.Builder.setPlaylist() para especificar directamente un Timeline y los valores actuales de Tracks y Metadata en lugar de compilar una estructura de playlist.
    • Aumenta minSdk a 21 (Android Lollipop). Esto se alinea con todas las demás bibliotecas de AndroidX.
    • Se agregó el artefacto androidx.media3:media3-common-ktx, que proporciona funciones específicas de Kotlin compiladas sobre la biblioteca Common.
    • Agrega la función de extensión de suspensión Player.listen para iniciar una corrutina que escuche Player.Events a la biblioteca media3-common-ktx.
    • Se quitaron las anotaciones @DoNotInline de las clases internas que se excluyeron de forma manual para evitar fallas de verificación de clases en el entorno de ejecución. Las versiones recientes de R8 ahora realizan automáticamente llamadas fuera de línea como estas para evitar las fallas del entorno de ejecución (por lo que ya no se requiere la desalineación manual). Todos los usuarios de Gradle de la biblioteca ya deben estar usando una versión del complemento de Android para Gradle que use una versión de R8 que haga esto, debido a compileSdk = 35. Los usuarios de la biblioteca con sistemas de compilación que no sean de Gradle deberán asegurarse de que su paso de reducción/ofuscación equivalente a R8 realice un proceso de out-of-lining automático similar para evitar fallas en la verificación de clases en el entorno de ejecución. Este cambio ya se realizó en otras bibliotecas de AndroidX.
  • ExoPlayer:
    • Ahora se puede llamar a MediaCodecRenderer.onProcessedStreamChange() para cada elemento multimedia. Anteriormente, no se llamaba para el primero. Usa MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() para habilitar esta opción.
    • Se agregó PreloadMediaSource.PreloadControl.onPreloadError para permitir que las implementaciones de PreloadMediaSource.PreloadControl realicen acciones cuando se produce un error.
    • Agrega BasePreloadManager.Listener para propagar eventos de precarga a las apps.
    • Se permite cambiar el tiempo de espera del cliente de SNTP y reintentar las direcciones alternativas en el tiempo de espera (#1540).
    • Quita MediaCodecAdapter.Configuration.flags, ya que el campo siempre era cero.
    • Permitir que el usuario seleccione la bocina integrada para la reproducción en Wear OS con la API 35 y versiones posteriores (cuando el dispositivo indique que es compatible con esta función)
    • Difiere la llamada de bloqueo a Context.getSystemService(Context.AUDIO_SERVICE) hasta que se habilite el manejo del foco de audio. Esto garantiza que no se realice la llamada de bloqueo si no está habilitado el manejo del foco de audio (#1616).
    • Se permite la reproducción, independientemente de la duración almacenada en búfer, cuando falla la carga (#1571).
    • Agrega AnalyticsListener.onRendererReadyChanged() para indicar cuándo los renderizadores individuales permiten que la reproducción esté lista.
    • Se corrigió el error MediaCodec.CryptoException que, a veces, se informaba como un "error de tiempo de ejecución inesperado" cuando MediaCodec se opera en modo asíncrono (comportamiento predeterminado en la API 31 y versiones posteriores).
    • Pasa bufferedDurationUs en lugar de bufferedPositionUs con PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). También cambia DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS a DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, por lo que las apps deben pasar un valor que represente una duración específica desde la posición de inicio predeterminada para la que se debe precargar la fuente de medios correspondiente con este IntDef, en lugar de una posición.
    • Se agregó la implementación de ForwardingRenderer que reenvía todas las llamadas de método a otro renderizador (1703).
    • Agrega la carga previa de la playlist para el siguiente elemento de la playlist. Las apps pueden habilitar la carga previa llamando a ExoPlayer.setPreloadConfiguration(PreloadConfiguration) según corresponda. De forma predeterminada, la precarga está inhabilitada. Cuando se habilita y para no interferir con la reproducción, DefaultLoadControl restringe la carga previa para que se inicie y continúe solo cuando el reproductor no se esté cargando para la reproducción. Las apps pueden cambiar este comportamiento implementando LoadControl.shouldContinuePreloading() según corresponda (como cuando se anula este método en DefaultLoadControl). La implementación predeterminada de LoadControl inhabilita la carga previa en caso de que una app use una implementación personalizada de LoadControl.
    • Se agregó el método MediaSourceEventListener.EventDispatcher.dispatchEvent() para permitir la invocación de eventos de objetos de escucha de subclases (1736).
    • Agrega DefaultPreloadManager.Builder que compile las instancias de DefaultPreloadManager y ExoPlayer con parámetros de configuración compartidos de forma coherente.
    • Se quitó el parámetro Renderer[] de LoadControl.onTracksSelected(), ya que la implementación de DefaultLoadControl puede recuperar los tipos de transmisión de ExoTrackSelection[].
    • Se marcó DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) como obsoleto y el método como final para evitar anulaciones. En su lugar, se debe usar el nuevo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Informa eventos de MediaSourceEventListener de fuentes secundarias en MergingMediaSource. Esto hará que se informen los eventos de inicio, error, cancelación y finalización de la carga de los subtítulos transferidos de forma alternativa (los que se agregaron con MediaItem.LocalConfiguration.subtitleConfigurations), que pueden aparecer como eventos de carga duplicados emitidos desde AnalyticsListener.
    • Evita que los errores de subtítulos y metadatos detengan por completo la reproducción. En su lugar, se inhabilita la pista problemática y continúa la reproducción de las pistas restantes (#1722).
      • En el nuevo manejo de subtítulos (durante la extracción), los errores de análisis asociados (p.ej., datos de subtítulos no válidos) y de carga (p.ej., HTTP 404) se emiten a través de devoluciones de llamada de onLoadError.
      • En el manejo de subtítulos heredado (durante la renderización), solo se emiten los errores de carga asociados a través de devoluciones de llamada de onLoadError, mientras que los errores de análisis se ignoran de forma silenciosa (este es un comportamiento preexistente).
    • Se corrigió un error por el que los elementos de la playlist o los períodos en las transmisiones de DASH de varios períodos con duraciones que no coinciden con el contenido real podían causar que se congelaran los fotogramas al final del elemento (#1698).
    • Se agregó un método set a SntpClient para establecer el tiempo máximo transcurrido desde la última actualización después de la cual se vuelve a inicializar el cliente (#1794).
  • Transformador:
    • Agrega SurfaceAssetLoader, que admite la puesta en cola de datos de video en Transformer a través de un Surface.
    • ImageAssetLoader informa que la entrada no es compatible a través de AssetLoader.onError en lugar de arrojar una IllegalStateException.
    • Establece la duración de la imagen con MediaItem.Builder.setImageDurationMs como obligatorio para la exportación de imágenes.
    • Se agregó compatibilidad con la exportación de espacios en secuencias de EditedMediaItems de audio.
  • Selección de pistas:
    • DefaultTrackSelector: Prefiere el audio basado en objetos en lugar del audio basado en canales cuando otros factores sean iguales.
  • Extractores:
    • Permite que Mp4Extractor y FragmentedMp4Extractor identifiquen muestras de H264 que no se usan como referencia en muestras posteriores.
    • Se agregó una opción para habilitar la búsqueda basada en índices en AmrExtractor.
    • Trata los archivos MP3 con más de 128 kB entre fotogramas válidos como truncados (en lugar de no válidos). Esto significa que los archivos con datos que no son MP3 al final, sin otros metadatos que indiquen la longitud de los bytes de MP3, ahora detienen la reproducción al final de los datos de MP3 en lugar de fallar con ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Se corrigió el control de muestras de anuncios previos al video para las posiciones de inicio de contenido multimedia que no son fotogramas clave cuando se procesan listas de edición en archivos MP4 (#1659).
    • Se mejoró el cálculo de la velocidad de fotogramas con la duración del contenido multimedia del cuadro mdhd en Mp4Extractor y FragmentedMp4Extractor (#1531).
    • Se corrigió el escalamiento incorrecto de media_time en las listas de edición de MP4. Si bien segment_duration ya se escalaba correctamente con la escala de tiempo de la película, ahora media_time se escala de forma adecuada con la escala de tiempo de la pista, como lo especifica el estándar de formato MP4 (#1792).
    • Se controlan los fotogramas desordenados en el cálculo de endIndices para MP4 con lista de edición (#1797).
    • Se corrigió el análisis de la duración de los medios en el cuadro mdhd de los archivos MP4 para controlar los valores de -1 (#1819).
    • Se agregó compatibilidad para identificar el cuadro h263 en archivos MP4 para video H.263 (#1821).
    • Se agregó compatibilidad con el formato de archivo multimedia base ISO AC-4 de nivel 4 (#1265).
  • DataSource:
    • Se actualizó HttpEngineDataSource para permitir el uso a partir de la versión S de la extensión 7 en lugar del nivel de API 34 (#1262).
    • DataSourceContractTest: Confirma que DataSource.getUri() devuelva el URI resuelto (como se documenta). Cuando esto difiera del URI solicitado, las pruebas pueden indicarlo con el nuevo método DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: Confirma que DataSource.getUri() y getResponseHeaders() devuelven su valor "open" después de una llamada fallida a open() (debido a un recurso "not found") y antes de una llamada close() posterior.
      • Anular DataSourceContractTest.getNotFoundResources() permite que las subclases de prueba proporcionen varios recursos "no encontrados" y también los encabezados esperados. Esto permite distinguir entre HTTP 404 (con encabezados) y "servidor no encontrado" (sin encabezados).
  • Audio:
    • Configura automáticamente los metadatos de volumen de CTA-2075 en el códec si están presentes en el contenido multimedia.
    • Garantiza una disminución gradual del volumen cuando se busca.
    • Se corrigieron los sonidos de estallido que podían producirse durante las búsquedas.
    • Se corrigió la acumulación de errores de truncamiento para el algoritmo de estiramiento de tiempo y cambio de tono de Sonic.
    • Se corrigió un error en SpeedChangingAudioProcessor que provocaba que se descartaran los fotogramas de salida.
  • Video:
    • MediaCodecVideoRenderer evita decodificar muestras que no se renderizan ni se usan como referencia para otras muestras.
    • En el nivel de API 35 y versiones posteriores, MediaCodecAdapter ahora puede recibir un null Surface en configure y llamadas a un nuevo método detachOutputSurface para quitar un Surface establecido anteriormente si el códec lo admite (MediaCodecInfo.detachedSurfaceSupported).
    • Se usan los valores de relación de aspecto de píxeles proporcionados por MediaCodecAdapter si se proporcionan cuando se procesa onOutputFormatChanged (#1371).
    • Se agregó una solución alternativa para un problema del dispositivo Galaxy Tab S7 FE que hace que las transmisiones H264 seguras de 60 fps se marquen como no compatibles (#1619).
    • Se agregó una solución alternativa para los códecs que se detienen después de la última muestra sin devolver una señal de fin de transmisión.
  • Texto:
    • Se agregó un VoiceSpan personalizado y se completó para los intervalos de voz de WebVTT (#1632).
    • Se garantiza que se muestren los WebVTT en HLS con marcas de tiempo de subtítulos muy grandes (que desbordan un long de 64 bits cuando se representan como microsegundos y se multiplican por la base de tiempo MPEG 90,000) (#1763).
    • Se agregó compatibilidad con subtítulos CEA-608 en contenido de Dolby Vision (#1820).
    • Se corrigió el problema por el que la reproducción se detenía en las transmisiones de varios períodos de DASH cuando se habilitaban los subtítulos CEA-608 (#1863).
  • Metadatos:
    • Asigna el tipo C.TRACK_TYPE_METADATA a las pistas que contengan contenido icy o vnd.dvb.ait.
  • Imagen:
    • Agrega ExternallyLoadedImageDecoder para simplificar la integración con bibliotecas externas de carga de imágenes, como Glide o Coil.
  • DataSource:
    • Se agregó FileDescriptorDataSource, un nuevo DataSource que se puede usar para leer desde un FileDescriptor (#3757).
  • Efecto:
    • Se agregó una solución alternativa de DefaultVideoFrameProcessor para el escalamiento menor de SurfaceTexture. SurfaceTexture puede incluir un pequeño escalamiento que corte un borde de 1 texel alrededor del borde de un búfer recortado. Ahora, esto se controla de modo que el resultado se acerque más al esperado.
    • Acelera DefaultVideoFrameProcessor.queueInputBitmap(). Como resultado, la exportación de imágenes a videos con Transformer es más rápida.
  • Extensión IMA:
    • Se corrigió un error por el que borrar la playlist podía causar una ArrayIndexOutOfBoundsException en ImaServerSideAdInsertionMediaSource.
    • Se corrigió un error por el que las transmisiones de DAI insertadas del servidor sin un anuncio previo al video podían generar un ArrayIndexOutOfBoundsException cuando se reproducían después del último anuncio durante el video (#1741).
  • Sesión:
    • Se agregó MediaButtonReceiver.shouldStartForegroundService(Intent) para permitir que las apps anulen este método y supriman un comando de reproducción entrante para reanudar la reproducción. De forma predeterminada, el servicio siempre se inicia y la reproducción no se puede suprimir sin que el sistema falle con un ForegroundServiceDidNotStartInTimeException (#1528).
    • Se corrigió un error que causaba que los comandos personalizados enviados desde un MediaBrowser se enviaran al MediaSessionCompat.Callback en lugar de a la variante MediaBrowserServiceCompat del método cuando se conectaba a un servicio heredado. Esto impidió que MediaBrowser recibiera el valor de retorno real que envió el servicio heredado (#1474).
    • Se controla la excepción IllegalArgumentException que arrojan los dispositivos de ciertos fabricantes cuando se configura el receptor de transmisiones para intents de botones multimedia (#1730).
    • Agrega botones de comando para los elementos multimedia. Esto agrega la API de Media3 para lo que se conocía como Custom browse actions con la biblioteca heredada con MediaBrowserCompat. Ten en cuenta que, con Media3, los botones de comando para los elementos multimedia están disponibles para MediaBrowser y MediaController. Consulta Cómo implementar acciones de navegación personalizadas. * Se corrigió un error por el que, a veces, un controlador de Media3 no podía permitir que una app de sesión iniciara un servicio en primer plano después de solicitar play().
    • Restringe CommandButton.Builder.setIconUri para que solo acepte URIs de contenido.
    • Se pasan las sugerencias de conexión de un navegador de Media3 al MediaBrowserCompat inicial cuando se conecta a un MediaBrowserCompat heredado. El servicio puede recibir las sugerencias de conexión que se pasan como sugerencias raíz con la primera llamada a onGetRoot().
    • Se corrigió un error por el que un MediaBrowser conectado a un servicio de navegador heredado no recibía un error enviado por el servicio después de que el navegador se suscribiera a un parentid.
    • Se mejoró el comportamiento de interoperabilidad para que un navegador de Media3 que está conectado a un MediaBrowserService heredado no solicite los elementos secundarios de un parentId dos veces cuando se suscribe a un elemento superior.
  • IU:
    • Se habilitó la solución alternativa para el video estirado o recortado en PlayerView-in-Compose-AndroidView debido a problemas con las transiciones compartidas basadas en XML. Las apps que usan PlayerView dentro de AndroidView deben llamar a PlayerView.setEnableComposeSurfaceSyncWorkaround para habilitar la función (#1237, #1594).
    • Se agregó setFullscreenButtonState a PlayerView para permitir actualizaciones del ícono del botón de pantalla completa a pedido, es decir, fuera de banda y no de forma reactiva a una interacción de clic (#1590, #184).
    • Se corrigió un error por el que la opción "Ninguno" en la selección de texto no funcionaba si había preferencias de selección de pistas de texto definidas por la app.
  • Extensión DASH:
    • Se agregó compatibilidad con períodos que comienzan en medio de un segmento (#1440).
  • Extensión de Smooth Streaming:
    • Se corrigió un error de Bad magic number for Bundle que se producía cuando se reproducían transmisiones de SmoothStreaming con pistas de texto (#1779).
  • Extensión RTSP:
    • Se corrigió la eliminación de la información del usuario para las URLs que contienen caracteres @ codificados (#1138).
    • Se corrigieron las fallas que se producían cuando se analizaban paquetes RTP con extensiones de encabezado (#1225).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etc.):
    • Se agregó el módulo decodificador de IAMF, que proporciona compatibilidad con la reproducción de archivos MP4 que contienen pistas de IAMF con la biblioteca nativa libiamf para sintetizar audio.
      • La reproducción está habilitada con un diseño estéreo y 5.1 con espacialización, junto con el seguimiento de cabeza opcional habilitado, pero la compatibilidad con la reproducción binaural no está disponible en este momento.
    • Se agregó compatibilidad con páginas de 16 KB para extensiones de decodificador en Android 15 (#1685).
  • Extensión Cast:
    • Detén la limpieza del cronograma después de que se desconecte la CastSession, lo que permite que la app emisora reanude la reproducción de forma local después de una desconexión.
    • Propaga el DeviceInfo de CastPlayer cuando se proporciona un Context. Esto permite vincular MediaSession a RoutingSession, lo que es necesario para integrar el selector de salida (#1056).
  • Utilidades de prueba:
    • DataSourceContractTest ahora incluye pruebas para verificar lo siguiente:
      • Se actualizó el flujo de entrada read position.
      • El búfer de salida offset se aplica correctamente.
  • App de demo
    • Se resolvieron las fugas de memoria en la app de demostración de formato corto (#1839).
  • Se quitan los símbolos obsoletos:
    • Se quitaron las funciones obsoletas Player.hasPrevious y Player.hasPreviousWindow(). Utiliza Player.hasPreviousMediaItem() en lugar de esta función.
    • Se quitó el método Player.previous() obsoleto. Se usa Player.seekToPreviousMediaItem() en su lugar.
    • Se quitó el método DrmSessionEventListener.onDrmSessionAcquired obsoleto.
    • Se quitaron los constructores DefaultEncoderFactory obsoletos. Se usa DefaultEncoderFactory.Builder en su lugar.

Versión 1.5.0-rc02

19 de noviembre de 2024

Usa la versión estable 1.5.0.

Versión 1.5.0-rc01

13 de noviembre de 2024

Usa la versión estable 1.5.0.

Versión 1.5.0-beta01

30 de octubre de 2024

Usa la versión estable 1.5.0.

Versión 1.5.0-alpha01

10 de septiembre de 2024

Usa la versión estable 1.5.0.

Versión 1.4.0

Versión 1.4.1

27 de agosto de 2024

Lanzamiento de androidx.media3:media3-*:1.4.1. La versión 1.4.1 contiene estas confirmaciones.

  • ExoPlayer:
    • Controla las devoluciones de llamada de carga previa de forma asíncrona en PreloadMediaSource (#1568).
    • Se permite la reproducción, independientemente de la duración almacenada en búfer, cuando falla la carga (#1571).
  • Extractores:
    • MP3: Se corrigió el error Searched too many bytes ignorando correctamente los datos finales que no son MP3 según el campo de longitud en un marco Info (#1480).
  • Texto:
    • TTML: Se corrigió el manejo de los valores de porcentaje de tts:fontSize para garantizar que se hereden correctamente de los nodos superiores con valores de porcentaje de tts:fontSize.
    • Se corrigió el error IndexOutOfBoundsException en LegacySubtitleUtil que se producía debido a que se controlaba de forma incorrecta el caso en el que la hora de inicio de salida solicitada era mayor o igual que la hora del evento final en Subtitle (#1516).
  • DRM:
    • Se corrigió el error android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE en dispositivos con nivel de API 31 y versiones posteriores que reproducen contenido de Widevine L1. Este error se debe a una implementación incompleta del método MediaDrm.requiresSecureDecoder del framework (#1603).
  • Efecto:
    • Agrega un método release() a GlObjectsProvider.
  • Sesión:
    • Se transformó una presión doble de KEYCODE_HEADSETHOOK en una acción de "buscar siguiente", como se documenta (#1493).
    • Controla KEYCODE_HEADSETHOOK como un comando de "reproducción" en MediaButtonReceiver cuando decidas si lo ignorarás para evitar un ForegroundServiceDidNotStartInTimeException (#1581).
  • Extensión RTSP:
    • Se omiten las descripciones de contenido multimedia no válidas en el análisis de SDP (#1087).

Versión 1.4.0

25 de julio de 2024

Lanzamiento de androidx.media3:media3-*:1.4.0. La versión 1.4.0 incluye estas confirmaciones.

  • Biblioteca común:
    • Se reenvían las llamadas de búsqueda que se presumen no-op a los métodos protegidos BasePlayer.seekTo() y SimpleBasePlayer.handleSeek() en lugar de ignorarlas. Si implementas estos métodos en un reproductor personalizado, es posible que debas controlar estas llamadas adicionales con mediaItemIndex == C.INDEX_UNSET.
    • Se quitó la dependencia de compilación de la expansión de sintaxis mejorada de Java 8 (#1312).
    • Asegúrate de que se ignore la duración que se pasa a MediaItem.Builder.setImageDurationMs() para un MediaItem que no sea una imagen (como se documenta).
    • Agrega Format.customData para almacenar información personalizada proporcionada por la app sobre las instancias de Format.
  • ExoPlayer:
    • Se agregó BasePreloadManager, que coordina la carga previa de varias fuentes según las prioridades definidas por sus rankingData. La personalización es posible extendiendo esta clase. Agrega DefaultPreloadManager, que usa PreloadMediaSource para precargar muestras de contenido multimedia de las fuentes en la memoria, y usa un número entero rankingData que indica el índice de un elemento en la IU.
    • Se agregó PlayerId a la mayoría de los métodos de LoadControl para permitir que las implementaciones de LoadControl admitan varios jugadores.
    • Se quitan Buffer.isDecodeOnly() y C.BUFFER_FLAG_DECODE_ONLY. No es necesario establecer esta marca, ya que los renderizadores y decodificadores decidirán omitir los búferes según la marca de tiempo. Las implementaciones personalizadas de Renderer deben verificar si el tiempo de margen entre citas es de al menos BaseRenderer.getLastResetPositionUs() para decidir si se debe mostrar una muestra. Las implementaciones personalizadas de SimpleDecoder pueden verificar isAtLeastOutputStartTimeUs() si es necesario o marcar otros búferes con DecoderOutputBuffer.shouldBeSkipped para omitirlos.
    • Permite que TargetPreloadStatusControl.getTargetPreloadStatus(T) devuelva un valor nulo para indicar que no se debe precargar un MediaSource con el rankingData determinado.
    • Se agregó remove(MediaSource) a BasePreloadManager.
    • Agrega reset() a BasePreloadManager para liberar todas las fuentes de retención mientras mantienes la instancia del administrador de precarga.
    • Se agregó ExoPlayer.setPriority() (y Builder.setPriority()) para definir el valor de prioridad que se usa en PriorityTaskManager y para la importancia de MediaCodec a partir del nivel de API 35.
    • Se corrigió un problema con la actualización de la última hora de almacenamiento en búfer, que generaba una clave bs (agotamiento del búfer) incorrecta en CMCD (#1124).
    • Agrega PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) para indicar que la fuente se cargó hasta el final. Esto permite que las implementaciones de DefaultPreloadManager y PreloadMediaSource.PreloadControl personalizadas precarguen la siguiente fuente o realicen otras acciones.
    • Se corrigió un error por el que omitir el silencio al final de los elementos podía activar una excepción de reproducción.
    • Agrega clear a PreloadMediaSource para descartar el período de precarga.
    • Se agregó el nuevo código de error PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, que se usa cuando se reclaman recursos de códec para tareas de mayor prioridad.
    • Permite que AdsMediaSource cargue anuncios previos al video antes de que se complete la preparación inicial del contenido multimedia (#1358).
    • Se corrigió un error por el que la reproducción se movía a STATE_ENDED cuando se volvía a preparar una transmisión en vivo de DASH de varios períodos después de que el período original ya se había quitado del manifiesto.
    • Se cambió el nombre de onTimelineRefreshed() por onSourcePrepared() y el de onPrepared() por onTracksSelected() en PreloadMediaSource.PreloadControl. También cambia el nombre de los IntDefs en DefaultPreloadManager.Stage según corresponda.
    • Se agregó compatibilidad experimental con la programación dinámica para alinear mejor el trabajo con los ciclos de activación de la CPU y retrasar la activación hasta que los renderizadores puedan progresar. Puedes habilitar esta opción con experimentalSetDynamicSchedulingEnabled() cuando configures tu instancia de ExoPlayer.
    • Agrega Renderer.getDurationToProgressUs(). Un Renderer puede implementar este método para devolver a ExoPlayer la duración que debe avanzar la reproducción para que progrese el renderizador. Si se configura ExoPlayer con experimentalSetDynamicSchedulingEnabled(), ExoPlayer llamará a este método cuando calcule el tiempo para programar su tarea de trabajo.
    • Agrega MediaCodecAdapter#OnBufferAvailableListener para alertar cuando los búferes de entrada y salida estén disponibles para que los use MediaCodecRenderer. MediaCodecRenderer indicará a ExoPlayer cuando reciba estas devoluciones de llamada y, si ExoPlayer se configura con experimentalSetDynamicSchedulingEnabled(), ExoPlayer programará su bucle de trabajo a medida que los renderizadores puedan avanzar.
    • Usa la clase de datos para los métodos LoadControl en lugar de los parámetros individuales.
    • Agrega ExoPlayer.isReleased() para verificar si se llamó a Exoplayer.release().
    • Se agregó ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() para configurar la posición máxima para la que seekToPrevious() busca el elemento anterior (#1425).
    • Se corrigieron algunas inconsistencias en el enfoque de audio, p.ej., no se informaba la pérdida total o transitoria del enfoque mientras el reproductor estaba en pausa (#1436).
    • Se corrigió un posible IndexOutOfBoundsException causado por extractores que informaban pistas adicionales después del paso de preparación inicial (#1476).
    • Effects en ExoPlayer.setVideoEffect() recibirá las marcas de tiempo sin el desplazamiento del renderizador (#1098).
    • Se corrigió un posible IllegalArgumentException que se producía cuando se controlaba un error del reproductor que ocurría mientras se leía con anticipación otro elemento de la lista de reproducción (#1483).
  • Transformador:
    • Agrega audioConversionProcess y videoConversionProcess a ExportResult para indicar cómo se creó la pista respectiva en el archivo de salida.
    • Se flexibilizaron las verificaciones de nivel de H.264 para la optimización de recorte.
    • Se agregó compatibilidad para cambiar entre contenido multimedia de entrada SDR y HDR en una secuencia.
    • Se agregó compatibilidad con efectos de audio a nivel de la composición.
    • Se agregó compatibilidad para transcodificar imágenes Ultra HDR en videos HDR.
    • Se corrigió un problema por el que DefaultAudioMixer no generaba la cantidad correcta de bytes después de restablecerse y reutilizarse.
    • Se solucionó un error del decodificador en el que la cantidad de canales de audio se limitaba a estéreo cuando se controlaba la entrada de PCM.
    • Cuando selecciones pistas en ExoPlayerAssetLoader, ignora las restricciones de recuento de canales de audio, ya que solo se aplican a la reproducción.
    • Reemplaza la interfaz androidx.media3.transformer.Muxer por androidx.media3.muxer.Muxer y quita androidx.media3.transformer.Muxer.
    • Se corrigió la carga de imágenes HEIC desde esquemas de URI de contenido. (#1373).
    • Ajusta la duración de la pista de audio en AudioGraphInput para mejorar la sincronización de audio y video.
    • Quita el campo ExportResult.processedInputs. Si usas este campo para los detalles del códec, usa DefaultDecoderFactory.listener en su lugar. En caso de una excepción de códec, los detalles del códec estarán disponibles en ExportException.codecInfo.
  • Extractores:
    • MPEG-TS: Se revirtió el cambio que garantizaba que se renderizara el último fotograma pasando la última unidad de acceso de una transmisión a la cola de muestras (#7909). Se incorporaron correcciones para resolver los problemas que surgieron en las transmisiones de HLS solo de fotogramas I(#1150) y las transmisiones de HLS H.262 (#1126).
    • MP3: Se prefiere el tamaño de los datos de un fotograma Info por sobre el tamaño que informa el flujo subyacente (p.ej., el tamaño del archivo o el encabezado HTTP Content-Length). Esto ayuda a excluir los datos de avances que no se pueden reproducir (p.ej., la imagen del álbum) de los cálculos de búsqueda de tasa de bits constante, lo que hace que las búsquedas sean más precisas (#1376).
    • MP3: Usa el recuento de fotogramas y otros datos en un fotograma Info (si está presente) para calcular una tasa de bits promedio para la búsqueda de tasa de bits constante, en lugar de extrapolar de la tasa de bits del fotograma después del fotograma Info, que puede ser artificialmente pequeña, p.ej., fotograma PCUT (#1376).
    • Se corrigió la extracción del formato de audio PCM en contenedores AVI.
  • Audio:
    • Se corrigieron los atributos de codificación del perfil 2 de DTS:X para la reproducción de transferencia (#1299).
    • En el caso de la reproducción descargada, restablece el campo de seguimiento para la finalización de la transmisión en DefaultAudioSink antes de llamar a AudioTrack.stop(), de modo que AudioTrack.StreamEventCallback#onPresentationEnded identifique correctamente cuándo se reprodujeron todos los datos pendientes.
    • Se corrigió un error en SilenceSkippingAudioProcessor por el que las transiciones entre diferentes formatos de audio (por ejemplo, de estéreo a mono) podían hacer que el procesador arrojara una excepción (#1352).
    • Implementa MediaCodecAudioRenderer.getDurationToProgressUs() para que ExoPlayer programe de forma dinámica su bucle de trabajo principal cuando MediaCodecAudioRenderer pueda avanzar.
  • Video:
    • Se corrigió un problema por el que Listener.onRenderedFirstFrame() llegaba demasiado pronto cuando se cambiaban las plataformas durante la reproducción.
    • Se corrige la lógica de resguardo del decodificador para Dolby Vision para usar un decodificador AV1 compatible si es necesario (#1389).
    • Se corrigió la excepción de códec que podía producirse cuando se habilitaba un renderizador de video durante la reproducción.
  • Texto:
    • Se corrigió un problema por el que se omitían los subtítulos que comenzaban antes de una posición de búsqueda. Este problema solo se introdujo en Media3 1.4.0-alpha01.
    • Cambia el comportamiento predeterminado del análisis de subtítulos para que se produzca durante la extracción en lugar de durante la renderización (consulta el diagrama de arquitectura de ExoPlayer para conocer la diferencia entre la extracción y la renderización).
      • Este cambio se puede anular llamando a ambos métodos: MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) y TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulta los documentos sobre la personalización para saber cómo conectar estos componentes a una instancia de ExoPlayer. Estos métodos (y toda la compatibilidad con la decodificación de subtítulos heredados) se quitarán en una versión futura.
      • Las apps con implementaciones de SubtitleDecoder personalizadas deben actualizarlas para implementar SubtitleParser en su lugar (y SubtitleParser.Factory en lugar de SubtitleDecoderFactory).
    • PGS: Se corrigió la decodificación de longitud de ejecución para resolver 0 como un índice de color, en lugar de un valor de color literal (#1367).
    • CEA-708: Ignora el valor rowLock. La especificación CEA-708-E S-2023 indica que se debe suponer que rowLock y columnLock son verdaderos, independientemente de los valores presentes en la transmisión (la compatibilidad con columnLock no está implementada, por lo que se supone que siempre es falso).
      • Originalmente, esto se incluyó en las notas de la versión 1.3.0-alpha01, pero el cambio se revirtió accidentalmente antes de la versión 1.3.0-rc01. Este problema ya se solucionó, por lo que el cambio vuelve a estar presente.
    • CEA-708: Se evita que se agreguen líneas nuevas duplicadas por el manejo ingenuo de ExoPlayer del comando "set pen location" (#1315).
    • Se corrigió un IllegalArgumentException de LegacySubtitleUtil cuando una muestra de subtítulos de WebVTT no contiene indicadores, p.ej., como parte de una transmisión DASH (#1516).
  • Metadatos:
    • Se corrigió la asignación de MP4 a las etiquetas de ordenación ID3. Anteriormente, las etiquetas MP4 "album sort" (soal), "artist sort" (soar) y "album artist sort" (soaa) se asignaban de forma incorrecta a las etiquetas ID3 TSO2, TSOA y TSOP (#1302).
    • Se corrigió la lectura de las etiquetas numéricas gnre (género) y tmpo (tempo) de MP4 (/iTunes) cuando el valor tiene más de un byte de longitud.
    • Se propagó el marco TCON de ID3 a MediaMetadata.genre (#1305).
  • Imagen:
    • Se agregó compatibilidad con cuadrículas de miniaturas de DASH no cuadradas (#1300).
    • Se agregó compatibilidad con AVIF para la API 34 y versiones posteriores.
    • Permite null como parámetro para que ExoPlayer.setImageOutput() borre un ImageOutput establecido anteriormente.
  • DataSource:
    • Implementa la compatibilidad con los URI de recursos sin procesar android.resource://package/id, en los que package es diferente del paquete de la aplicación actual. Anteriormente, no se había documentado que esto funcionara, pero es una forma más eficiente de acceder a los recursos de otro paquete que por nombre.
    • Verifica con entusiasmo que url no sea nulo en los constructores de DataSpec. Este parámetro ya se anotó para que no sea nulo.
    • Se permite que ByteArrayDataSource resuelva un URI en un array de bytes durante open(), en lugar de codificarse de forma fija en la construcción (#1405).
  • DRM:
    • Se permite establecer un LoadErrorHandlingPolicy en DefaultDrmSessionManagerProvider (#1271).
  • Efecto:
    • Admite varios cambios de velocidad dentro del mismo EditedMediaItem o Composition en SpeedChangeEffect.
    • Compatibilidad con salida HLG y PQ desde la entrada de mapa de bits Ultra HDR
    • Se agregó compatibilidad con EGL_GL_COLORSPACE_BT2020_HLG_EXT, que mejora la salida de la superficie de HLG en ExoPlayer.setVideoEffect y SurfaceView de depuración de Transformer.
    • Se actualizó la implementación de la matriz de Overlay para que sea coherente con la documentación. Para ello, se invirtieron los valores de x e y aplicados en setOverlayFrameAnchor(). Si usas OverlaySettings.Builder.setOverlayFrameAnchor(), invierte sus valores x e y multiplicándolos por -1.
    • Se corrigió un error por el que TimestampWrapper fallaba cuando se usaba con ExoPlayer#setVideoEffects (#821).
    • Cambiar el espacio de trabajo de color SDR predeterminado de colores lineales a video SDR BT 709 eléctrico También proporciona una tercera opción para conservar el espacio de color original.
    • Se permite definir el orden z indeterminado de EditedMediaItemSequences (#1055).
    • Mantener un rango de luminancia coherente en diferentes partes del contenido HDR (usa el rango de HLG)
    • Se agregó compatibilidad con superposiciones de Ultra HDR (mapa de bits) en contenido HDR.
    • Permite que se usen los efectos de SeparableConvolution antes de la API 26.
    • Quita el OverlaySettings.useHdr sin usar, ya que el rango dinámico de la superposición y el fotograma deben coincidir.
    • Se agregó compatibilidad con HDR para TextOverlay. La luminancia de la superposición de texto se puede ajustar con OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Extensión IMA:
    • Se asciende a estable la API de Promote, que es necesaria para que las apps reproduzcan transmisiones de anuncios de DAI.
    • Se agregó replaceAdTagParameters(Map <String, String>) a ImaServerSideAdInsertionMediaSource.AdLoader, lo que permite reemplazar los parámetros de la etiqueta de anuncio en el entorno de ejecución.
    • Se corrigió un error por el que no se llamaba a VideoAdPlayer.VideoAdPlayerCallback.onError() cuando se producía un error del reproductor durante la reproducción de anuncios (#1334).
    • Se actualizó la versión del SDK de IMA a la 3.33.0 para corregir un error NullPointerException que se producía cuando se usaban URIs de etiquetas de anuncios data:// (#700).
  • Sesión:
    • Cambia el valor predeterminado de CommandButton.enabled a true y asegúrate de que el valor pueda permanecer como falso para los controladores, incluso si el comando asociado está disponible.
    • Se agregaron constantes de íconos para CommandButton que se deben usar en lugar de los recursos de íconos personalizados.
    • Se agregó MediaSessionService.isPlaybackOngoing() para permitir que las apps consulten si el servicio debe detenerse en onTaskRemoved() (#1219).
    • Agrega MediaSessionService.pauseAllPlayersAndStopSelf(), que permite pausar la reproducción de todas las sesiones de forma conveniente, y llama a stopSelf() para finalizar el ciclo de vida de MediaSessionService.
    • Anula MediaSessionService.onTaskRemoved(Intent) para proporcionar una implementación predeterminada segura que mantenga el servicio en ejecución en primer plano si la reproducción está en curso o, de lo contrario, detenga el servicio.
    • Se ocultó la barra de búsqueda en la notificación de contenido multimedia para las transmisiones en vivo, ya que no se estableció la duración en los metadatos de la sesión de la plataforma (#1256).
    • Alinea la conversión de MediaMetadata a MediaDescriptionCompat para usar el mismo orden y la misma lógica preferidos cuando selecciones las propiedades de metadatos que en media1.
    • Se agregó MediaSession.sendError(), que permite enviar errores recuperables al controlador de Media3. Cuando se usa el controlador de notificaciones (consulta MediaSession.getMediaNotificationControllerInfo()), el error personalizado se usa para actualizar el PlaybackState de la sesión de la plataforma a un estado de error con la información de error proporcionada (#543).
    • Agrega MediaSession.Callback.onPlayerInteractionFinished() para informar a las sesiones cuando finalice una serie de interacciones del jugador desde un control específico.
    • Agrega SessionError y úsalo en SessionResult y LibraryResult en lugar del código de error para proporcionar más información sobre el error y cómo resolverlo, si es posible.
    • Publica el código de la app de prueba del controlador de Media3 que se puede usar para probar las interacciones con las apps que publican una sesión multimedia.
    • Propaga los extras que se pasan a MediaSession[Builder].setSessionExtras() de media3 a PlaybackStateCompat.getExtras() de un controlador de media1.
    • Asigna errores recuperables y no recuperables hacia y desde la sesión de la plataforma. Un PlaybackException se asigna a un estado de error fatal del PlaybackStateCompat. Un SessionError enviado al controlador de notificaciones multimedia con MediaSession.sendError(ControllerInfo, SessionError) se asigna a un error recuperable en PlaybackStateCompat, lo que significa que se establecen el código de error y el mensaje, pero el estado de la sesión de la plataforma sigue siendo diferente de STATE_ERROR.
    • Permitir que la actividad de la sesión se establezca por controlador para anular la actividad de la sesión global La actividad de la sesión se puede definir para un controlador en el momento de la conexión creando un ConnectionResult con AcceptedResultBuilder.setSessionActivivty(PendingIntent). Una vez que se establece la conexión, la actividad de la sesión se puede actualizar con MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Mejora la replicación de errores de las llamadas a MediaLibrarySession.Callback. Ahora, la replicación de errores se puede configurar con MediaLibrarySession.Builder.setLibraryErrorReplicationMode() para elegir el tipo de error o inhabilitar la replicación de errores, que está activada de forma predeterminada.
  • IU:
    • Se agregó compatibilidad con la visualización de imágenes a PlayerView cuando se conecta a un ExoPlayer (#1144).
    • Se agregó la personalización de varios íconos en PlayerControlView a través de atributos XML para permitir diferentes elementos de diseño por instancia de PlayerView, en lugar de anulaciones globales (#1200).
    • Se solucionó un error de la plataforma que causaba que el video se estirara o recortara cuando se usaba SurfaceView dentro de un AndroidView de Compose en el nivel de API 34 (#1237).
  • Descargas:
    • Se garantiza que DownloadHelper no filtre instancias de Renderer no publicadas, lo que, con el tiempo, puede provocar que una app falle con IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Extensión de Cronet:
    • Corrige SocketTimeoutException en CronetDataSource. En algunas versiones de Cronet, la solicitud que proporciona la devolución de llamada no siempre es la misma. Esto hace que la devolución de llamada no se complete y que se agote el tiempo de espera de la solicitud (https://issuetracker.google.com/328442628).
  • Extensión HLS:
    • Se corrigió un error por el que las muestras de EMSG pendientes que esperaban una discontinuidad se delegaban en HlsSampleStreamWrapper con un desplazamiento incorrecto, lo que causaba un IndexOutOfBoundsException o un IllegalArgumentException (#1002).
    • Se corrigió un error por el que las playlists no principales se volvían a cargar continuamente para las transmisiones de LL-HLS (#1240).
    • Se corrigió un error por el que habilitar CMCD para HLS con segmentos de inicialización generaba Source Error y IllegalArgumentException.
    • Se corrigió un error por el que las playlists que no son principales no se actualizaban durante la reproducción en vivo (#1240).
    • Se corrigió un error por el que habilitar CMCD para transmisiones en vivo de HLS causaba ArrayIndexOutOfBoundsException (#1395).
  • Extensión DASH:
    • Se corrigió un error por el que volver a preparar una transmisión en vivo de varios períodos podía arrojar una IndexOutOfBoundsException (#1329).
    • Se agregó compatibilidad con las URLs de licencia de dashif:Laurl (#1345).
  • Extensión Cast:
    • Se corrigió un error que convertía el título del álbum de MediaQueueItem en el artista en el elemento multimedia de Media3 (#1255).
  • Utilidades de prueba:
    • Implementa onInit() y onRelease() en FakeRenderer.
    • Se cambiaron los métodos TestPlayerRunHelper.runUntil()/playUntil() para que fallen en caso de errores recuperables (p.ej., los que se informan a AnalyticsListener.onVideoCodecError()). Usa la nueva cadena de métodos TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() para inhabilitar este comportamiento.
  • App de demo:
    • Usa DefaultPreloadManager en la app de demostración de formato corto.
    • Se permite configurar el modo de repetición con argumentos Intent desde la línea de comandos (#1266).
    • Usa HttpEngineDataSource como HttpDataSource cuando el dispositivo lo admita.
  • Se quitan los símbolos obsoletos:
    • Se quitó CronetDataSourceFactory. Se usa CronetDataSource.Factory en su lugar.
    • Se quitan algunos constructores DataSpec. Usa DataSpec.Builder en su lugar.
    • Se quitó el método setContentTypePredicate(Predicate) de DefaultHttpDataSource, OkHttpDataSource y CronetDataSource. En su lugar, usa el método equivalente en cada XXXDataSource.Factory.
    • Se quitan los constructores OkHttpDataSource y OkHttpDataSourceFactory. Utiliza OkHttpDataSource.Factory en lugar de esta función.
    • Se quita PlayerMessage.setHandler(Handler). Se usa setLooper(Looper) en su lugar.
    • Quita el campo Timeline.Window.isLive. En su lugar, usa el método isLive().
    • Se quitan los constructores DefaultHttpDataSource. Se usa DefaultHttpDataSource.Factory en su lugar.
    • Se quita DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Se usa DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS en su lugar.
    • Se quita MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Usa MediaCodecInfo.canReuseCodec(Format, Format) en su lugar.
    • Se quitaron los métodos DrmSessionManager.DUMMY y getDummyDrmSessionManager(). Utiliza DrmSessionManager.DRM_UNSUPPORTED en lugar de esta función.
    • Quita AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). En su lugar, usa las sobrecargas que toman un DecoderReuseEvaluation.
    • Se quitaron IntDef de RendererSupport.FormatSupport y las constantes FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE y FORMAT_UNSUPPORTED_TYPE. En su lugar, usa el IntDef y las constantes equivalentes en androidx.media3.common.C (p.ej., C.FORMAT_HANDLED).
    • Quita la interfaz Bundleable. Esto incluye quitar todos los campos constantes Bundleable.Creator<Foo> CREATOR. En su lugar, los emisores deben usar los métodos Bundle toBundle() y static Foo fromBundle(Bundle) en cada tipo.

Versión 1.4.0-rc01

10 de julio de 2024

Usa la versión estable 1.4.0.

Versión 1.4.0-beta01

26 de junio de 2024

Usa la versión estable 1.4.0.

Versión 1.4.0-alpha02

7 de junio de 2024

Usa la versión estable 1.4.0.

Versión 1.4.0-alpha01

17 de abril de 2024

Usa la versión estable 1.4.0.

Versión 1.3.0

Versión 1.3.1

11 de abril de 2024

Lanzamiento de androidx.media3:media3-*:1.3.1. La versión 1.3.1 incluye estas confirmaciones.

  • Biblioteca común:
    • Agrega Format.labels para permitir etiquetas localizadas o alternativas.
  • ExoPlayer:
    • Se corrigió un problema por el que PreloadMediaPeriod no podía retener las transmisiones cuando se volvía a precargar.
    • Aplica el TrackSelectionResult correspondiente correcto al período de reproducción en la nueva selección de pistas.
    • Inicia los renderizadores habilitados de forma anticipada solo después de avanzar el período de reproducción cuando se realiza la transición entre elementos multimedia (#1017).
    • Se agregó el tipo de datos que se devuelve faltante a la regla de ProGuard -keepclasseswithmembers para DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformador:
    • Se agregó una solución alternativa para la excepción que se genera debido a que MediaMuxer no admite marcas de tiempo de presentación negativas antes de la API 30.
  • Selección de pistas:
    • DefaultTrackSelector: Prefiere las pistas de video con una velocidad de fotogramas "razonable" (>=10 fps) en lugar de aquellas con una velocidad de fotogramas más baja o sin configurar. Esto garantiza que el reproductor seleccione la pista de video "real" en los MP4 extraídos de fotos en movimiento que pueden contener dos pistas HEVC, en las que una tiene una resolución más alta, pero una cantidad muy pequeña de fotogramas (#1051).
  • Extractores:
    • Se corrigió un problema por el que no se omitía el padding cuando se leían fragmentos de tamaño impar de archivos WAV (#1117).
    • MP3: Se propaga Format.averageBitrate desde marcos de metadatos, como XING y VBRI.
    • MPEG-TS: Se revirtió un cambio que tenía como objetivo garantizar que se renderizara el último fotograma pasando la última unidad de acceso de una transmisión a la cola de muestras (#7909). Esto se debe a que el cambio causa nuevos problemas con las transmisiones de HLS solo de fotogramas I (#1150) y las transmisiones de HLS H.262 (#1126).
  • Audio:
    • Permite la recuperación del renderizador inhabilitando la descarga si la pista de audio no se inicializa en el modo de descarga.
  • Video:
    • Se agregó una solución alternativa para un problema del dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que hace que las transmisiones H265 de 60 fps se marquen como no compatibles.
    • Se agregó una solución alternativa que garantiza que el primer fotograma siempre se renderice durante la tunelización, incluso si el dispositivo no lo hace automáticamente como lo requiere la API (#1169). (#966).
    • Se corrigió un problema por el que el manejo de la información de color HDR causaba un comportamiento incorrecto del códec y evitaba los cambios de formato adaptables para las pistas de video SDR (#1158).
  • Texto:
    • WebVTT: Se evita que las indicaciones directamente consecutivas creen instancias de CuesWithTiming adicionales falsas a partir de WebvttParser.parse (#1177).
  • DRM:
    • Se solucionó un problema con una NoSuchMethodError que puede arrojar el framework de MediaDrm en lugar de ResourceBusyException o NotProvisionedException en algunos dispositivos con Android 14 (#1145).
  • Efecto:
    • Se mejoró la asignación de tono de PQ a SDR con la conversión de espacios de color.
  • Sesión:
    • Se corrigió un problema por el que la posición actual retrocedía cuando el controlador reemplazaba el elemento actual (#951).
    • Se corrigió un problema por el que MediaMetadata con solo extras no nulo no se transmitía entre los controladores y las sesiones de contenido multimedia (#1176).
  • IU:
    • Se recurre al resguardo para incluir el nombre del idioma de la pista de audio si Locale no puede identificar un nombre visible (#988).
  • Extensión DASH:
    • Se propagan todos los elementos Label del manifiesto en Format.labels (#1054).
  • Extensión RTSP:
    • Se omiten los valores de información de sesión vacíos (etiquetas i) en el análisis de SDP (#1087).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
    • Se inhabilitó la extensión MIDI como dependencia local de forma predeterminada, ya que requiere que se configure un repositorio de Maven adicional. Los usuarios que necesiten este módulo de una dependencia local pueden volver a habilitarlo.

Versión 1.3.0

6 de marzo de 2024

Lanzamiento de androidx.media3:media3-*:1.3.0. La versión 1.3.0 incluye estas confirmaciones.

  • Biblioteca común:
    • Implementa la compatibilidad con los URIs de recursos sin procesar de android.resource://package/[type/]name en los que package es diferente del paquete de la aplicación actual. Siempre se documentó que esto funcionaba, pero no se implementó correctamente hasta ahora.
    • Normaliza los tipos de MIME que establece el código de la app o que se leen del contenido multimedia para que estén completamente en minúsculas.
    • Define los anuncios con un MediaItem completo en lugar de un solo Uri en AdPlaybackState.
    • Aumenta minSdk a 19 (Android KitKat). Esto está alineado con todas las demás bibliotecas de AndroidX y es necesario para que podamos actualizar a las versiones más recientes de nuestras dependencias de AndroidX.
    • Se propagan artworkUri y artworkData en MediaMetadata.Builder.populate(MediaMetadata) cuando al menos uno de ellos no es nulo (#964).
  • ExoPlayer:
    • Se agregaron PreloadMediaSource y PreloadMediaPeriod, que permiten que las apps carguen previamente una fuente de contenido multimedia en una posición de inicio específica antes de la reproducción. PreloadMediaSource se encarga de preparar la fuente de contenido multimedia para recibir el Timeline, preparar y almacenar en caché el período en la posición de inicio determinada, seleccionar pistas y cargar datos multimedia para el período. Las apps controlan el progreso de la precarga implementando PreloadMediaSource.PreloadControl y establecen la fuente precargada en el reproductor para la reproducción.
    • Se agregó ExoPlayer.setImageOutput, que permite que las apps configuren ImageRenderer.ImageOutput.
    • DefaultRenderersFactory ahora proporciona un ImageRenderer al reproductor de forma predeterminada con ImageOutput y ImageDecoder.Factory.DEFAULT nulos.
    • Se emite el evento Player.Listener.onPositionDiscontinuity cuando se omite el silencio (#765).
    • Se agregó compatibilidad experimental para analizar subtítulos durante la extracción. Puedes habilitar esta opción con MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Admite fuentes de contenido multimedia adaptables con PreloadMediaSource.
    • Implementa HttpEngineDataSource, un HttpDataSource con la API de HttpEngine.
    • Evita la creación de subclases de CompositeSequenceableLoader. Este componente se hizo extensible anteriormente, pero nunca se creó una subclase dentro de la biblioteca. Las personalizaciones se pueden realizar uniendo una instancia con el patrón de decorador y con la implementación de un CompositeSequenceableLoaderFactory personalizado.
    • Se corrigió un problema por el que repetir la misma hora provocaba que se borraran los metadatos de este elemento (#1007).
    • Se cambió el nombre de los métodos experimentalSetSubtitleParserFactory de BundledChunkExtractor.Factory y DefaultHlsExtractorFactory a setSubtitleParserFactory y no se permite pasar null. Usa los nuevos métodos experimentalParseSubtitlesDuringExtraction(boolean) para controlar el comportamiento de análisis.
    • Se agregó compatibilidad para personalizar el SubtitleParser.Factory que se usa durante la extracción. Esto se puede lograr con MediaSource.Factory.setSubtitleParserFactory().
    • Agrega el prefijo de origen a todos los campos Format.id generados a partir de MergingMediaSource. Esto ayuda a identificar qué fuente produjo un Format (#883).
    • Se corrigió la regex que se usa para validar los nombres de claves personalizados de datos comunes de clientes multimedia (CMCD) modificándola para que solo verifique el guion (#1028).
    • Se detuvo la codificación doble de los parámetros de consulta de CMCD (#1075).
  • Transformador:
    • Se agregó compatibilidad para aplanar videos en cámara lenta de SEF H.265/HEVC.
    • Aumenta la velocidad de transmultiplexación, especialmente para las ediciones de "quitar video".
    • Se agregó la API para garantizar que el archivo de salida comience en un fotograma. Esto puede hacer que el resultado de las operaciones de recorte sea más compatible con las implementaciones de reproductores que no muestran el primer fotograma de video hasta su marca de tiempo de presentación (#829).
    • Se agregó compatibilidad para optimizar las operaciones de recorte de MP4 de un solo recurso.
    • Se agregó compatibilidad para garantizar que un fotograma tenga la primera marca de tiempo en el archivo de salida. Se corrigieron los archivos de salida que comenzaban con un fotograma negro en los reproductores basados en iOS (#829).
  • Selección de pistas:
    • Agrega DefaultTrackSelector.selectImageTrack para habilitar la selección de pistas de imágenes.
    • Agrega TrackSelectionParameters.isPrioritizeImageOverVideoEnabled para determinar si se debe seleccionar una pista de imagen si están disponibles una pista de imagen y una de video. El valor predeterminado es false, lo que significa que se prioriza la selección de una pista de video.
  • Extractores:
    • Se agregó un análisis de AV1C adicional al extractor de MP4 para recuperar los valores de ColorInfo.colorSpace, ColorInfo.colorTransfer y ColorInfo.colorRange (#692).
    • MP3: Usa la búsqueda de tasa de bits constante (CBR) para los archivos con un encabezado Info (el equivalente de CBR del encabezado Xing). Anteriormente, usábamos la tabla de búsqueda del encabezado Info, pero esto genera una búsqueda menos precisa que si la ignoramos y suponemos que el archivo es CBR.
    • MPEG2-TS: Se agregó compatibilidad con DTS, DTS-LBR y DTS:X Profile2 (#275).
    • Se extraen los tipos de audio de los descriptores de TS y se asignan a marcas de rol, lo que permite que los usuarios seleccionen pistas de audio con más información (#973).
  • Audio:
    • Se mejoró el algoritmo para omitir silencios con una rampa de volumen suave; se conservó el silencio mínimo y las duraciones de silencio más naturales (#7423).
    • Se informa el silencio omitido de forma más determinística (#1035).
  • Video:
    • Cambia el constructor MediaCodecVideoRenderer que toma un argumento VideoFrameProcessor.Factory y reemplázalo por un constructor que tome un argumento VideoSinkProvider. Las apps que quieran insertar un VideoFrameProcessor.Factory personalizado pueden crear una instancia de un CompositingVideoSinkProvider que use el VideoFrameProcessor.Factory personalizado y pasar el proveedor de receptores de video a MediaCodecVideoRenderer.
  • Texto:
    • Se corrigió la serialización de indicaciones de mapa de bits para resolver el error Tried to marshall a Parcel that contained Binder objects cuando se usa DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: Ignora el valor rowLock. La especificación CEA-708-E S-2023 indica que se debe suponer que rowLock y columnLock son verdaderos, independientemente de los valores presentes en la transmisión (la compatibilidad con columnLock no está implementada, por lo que se supone que siempre es falso).
  • Imagen:
    • Se agregó compatibilidad con miniaturas de DASH. Las imágenes de cuadrícula se recortan y se proporcionan miniaturas individuales a ImageOutput cerca de sus tiempos de presentación.
  • DRM:
    • Reproduce muestras sin encriptar de "contenido inicial sin encriptar" en el contenido de DRM de inmediato de forma predeterminada, incluso si las claves para las muestras encriptadas posteriores aún no están listas. Esto puede provocar detenciones durante la reproducción si las claves aún no están listas cuando la posición de reproducción alcanza las muestras encriptadas (pero, antes, la reproducción no se habría iniciado en este punto). Este comportamiento se puede inhabilitar con MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey o DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Extensión IMA:
    • Se corrigió un problema por el que no se podían reproducir los anuncios de DASH y HLS sin la extensión de archivo adecuada.
  • Sesión:
    • Inhabilita la detección de doble clic para las apps para TVs (#962).
    • Se corrigió un problema por el que MediaItem.RequestMetadata con solo extras no nulos no se transmitía entre los controladores y las sesiones de contenido multimedia.
    • Se agregó un constructor a MediaLibrarySession.Builder que solo toma un Context en lugar de un MediaLibraryService.
  • Extensión HLS:
    • Reduce HlsMediaPeriod a la visibilidad de paquete privado. No se debe depender directamente de este tipo desde fuera del paquete de HLS.
    • Se resuelven las búsquedas al principio de un segmento de manera más eficiente (#1031).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
    • Decodificador MIDI: Se ignoran los mensajes de eventos SysEx (#710).
  • Utilidades de prueba:
    • No pauses la reproducción en TestPlayerRunHelper.playUntilPosition. La prueba mantiene la reproducción en un estado de reproducción, pero suspende el progreso hasta que la prueba pueda agregar aserciones y acciones adicionales.
  • App de demo:
    • Agrega un módulo de demostración de formato corto para mostrar el uso de PreloadMediaSource con el caso de uso de contenido de formato corto.

Versión 1.3.0-rc01

22 de febrero de 2024

Usa la versión estable 1.3.0.

Versión 1.3.0-beta01

7 de febrero de 2024

Usa la versión estable 1.3.0.

Versión 1.3.0-alpha01

15 de enero de 2024

Usa la versión estable 1.3.0.

Versión 1.2.0

Versión 1.2.1

9 de enero de 2024

  • ExoPlayer:
    • Se corrigió un problema por el que las búsquedas manuales fuera del rango de LiveConfiguration.min/maxOffset seguían ajustando el desplazamiento a min/maxOffset.
    • Se corrigió un problema por el que los diseños de canales OPUS y VORBIS eran incorrectos para 3, 5, 6, 7 y 8 canales (#8396).
    • Se corrigió un problema por el que las selecciones de pistas después de buscar en cero en una transmisión en vivo permitían, de forma incorrecta, que la transmisión comenzara en su posición predeterminada (#9347).
    • Se corrigió el problema por el que las instancias nuevas de CmcdData.Factory recibían valores negativos para bufferedDurationUs de fuentes de fragmentos, lo que generaba una IllegalArgumentException (#888).
  • Transformador:
    • Se solucionó un problema por el que el codificador arrojaba un error en el momento de la configuración debido a que se establecía una tasa de funcionamiento alta.
  • Extractores:
    • Marca las pistas HEVC secundarias (que no se pueden reproducir) en las fotos en movimiento JPEG como ROLE_FLAG_ALTERNATE para evitar que se seleccionen automáticamente para la reproducción debido a su resolución más alta.
    • Se corrigió la detección incorrecta de fotogramas clave para las transmisiones de TS H264 (#864).
    • Se corrigió la estimación de la duración de las transmisiones de TS que duran más de 47,721 segundos (#855).
  • Audio:
    • Se corrigió el control de EOS para SilenceSkippingAudioProcessor cuando se llama varias veces (#712).
  • Video:
    • Se agregó una solución alternativa para un problema de dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que hace que las transmisiones AVC de 60 fps se marquen como no compatibles (#693).
  • Metadatos:
    • Se corrigió un error por el que MediaMetadata solo se propagaba a partir de comentarios de Vorbis con claves en mayúsculas (#876).
    • Se detecta OutOfMemoryError cuando se analizan marcos ID3 muy grandes, lo que significa que la reproducción puede continuar sin la información de la etiqueta en lugar de fallar por completo.
  • DRM:
    • Se extendió la solución alternativa para la URL de licencia de ClearKey https://default.url falsa al nivel de API 33 y versiones posteriores (antes, la solución alternativa solo se aplicaba exactamente en el nivel de API 33) (#837).
    • Se corrigió el error ERROR_DRM_SESSION_NOT_OPENED que se producía cuando se cambiaba de contenido encriptado a contenido sin encriptar sin una plataforma conectada al reproductor. El error se debió al uso incorrecto de un decodificador seguro para reproducir el contenido sin encriptar.
  • Sesión:
    • Se colocaron las claves y los valores personalizados en MediaMetadataCompat para MediaMetadata.extras y MediaMetadata.extras para MediaMetadataCompat (#756, #802).
    • Se corrigió la transmisión de notifyChildrenChanged para los controladores heredados (#644).
    • Se corrigió un error por el que, si se establecía un tiempo negativo para un temporizador de setWhen inhabilitado de la notificación, se producía una falla en algunos dispositivos (#903).
    • Se corrigió un error de IllegalStateException que se producía cuando el controlador de notificaciones de contenido multimedia no había completado la conexión cuando se solicitaba la primera actualización de notificaciones (#917).
  • IU:
    • Se corrige un problema por el que los botones para avanzar y retroceder no son visibles cuando se usan con Material Design en un BottomSheetDialogFragment (#511).
    • Se corrige un problema por el que los números del botón para avanzar de PlayerControlView estaban desalineados (#547).
  • Extensión DASH:
    • Se analiza "f800" como recuento de canales de 5 para Dolby en el manifiesto de DASH (#688).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
    • MIDI: Se corrigió un problema por el que, al avanzar, se omitían los eventos de cambio de programa (#704).
    • Se migró a FFmpeg 6.0 y se actualizó el NDK compatible a r26b (#707, #867).
  • Extensión Cast:
    • Se corrigió la creación de un Timeline para que la app no falle cuando no se pueda cargar el contenido multimedia en el dispositivo de transmisión (#708).

Versión 1.2.0

15 de noviembre de 2023

  • Biblioteca común:
    • Agrega un parámetro @Nullable Throwable a los métodos de la interfaz Log.Logger. El parámetro message de estos métodos ya no contiene información sobre el Throwable que se pasa a los métodos Log.{d,i,w,e}(), por lo que las implementaciones deberán agregar esta información de forma manual si lo desean (posiblemente con Logger.appendThrowableString(String, Throwable)).
    • Se corrigió un problema de compatibilidad con Kotlin en el que los parámetros de tipo genérico anulables y los tipos de elementos de array anulables no se detectaban como anulables. Algunos ejemplos son los parámetros de los métodos TrackSelectorResult y SimpleDecoder (#6792).
    • Se cambió el comportamiento predeterminado de la IU y las notificaciones en Util.shouldShowPlayButton para mostrar un botón de "reproducción" mientras la reproducción se suprime temporalmente (p.ej., debido a la pérdida transitoria del foco de audio). El comportamiento heredado se puede mantener con PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) o MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Se actualizó androidx.annotation:annotation-experimental a 1.3.1 para corregir https://issuetracker.google.com/251172715.
    • Se movió ExoPlayer.setAudioAttributes a la interfaz de Player.
  • ExoPlayer:
    • Se corrigieron los problemas de búsqueda en las transmisiones de AC4 que se producían por no identificar correctamente las muestras de solo decodificación (#11000).
    • Se agregó la supresión de la reproducción en dispositivos de salida de audio no adecuados (p.ej., la bocina integrada en dispositivos Wear OS) cuando esta función está habilitada a través de ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. El motivo de la supresión de la reproducción se actualizará como Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT si se intenta reproducir cuando no hay salidas de audio adecuadas disponibles o si se desconectan todas las salidas adecuadas durante la reproducción. El motivo de la supresión se quitará cuando se conecte una salida adecuada.
    • Agrega MediaSource.canUpdateMediaItem y MediaSource.updateMediaItem para aceptar actualizaciones de MediaItem después de la creación a través de Player.replaceMediaItem(s).
    • Se permiten actualizaciones de MediaItem para todas las clases de MediaSource que proporciona la biblioteca a través de Player.replaceMediaItem(s) (#33, #9978).
    • Se cambia el nombre de MimeTypes.TEXT_EXOPLAYER_CUES a MimeTypes.APPLICATION_MEDIA3_CUES.
    • Agrega PngExtractor que envíe y lea un archivo PNG completo en TrackOutput como una muestra.
    • Se mejoró el método SequenceableLoader.continueLoading(long) en la interfaz SequenceableLoader para SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contiene parámetros adicionales, incluidos playbackSpeed y lastRebufferRealtimeMs, además del playbackPositionUs existente.
    • Mejora el método ChunkSource.getNextChunk(long, long, List, ChunkHolder) en la interfaz ChunkSource a ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Se agregaron campos adicionales al registro de datos comunes de clientes multimedia (CMCD): falta de búfer (bs), fecha límite (dl), velocidad de reproducción (pr) y tiempo de inicio (su) (#8699).
    • Se agregó la profundidad de bits de luma y croma a ColorInfo (#491).
    • Se agregaron campos adicionales al registro de datos comunes de clientes multimedia (CMCD): solicitud de objeto siguiente (nor) y solicitud de rango siguiente (nrr) (#8699).
    • Se agregó funcionalidad para transmitir datos de Common Media Client Data (CMCD) con parámetros de consulta (#553).
    • Se corrigió ConcurrentModificationException en ExperimentalBandwidthMeter (#612).
    • Se agregó el parámetro MediaPeriodId a CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Se admite ClippingMediaSource (y otras fuentes con compensaciones de tiempo de período o ventana) en ConcatenatingMediaSource2 (#11226).
    • Cambia BaseRenderer.onStreamChanged() para que también reciba un argumento MediaPeriodId.
  • Transformador:
    • Analiza los datos de rotación EXIF para las entradas de imágenes.
    • Se quitó el tipo de anotación TransformationRequest.HdrMode y sus constantes asociadas. En su lugar, usa Composition.HdrMode y sus constantes asociadas.
    • Simplifica el OverlaySettings para solucionar los problemas de rotación.
    • Se cambiaron los parámetros frameRate y durationUs de SampleConsumer.queueInputBitmap a TimestampIterator.
  • Selección de pistas:
    • Agrega DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness para permitir o no permitir de forma explícita la adaptación no fluida. El valor predeterminado se mantiene en su comportamiento actual de true.
  • Extractores:
    • MPEG-TS: Se garantiza que se renderice el último fotograma pasando la última unidad de acceso de una transmisión a la cola de muestras (#7909).
    • Se corrigió un error tipográfico que se producía cuando se determinaba rotationDegrees. Se cambió projectionPosePitch por projectionPoseRoll (#461).
    • Quita la suposición de que las instancias de Extractor se pueden inspeccionar directamente con instanceof. Si deseas acceder en el entorno de ejecución a los detalles de implementación de un Extractor, primero debes llamar a Extractor.getUnderlyingInstance.
    • Agrega BmpExtractor.
    • Agrega WebpExtractor.
    • Agrega HeifExtractor.
    • Se agregó compatibilidad con QuickTime clásico a Mp4Extractor.
  • Audio:
    • Se agregó compatibilidad con PCM big-endian de 24/32 bits en MP4 y Matroska, y se analizó la codificación PCM para lpcm en MP4.
    • Se agregó compatibilidad para extraer audio Vorbis en MP4.
    • Se agrega AudioSink.getFormatOffloadSupport(Format), que recupera el nivel de compatibilidad con la descarga que el receptor puede proporcionar para el formato a través de un DefaultAudioOffloadSupportProvider. Devuelve el nuevo AudioOffloadSupport que contiene isFormatSupported, isGaplessSupported y isSpeedChangeSupported.
    • Agrega AudioSink.setOffloadMode(), a través del cual se establece la configuración de descarga en el receptor de audio. El valor predeterminado es AudioSink.OFFLOAD_MODE_DISABLED.
    • La descarga se puede habilitar a través de setAudioOffloadPreference en TrackSelectionParameters. Si la preferencia establecida es habilitar, el dispositivo admite la descarga para el formato y la selección de pistas es una sola pista de audio, se habilitará la descarga de audio.
    • Si audioOffloadModePreference se establece en AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector solo seleccionará una pista de audio y solo si el formato de esa pista es compatible con la descarga. Si no se admite ninguna pista de audio en la descarga, no se seleccionará ninguna pista.
    • Se inhabilitó la compatibilidad con la reproducción sin pausas para la descarga en niveles de API anteriores al 33 debido a un problema con la posición de reproducción después de la transición de la pista.
    • Se quitó el parámetro enableOffload de la firma del método DefaultRenderersFactory.buildAudioSink.
    • Quita el método DefaultAudioSink.Builder.setOffloadMode.
    • Quita el valor de intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Se agregó compatibilidad con los metadatos sin pausas de Opus durante la reproducción de descarga.
    • Se permite la recuperación del renderizador inhabilitando la descarga si falla en la primera escritura (#627).
    • Habilita la programación de delegación de forma predeterminada para la reproducción delegada solo de audio.
    • Borra ExoPlayer.experimentalSetOffloadSchedulingEnabled y AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Se cambió el nombre de onExperimentalSleepingForOffloadChanged por onSleepingForOffloadChanged y el de onExperimentalOffloadedPlayback por onOffloadedPlayback.
    • Se movieron las interfaces y definiciones de TrackSelectionParameters relacionadas con el modo de descarga de audio a una clase AudioOffloadPreferences interna.
    • Agrega devoluciones de llamada onAudioTrackInitialized y onAudioTrackReleased a AnalyticsListener, AudioRendererEventListener y AudioSink.Listener.
    • Se corrigió el problema de desbordamiento negativo del búfer de audio de DTS Express (#650).
    • Se corrigió un error por el que la verificación de capacidades de E-AC3-JOC arrojaba una IllegalArgumentException (#677).
  • Video:
    • Permite que MediaCodecVideoRenderer use un VideoFrameProcessor.Factory personalizado.
    • Se corrigió el error por el que no se podía renderizar el primer fotograma si la transmisión de audio comenzaba con marcas de tiempo negativas (#291).
  • Texto:
    • Se quita ExoplayerCuesDecoder. Las pistas de texto con sampleMimeType = application/x-media3-cues ahora se controlan directamente con TextRenderer sin necesidad de una instancia de SubtitleDecoder.
  • Metadatos:
    • Ya no se llamará a MetadataDecoder.decode para las muestras de "solo decodificación", ya que, de todos modos, la implementación debe devolver un valor nulo.
  • Efecto:
    • Agrega VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) para poner en cola la entrada de mapa de bits por marca de tiempo.
    • Cambia VideoFrameProcessor.registerInputStream() para que no genere bloqueos. Las apps deben implementar VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Se cambiaron los parámetros frameRate y durationUs de VideoFrameProcessor.queueInputBitmap a TimestampIterator.
  • Extensión IMA:
    • Se corrigió un error por el que una transmisión en vivo de DASH de varios períodos que no es el primer elemento de una playlist puede arrojar una excepción (#571).
    • Libera StreamManager antes de llamar a AdsLoader.destroy()
    • Modifica la versión del SDK de IMA a la versión 3.31.0.
  • Sesión:
    • Se configuró el comportamiento del servicio en primer plano de notificaciones como FOREGROUND_SERVICE_IMMEDIATE en DefaultMediaNotificationProvider (#167).
    • Usa solo android.media.session.MediaSession.setMediaButtonBroadcastReceiver() por encima del nivel de API 31 para evitar problemas con la API obsoleta en dispositivos Samsung (#167).
    • Usa el controlador de notificaciones de contenido multimedia como proxy para establecer los comandos disponibles y el diseño personalizado que se usa para propagar la notificación y la sesión de la plataforma.
    • Convierte los eventos de botones de contenido multimedia que recibe MediaSessionService.onStartCommand() en Media3 en lugar de enrutarlos a la sesión de la plataforma y de vuelta a Media3. Con esto, el controlador de llamadas siempre es el controlador de notificaciones de contenido multimedia, y las apps pueden reconocer fácilmente las llamadas que provienen de la notificación de la misma manera en todos los niveles de API compatibles.
    • Se corrigió un error por el que MediaController.getCurrentPosition() no avanzaba cuando se conectaba a un MediaSessionCompat heredado.
    • Agrega MediaLibrarySession.getSubscribedControllers(mediaId) para mayor comodidad.
    • Anula MediaLibrarySession.Callback.onSubscribe() para confirmar la disponibilidad del ID superior al que se suscribe el controlador. Si se realiza correctamente, se acepta la suscripción y se llama a notifyChildrenChanged() de inmediato para informar al navegador (#561).
    • Se agregó el módulo de demostración de sesiones para Automotive OS y se habilitó la demostración de sesiones para Android Auto.
    • No configures la cola de la sesión del framework cuando COMMAND_GET_TIMELINE no esté disponible para el controlador de notificaciones de contenido multimedia. Con Android Auto como el controlador del cliente que lee desde la sesión del framework, esto tiene el efecto de que no se muestra el botón queue en la IU de Android Auto (#339).
    • Se usa DataSourceBitmapLoader de forma predeterminada en lugar de SimpleBitmapLoader (#271, #327).
    • Se agregó MediaSession.Callback.onMediaButtonEvent(Intent), que permite que las apps anulen el control predeterminado de eventos de botones multimedia.
  • IU:
    • Agrega una implementación de Player.Listener para dispositivos Wear OS que controle la supresión de la reproducción debido a Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT iniciando un diálogo del sistema que permita al usuario conectar una salida de audio adecuada (p.ej., auriculares Bluetooth). El objeto de escucha reanudará automáticamente la reproducción si se conecta un dispositivo adecuado dentro de un tiempo de espera configurable (el valor predeterminado es de 5 minutos).
  • Descargas:
    • Declara el tipo de servicio en primer plano "data sync" para DownloadService para la compatibilidad con Android 14. Cuando se usa este servicio, la app también debe agregar dataSync como foregroundServiceType en el manifiesto y agregar el permiso FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Extensión HLS:
    • Actualiza la playlist en vivo de HLS con un intervalo calculado a partir de la última hora de inicio de carga en lugar de la última hora de carga completada (#663).
  • Extensión DASH:
    • Permite varios identificadores de DASH iguales en la URL de la plantilla de segmento.
    • Se agregó compatibilidad experimental para analizar subtítulos durante la extracción. Esto ofrece una mejor compatibilidad para combinar subtítulos superpuestos, lo que incluye resolver el parpadeo cuando se produce la transición entre segmentos de subtítulos. Puedes habilitar esta opción con DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Extensión RTSP:
    • Se corrigió una condición de carrera que podía generar un IndexOutOfBoundsException cuando se recurría a TCP o la reproducción se detenía en algunas situaciones.
    • Se verifica el estado en la configuración de RTSP cuando se devuelve el estado de carga de RtspMediaPeriod (#577).
    • Se ignoran los métodos de solicitud de Rtsp personalizados en el encabezado público de la respuesta de Options (#613).
    • Se usa el valor de tiempo de espera de la respuesta de configuración de RTSP en el intervalo de tiempo de envío de solicitudes de opciones de RTSP de keep-alive (#662).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
    • Se lanzó el módulo decodificador de MIDI, que admite la reproducción de archivos MIDI estándar con la biblioteca de Jsyn para sintetizar audio.
    • Se agregó DecoderOutputBuffer.shouldBeSkipped para marcar directamente los búferes de salida que no necesitan presentarse. Se prefiere este método en lugar de C.BUFFER_FLAG_DECODE_ONLY, que dejará de estar disponible.
    • Agrega Decoder.setOutputStartTimeUs y SimpleDecoder.isAtLeastOutputStartTimeUs para permitir que los decodificadores descarten las muestras de solo decodificación antes de la hora de inicio. Se debe preferir esta opción por sobre Buffer.isDecodeOnly, que quedará obsoleta.
    • Se corrigió un error que se producía cuando se publicaba el artefacto del decodificador MIDI en el repositorio de Maven. Se cambió el nombre del artefacto a media3-exoplayer-midi (#734).
  • Extensión Leanback:
    • Se corrigió un error por el que inhabilitar una plataforma podía provocar una ArithmeticException en el código de Leanback (#617).
  • Utilidades de prueba:
    • Haz que TestExoPlayerBuilder y FakeClock sean compatibles con las pruebas de IU de Espresso y las pruebas de IU de Compose. Esto corrige un error por el que la reproducción avanza de forma no determinística durante las interacciones de vista de Espresso o Compose.
  • Se quitan los símbolos obsoletos:
    • Quita TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) y TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). En su lugar, usa Composition.Builder.setHdrMode(int) y pasa el Composition a Transformer.start(Composition, String).
    • Se quitó el método DownloadNotificationHelper.buildProgressNotification obsoleto. En su lugar, usa un método no obsoleto que tome un parámetro notMetRequirements.

Versión 1.2.0-rc01

1 de noviembre de 2023

Usa la versión estable 1.2.0.

Versión 1.2.0-beta01

19 de octubre de 2023

Usa la versión estable 1.2.0.

Versión 1.2.0-alpha02

29 de septiembre de 2023

Usa la versión estable 1.2.0.

Versión 1.2.0-alpha01

17 de agosto de 2023

Usa la versión estable 1.2.0.

Versión 1.1.0

Versión 1.1.1

16 de agosto de 2023

  • Biblioteca común:
    • Se quitó la dependencia multidex que se agregó accidentalmente de todos los módulos (#499).
  • ExoPlayer:
    • Se corrigió un problema en PlaybackStatsListener por el que se creaban PlaybackStats falsos después de borrar la playlist.
    • Se agregaron campos adicionales al registro de datos de clientes de contenido multimedia común (CMCD): formato de transmisión (sf), tipo de transmisión (st), versión (v), tasa de bits superior (tb), duración del objeto (d), capacidad de procesamiento medida (mtp) y tipo de objeto (ot) (#8699).
  • Audio:
    • Se corrigió un error por el que Player.getState() nunca pasaba a STATE_ENDED cuando se reproducían archivos muy cortos (#538).
  • Descarga de audio:
    • Antepón las páginas de encabezado de ID de Ogg y de encabezado de comentarios al flujo de bits para la reproducción de Opus descargada de acuerdo con el RFC 7845.
  • Video:
    • H.265/HEVC: Se corrigió el análisis de la información de imágenes de referencia a corto y largo plazo de SPS.
  • Texto:
    • CEA-608: Se cambió la lógica de truncamiento de indicaciones para que solo se considere el texto visible. Anteriormente, se incluían la sangría y el desplazamiento de tabulación cuando se limitaba la longitud de la indicación a 32 caracteres (lo que era técnicamente correcto según la especificación) (#11019).
  • Extensión IMA:
    • Se actualizó la versión del SDK de IMA a la 3.30.3.
  • Sesión:
    • Agrega un diseño personalizado al estado del controlador y proporciona un método get para acceder a él. Cuando cambia el diseño personalizado, se llama a MediaController.Listener.onCustomLayoutChanged. Las apps que quieran enviar diferentes diseños personalizados a distintos controladores de Media3 pueden hacerlo en MediaSession.Callback.onConnect con un AcceptedResultBuilder para asegurarse de que el diseño personalizado esté disponible para el controlador cuando se complete la conexión.
    • Se corrigieron los casos en los que MediaLibraryServiceLegacyStub enviaba un error a un Result que no lo admitía, lo que producía un UnsupportedOperationException (#78).
    • Se corrigió la forma en que PlayerWrapper crea un VolumeProviderCompat determinando volumeControlType a través de comandos heredados (COMMAND_ADJUST_DEVICE_VOLUME y COMMAND_SET_DEVICE_VOLUME) y comandos nuevos (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS y COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Versión 1.1.0

5 de julio de 2023

  • Biblioteca común:
    • Agrega un motivo de supresión para la ruta de audio inadecuada y reproduce cuando esté lista. Cambia el motivo de la supresión por demasiado tiempo. (#15).
    • Agrega comandos a Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Se agregaron métodos sobrecargados a Player que permiten a los usuarios especificar marcas de volumen:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Se agregó Builder para DeviceInfo y se dio de baja el constructor existente.
    • Agrega DeviceInfo.routingControllerId para especificar el ID del controlador de enrutamiento para las reproducciones remotas.
    • Se agregó Player.replaceMediaItem(s) como un acceso directo para agregar y quitar elementos en la misma posición (#8046).
  • ExoPlayer:
    • Permite que ExoPlayer controle los métodos de volumen del dispositivo solo si se habilita de forma explícita. Usa ExoPlayer.Builder.setDeviceVolumeControlEnabled para tener acceso a lo siguiente:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) y setDeviceVolume(int, int)
      • increaseDeviceVolume(int) y increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) y decreaseDeviceVolume(int, int)
    • Se agregó FilteringMediaSource, que permite filtrar los tipos de pistas disponibles de un MediaSource.
    • Se agregó compatibilidad para incluir datos comunes de clientes multimedia (CMCD) en las solicitudes salientes de los formatos de transmisión adaptable DASH, HLS y SmoothStreaming. Se incorporaron los siguientes campos: br, bl, cid, rtp y sid (#8699). Estructura de la API y métodos de la API:
      • El registro de CMCD está inhabilitado de forma predeterminada. Usa MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) para habilitarlo.
      • Todas las claves están habilitadas de forma predeterminada. Anula CmcdConfiguration.RequestConfig.isKeyAllowed(String key) para filtrar las claves que se registran.
      • Anula CmcdConfiguration.RequestConfig.getCustomData() para habilitar el registro de claves personalizadas.
    • Se agregó una acción adicional al manifiesto de la demostración principal para facilitar el inicio de la app de demostración con un archivo *.exolist.json personalizado (#439).
    • Agrega ExoPlayer.setVideoEffects() para usar Effect durante la reproducción de video.
    • Actualiza SampleQueue para almacenar sourceId como un long en lugar de un int. Esto cambia las firmas de los métodos públicos SampleQueue.sourceId y SampleQueue.peekSourceId.
    • Agrega parámetros a los métodos shouldStartPlayback y onTracksSelected de LoadControl que permitan asociar estos métodos con el MediaPeriod pertinente.
    • Cambia la firma de ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) agregando un parámetro de cronograma que contenga los períodos con los UID usados como claves en el mapa. Esto es necesario para evitar problemas de simultaneidad con las transmisiones en vivo de varios períodos.
    • Se dio de baja EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) y BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). En su lugar, se puede llamar a la variante de los métodos sin el mediaTimeOffsetUs. Ten en cuenta que, incluso para las variantes obsoletas, el desplazamiento ya no se agrega a startTimeUs ni a endTimeUs de los objetos MediaLoadData que envía el despachador.
    • Se cambió el nombre de ExoTrackSelection.blacklist por excludeTrack y el de isBlacklisted por isTrackExcluded.
    • Se corrigió el comportamiento incoherente entre ExoPlayer.setMediaItem(s) y addMediaItem(s) cuando se llama a una lista de reproducción vacía.
  • Transformador:
    • Se quita Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). En su lugar, usa ExoPlayerAssetLoader.Factory(MediaSource.Factory) y Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Se quita Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Se corrigió un error por el que la transformación podía bloquearse (lo que generaba un tiempo de espera del multiplexor) si se indicaba el final de la transmisión de video en el momento en que un fotograma de entrada estaba pendiente de procesamiento.
    • Consulta los códecs a través de MediaCodecList en lugar de usar las utilidades de findDecoder/EncoderForFormat para expandir la compatibilidad.
    • Se quitó la configuración de fotogramas B en DefaultEncoderFactory porque no funciona en algunos dispositivos.
  • Selección de pistas:
    • Se agregó DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, que está inhabilitado de forma predeterminada. Cuando se habilita, DefaultTrackSelector activará una nueva selección de pistas cuando cambien las capacidades del renderizador.
  • Extractores:
    • Ogg: Se corrigió un error que se producía cuando se buscaba en archivos de larga duración (#391).
    • FMP4: Se corrigió un problema por el que TimestampAdjuster inicializaba un desplazamiento de marca de tiempo incorrecto con el tiempo de muestra de metadatos del átomo emsg (#356).
  • Audio:
    • Se corrigió un error por el que algunas reproducciones fallaban cuando se habilitaba la tunelización y se activaban los AudioProcessors, p.ej., para el recorte sin pausas (#10847).
    • Encapsula los fotogramas de Opus en paquetes de Ogg en reproducciones directas (descarga).
    • Extrapola la posición actual durante la suspensión con la programación de descarga.
    • Agrega Renderer.release() y AudioSink.release() para liberar los recursos al final del ciclo de vida del reproductor.
    • Detecta cambios en las capacidades de audio en DefaultAudioSink. Agrega un parámetro obligatorio context en el constructor de DefaultAudioSink, con el que DefaultAudioSink se registrará como el objeto de escucha de AudioCapabilitiesReceiver y actualizará su propiedad audioCapabilities cuando se le informe un cambio de capacidades.
    • Propaga los cambios en las capacidades de audio a través de un evento nuevo onAudioCapabilitiesChanged en la interfaz AudioSink.Listener y una interfaz nueva RendererCapabilities.Listener que activa eventos onRendererCapabilitiesChanged.
    • Se agregó ChannelMixingAudioProcessor para aplicar el escalamiento y la mezcla a los canales de audio.
    • Agrega el nuevo valor int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons para descartar el decodificador de audio cuando sea posible el modo de omisión después de que cambien las capacidades de audio.
    • Se agregó compatibilidad con la reproducción directa para DTS Express y DTS:X (#335).
  • Video:
    • Haz que MediaCodecVideoRenderer informe un VideoSize con un ancho y una altura de 0 cuando el renderizador esté inhabilitado. Se llama a Player.Listener.onVideoSizeChanged según corresponda cuando cambia Player.getVideoSize(). Con este cambio, el tamaño del video de ExoPlayer con MediaCodecVideoRenderer tiene un ancho y una altura de 0 cuando Player.getCurrentTracks no admite video o aún no se determina el tamaño de la pista de video compatible.
  • DRM:
    • Se redujo la visibilidad de varios métodos de solo uso interno en DefaultDrmSession que no se espera que se llamen desde fuera del paquete de DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Se agregó una nueva biblioteca de multiplexores que se puede usar para crear un archivo contenedor MP4.
  • Extensión IMA:
    • Habilita las transmisiones en vivo de DASH de varios períodos para la DAI. Ten en cuenta que la implementación actual aún no admite la búsqueda en transmisiones en vivo (#10912).
    • Se corrigió un error por el que se insertaba un grupo de anuncios nuevo en las transmisiones en vivo porque la posición del contenido calculada en las líneas de tiempo consecutivas variaba ligeramente.
  • Sesión:
    • Agrega el método auxiliar MediaSession.getControllerForCurrentRequest para obtener información sobre el controlador que llama a un método Player en ese momento.
    • Se agregó androidx.media3.session.MediaButtonReceiver para permitir que las apps implementen la reanudación de la reproducción con eventos de botones de contenido multimedia enviados, por ejemplo, por auriculares Bluetooth (#167).
    • Se agregó la implementación predeterminada a MediaSession.Callback.onAddMediaItems para permitir que los MediaItems solicitados se pasen a Player si tienen LocalConfiguration (p.ej., URI) (#282).
    • Se agregaron los botones de comando "buscar anterior" y "buscar siguiente" en la vista de notificación de contenido multimedia compacta de forma predeterminada para Android 12 y versiones anteriores (#410).
    • Se agregó la implementación predeterminada a MediaSession.Callback.onAddMediaItems para permitir que los MediaItems solicitados se pasen a Player si tienen LocalConfiguration (p.ej., URI) (#282).
    • Se agregaron los botones de comando "buscar anterior" y "buscar siguiente" en la vista de notificación de contenido multimedia compacta de forma predeterminada para Android 12 y versiones anteriores (#410).
  • IU:
    • Agrega los métodos de utilidad shouldShowPlayButton y handlePlayPauseButtonAction para escribir elementos de la IU personalizados con un botón de reproducción/pausa.
  • Extensión RTSP:
    • Para MPEG4-LATM, usa el valor predeterminado de profile-level-id si no está presente en el mensaje de SDP de respuesta de descripción (#302).
    • Se usa el URI base para la resolución de rutas de acceso relativas de la sesión de RTSP si está presente en el encabezado de respuesta DESCRIBE (#11160).
  • Extensión DASH:
    • Quita la compensación de tiempo de contenido multimedia de MediaLoadData.startTimeMs y MediaLoadData.endTimeMs para las transmisiones de DASH de varios períodos.
    • Se corrigió un error por el que volver a preparar una fuente de contenido multimedia de DASH en vivo de varios períodos producía una IndexOutOfBoundsException (#10838).
  • Extensión HLS:
    • Agrega HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) para establecer un tiempo de espera para que el subproceso de carga espere a que se inicialice TimestampAdjuster. Si la inicialización no se completa antes del tiempo de espera, se arroja un PlaybackException para evitar que la reproducción se detenga de forma indefinida. El tiempo de espera se establece en cero de forma predeterminada (#323).
  • Utilidades de prueba:
    • Verifica que el esquema de URI no distinga mayúsculas de minúsculas en DataSourceContractTest.
  • Se quitan los símbolos obsoletos:
    • Se quitan los constructores DefaultAudioSink y se usa DefaultAudioSink.Builder en su lugar.
    • Quita HlsMasterPlaylist y usa HlsMultivariantPlaylist en su lugar.
    • Se quita Player.stop(boolean). En su lugar, usa Player.stop() y Player.clearMediaItems() (si reset es true).
    • Se quitaron dos constructores SimpleCache obsoletos. En su lugar, usa un constructor no obsoleto que tome un DatabaseProvider para obtener un mejor rendimiento.
    • Se quitó el constructor DefaultBandwidthMeter. En su lugar, se usa DefaultBandwidthMeter.Builder.
    • Se quitan los constructores DefaultDrmSessionManager y se usa DefaultDrmSessionManager.Builder en su lugar.
    • Se quitaron dos constructores HttpDataSource.InvalidResponseCodeException obsoletos. Usa un constructor no obsoleto que acepte campos adicionales(cause, responseBody) para mejorar el registro de errores.
    • Quita DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash y DownloadHelper.forSmoothStreaming, y usa DownloadHelper.forMediaItem en su lugar.
    • Se quitó el constructor DownloadService obsoleto. Usa un constructor no obsoleto que incluya la opción de proporcionar un parámetro channelDescriptionResourceId.
    • Se quitaron las constantes de cadena obsoletas para los conjuntos de caracteres (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME y UTF16LE_NAME). En su lugar, usa los conjuntos de caracteres de Kotlin del paquete kotlin.text, java.nio.charset.StandardCharsets o com.google.common.base.Charsets.
    • Se quitó el constructor WorkManagerScheduler obsoleto. En su lugar, usa un constructor no obsoleto que incluya la opción de proporcionar un parámetro Context.
    • Quita los métodos obsoletos createVideoSampleFormat, createAudioSampleFormat, createContainerFormat y createSampleFormat, que se usaban para crear una instancia de la clase Format. En su lugar, usa Format.Builder para crear instancias de Format.
    • Se quitaron los métodos obsoletos copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate y copyWithVideoSize. En su lugar, usa Format.buildUpon() y métodos set.
    • Se quitó ExoPlayer.retry(), que dejó de estar disponible. En su lugar, usa prepare().
    • Se quitó el constructor DefaultTrackSelector obsoleto de cero argumentos. En su lugar, usa DefaultTrackSelector(Context).
    • Se quitó el constructor OfflineLicenseHelper obsoleto. En su lugar, usa OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Se quitó el constructor DownloadManager obsoleto. En su lugar, usa el constructor que toma un Executor.
    • Se quitaron los constructores Cue obsoletos. En su lugar, usa Cue.Builder.
    • Se quitó el constructor OfflineLicenseHelper obsoleto. En su lugar, usa OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Se quitaron cuatro métodos AnalyticsListener obsoletos:
      • onDecoderEnabled, usa onAudioEnabled o onVideoEnabled en su lugar.
      • onDecoderInitialized, usa onAudioDecoderInitialized o onVideoDecoderInitialized en su lugar.
      • onDecoderInputFormatChanged, usa onAudioInputFormatChanged o onVideoInputFormatChanged en su lugar.
      • onDecoderDisabled, usa onAudioDisabled o onVideoDisabled en su lugar.
    • Quita los elementos obsoletos Player.Listener.onSeekProcessed y AnalyticsListener.onSeekProcessed, y usa onPositionDiscontinuity con DISCONTINUITY_REASON_SEEK en su lugar.
    • Quita ExoPlayer.setHandleWakeLock(boolean) y usa setWakeMode(int) en su lugar.
    • Se quitó DefaultLoadControl.Builder.createDefaultLoadControl(), que dejó de estar disponible. En su lugar, usa build().
    • Se quitó MediaItem.PlaybackProperties, que dejó de estar disponible. En su lugar, usa MediaItem.LocalConfiguration. El campo obsoleto MediaItem.playbackProperties ahora es del tipo MediaItem.LocalConfiguration.

Versión 1.1.0-rc01

21 de junio de 2023

Usa la versión estable 1.1.0.

Versión 1.1.0-beta01

7 de junio de 2023

Usa la versión estable 1.1.0.

Versión 1.1.0-alpha01

10 de mayo de 2023

Usa la versión estable 1.1.0.

Versión 1.0.0

Versión 1.0.2

18 de mayo de 2023

Lanzamiento de androidx.media3:media3-*:1.0.2. La versión 1.0.2 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.7.

Esta versión contiene los siguientes cambios desde la versión 1.0.1:

  • Biblioteca principal:
    • Se agregó Buffer.isLastSample(), que indica si Buffer contiene la marca C.BUFFER_FLAG_LAST_SAMPLE.
    • Se corrigió un problema por el que es posible que no se renderice el último fotograma si la última muestra con fotogramas se quita de la cola sin leer la muestra de "fin de transmisión". (#11079).
  • Extractores:
    • Se corrigió el análisis de SPS H.265 en archivos MPEG-TS reutilizando la lógica de análisis que ya usan los extractores RTSP y MP4 (#303).
  • Texto:
    • SSA: Se agregó compatibilidad con archivos UTF-16 si comienzan con una marca de orden de bytes (#319).
  • Sesión:
    • Se corrigió un problema por el que MediaController no actualizaba sus comandos disponibles cuando se conectaba a un MediaSessionCompat heredado que actualizaba sus acciones.
    • Se corrigió el error que impedía que MediaLibraryService devolviera un valor nulo para una llamada de la IU del sistema a Callback.onGetLibraryRoot con params.isRecent == true en el nivel de API 30 (#355).
    • Se corrigió la fuga de memoria de MediaSessionService o MediaLibraryService (#346).
    • Se corrigió un error por el que una actualización combinada de Timeline y posición en un MediaSession podía hacer que un MediaController arrojara una IllegalStateException.

Versión 1.0.1

18 de abril de 2023

Lanzamiento de androidx.media3:media3-*:1.0.1. La versión 1.0.1 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.6.

  • Biblioteca principal:
    • Se restablece la anulación de la transmisión en vivo de destino cuando se busca la posición predeterminada (#11051).
    • Se corrigió un error por el que los flujos de muestras vacíos en el contenido multimedia podían provocar que se detuviera la reproducción.
  • Sesión:
    • Se corrigió un error por el que varios elementos de cola idénticos publicados por un MediaSessionCompat heredado generaban una excepción en MediaController (#290).
    • Se agregó el reenvío faltante de MediaSession.broadcastCustomCommand al MediaControllerCompat.Callback.onSessionEvent heredado (#293).
    • Se corrigió un error por el que la llamada a MediaSession.setPlayer no actualizaba los comandos disponibles.
    • Se corrigió un problema por el que se ignoraban las instancias de TrackSelectionOverride enviadas desde un MediaController si hacían referencia a un grupo con Format.metadata (#296).
    • Se corrigió un problema por el que Player.COMMAND_GET_CURRENT_MEDIA_ITEM debía estar disponible para acceder a los metadatos a través de la MediaSessionCompat heredada.
    • Se corrigió un problema por el que las instancias de MediaSession en un subproceso en segundo plano causaban fallas cuando se usaban en MediaSessionService (#318).
    • Se corrigió un problema por el que la biblioteca declaraba un receptor de botones de contenido multimedia sin que la app lo hubiera previsto (#314).
  • DASH:
    • Se corrigió el manejo de las líneas de tiempo de segmentos vacíos (#11014).
  • RTSP:
    • Se reintenta con TCP si la configuración de RTSP con UDP falla con el error 461 de RTSP UnsupportedTransport (#11069).

Versión 1.0.0

22 de marzo de 2023

Lanzamiento de androidx.media3:media3-*:1.0.0. La versión 1.0.0 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.5.

No hay cambios desde la versión 1.0.0-rc02.

Versión 1.0.0-rc02

2 de marzo de 2023

Lanzamiento de androidx.media3:media3-*:1.0.0-rc02. La versión 1.0.0-rc02 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.4.

  • Biblioteca principal:
    • Se corrigió la detección del tipo de red en el nivel de API 33 (#10970).
    • Se corrigió el error NullPointerException que se producía cuando se llamaba a ExoPlayer.isTunnelingEnabled (#10977).
  • Descargas:
    • Se hizo configurable la diferencia máxima de la hora de inicio de dos segmentos que se combinarán en SegmentDownloader y subclases (#248).
  • Audio:
    • Se corrigió la reproducción de MP3 sin pausas en dispositivos Samsung (#8594).
    • Se corrigió un error por el que las velocidades de reproducción establecidas inmediatamente después de inhabilitar el audio podían anularse por un cambio de velocidad anterior (#10882).
  • Video:
    • Asigna el formato HEVC HDR10 a HEVCProfileMain10HDR10 en lugar de HEVCProfileMain10.
    • Se agregó una solución alternativa para un problema del dispositivo en Chromecast con Google TV y Lenovo M10 FHD Plus que hace que las transmisiones AVC de 60 fps se marquen como no compatibles (#10898).
    • Se corrigieron los problemas de rendimiento de la liberación de fotogramas cuando se reproduce contenido multimedia con una velocidad de fotogramas mucho más alta que la frecuencia de actualización de la pantalla.
  • Transmisión:
    • Se corrigió el error STATE_IDLE transitorio que se producía durante la transición entre elementos multimedia (#245).
  • RTSP:
    • Se detecta la IllegalArgumentException que se arroja en el análisis de los mensajes de respuesta DESCRIBE de RTSP no válidos (#10971).
  • Sesión:
    • Se corrigió un error por el que el botón de reproducción/pausa de la notificación no se actualizaba con el estado del reproductor (#192).
  • Extensión IMA:
    • Se corrigió un error que impedía que se iniciaran las transmisiones de DAI sin anuncios porque no se recibía el primer evento LOADED (y, en el caso sin anuncios, el único).

Versión 1.0.0-rc01

16 de febrero de 2023

Lanzamiento de androidx.media3:media3-*:1.0.0-rc01. La versión 1.0.0-rc01 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.3.

  • Biblioteca principal:
    • Modifica la lógica de ordenamiento del decodificador del renderizador para mantener las preferencias de MediaCodecSelector, incluso si un decodificador informa que no puede reproducir el contenido multimedia de forma eficiente. Por ejemplo, con el selector predeterminado, se preferirá el decodificador de hardware con compatibilidad funcional en lugar del decodificador de software que es totalmente compatible con el formato (#10604).
    • Agrega ExoPlayer.Builder.setPlaybackLooper que establezca un subproceso de reproducción preexistente para una instancia nueva de ExoPlayer.
    • Permite que se borren los asistentes del administrador de descargas (#10776).
    • Agrega el parámetro a BasePlayer.seekTo para indicar también el comando que se usó en el salteo.
    • Usa el tema cuando cargues elementos de diseño en el nivel de API 21 o uno superior (#220).
    • Agrega ConcatenatingMediaSource2, que permite combinar varios elementos multimedia en una sola ventana (#247).
  • Extractores:
    • Arroja una ParserException en lugar de una NullPointerException si a la tabla de ejemplo (stbl) le falta una descripción de ejemplo obligatoria (stsd) cuando se analizan los átomos tipo trak.
    • Omite correctamente las muestras cuando se saltea directamente a un marco de sincronización en fMP4 (#10941).
  • Audio:
    • Usa la tasa de bits de formato de audio comprimido para calcular el tamaño mínimo del búfer de AudioTrack en las reproducciones directas (transferencia).
  • Texto:
    • Corrige TextRenderer pasando un índice no válido (negativo) a Subtitle.getEventTime si un archivo de subtítulos no contiene indicadores.
    • SubRip: Agrega compatibilidad con archivos UTF-16 si comienzan con una marca de orden de bytes.
  • Metadatos:
    • Analiza varios valores separados por valores nulos de los marcos de ID3, como lo permite ID3 v2.4.
    • Agrega MediaMetadata.mediaType para indicar el tipo de contenido o el tipo de carpeta que se describe en los metadatos.
    • Agrega MediaMetadata.isBrowsable como reemplazo de MediaMetadata.folderType. El tipo de carpeta dejará de estar disponible en la próxima versión.
  • DASH:
    • Agrega el análisis completo de los conjuntos de adaptación de imagen, incluida la cantidad de mosaicos (#3752).
  • IU:
    • Corrige el PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) que dejó de estar disponible para garantizar que se pasen los cambios de visibilidad al objeto de escucha registrado (#229).
    • Corrige el orden de los controles centrales del reproductor en PlayerView cuando se usa un diseño de derecha a izquierda (RTL) (#227).
  • Sesión:
    • Agrega un SimpleBasePlayer abstracto para ayudar a implementar la interfaz Player en reproductores personalizados.
    • Agrega un método auxiliar para convertir el token de sesión de la plataforma en SessionToken de Media3 (#171).
    • Usa onMediaMetadataChanged para activar las actualizaciones de la sesión multimedia de la plataforma (#219).
    • Agrega la sesión multimedia como argumento de getMediaButtons() del DefaultMediaNotificationProvider y usa listas inmutables para brindar mayor claridad (#216).
    • Agrega el objeto de escucha de devolución de llamada onSetMediaItems para brindar medios y así modificar o establecer la lista MediaItem, el índice de inicio y la posición por sesión antes de configurar el reproductor (#156).
    • Evita la detección de una presión doble para eventos de botones de contenido multimedia que no son Bluetooth (#233).
    • Hace que QueueTimeline sea más sólido en caso de un estado de sesión heredado con sombreado (#241).
  • Metadatos:
    • Analiza varios valores separados por valores nulos de los marcos de ID3, como lo permite ID3 v2.4.
    • Agrega MediaMetadata.mediaType para indicar el tipo de contenido o el tipo de carpeta que se describe en los metadatos.
    • Agrega MediaMetadata.isBrowsable como reemplazo de MediaMetadata.folderType. El tipo de carpeta dejará de estar disponible en la próxima versión.
  • Extensión Cast:
    • Modifica la versión del SDK de Cast a 21.2.0.
  • Extensión IMA:
    • Quita el objeto de escucha del reproductor de ImaServerSideAdInsertionMediaSource en el subproceso de la aplicación para evitar problemas relacionados con los subprocesos.
    • Agrega una propiedad focusSkipButtonWhenAvailable a ImaServerSideAdInsertionMediaSource.AdsLoader.Builder para solicitar que se enfoque el botón Omitir en dispositivos de TV y establécelo como verdadero de forma predeterminada.
    • Agrega un método focusSkipButton() a ImaServerSideAdInsertionMediaSource.AdsLoader para solicitar de manera programática que se enfoque el botón Omitir.
    • Modifica la versión del SDK de IMA a la versión 3.29.0.
  • App de demo:
    • Solicita el permiso de notificaciones para descargar notificaciones durante el tiempo de ejecución (#10884).

Versión 1.0.0-beta03

22 de noviembre de 2022

Lanzamiento de androidx.media3:media3-*:1.0.0-beta03. La versión 1.0.0-beta03 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.2.

  • Biblioteca principal:
    • Se agregó ExoPlayer.isTunnelingEnabled a fin de verificar si la tunelización está habilitada para las pistas seleccionadas actualmente (#2518).
    • Se agregó WrappingMediaSource para simplificar la unión de un solo MediaSource (#7279).
    • Descarta el búfer de retroceso antes de que la reproducción se detenga debido a que la memoria disponible es insuficiente.
    • Cierra el bloque de seguimiento "doSomeWork" cuando se habilita la descarga.
    • Se corrigió el problema del seguimiento de sesión con búsquedas rápidas en PlaybackStatsListener (#180).
    • Se envía la devolución de llamada onMediaItemTransition faltante cuando se llama a seekToNext o seekToPrevious en una lista de reproducción de un solo elemento (#10667).
    • Se agrega Player.getSurfaceSize que muestra el tamaño de la superficie en la que se renderiza el video.
    • Se corrigió un error por el que la eliminación de objetos de escucha durante la versión del reproductor podía provocar una IllegalStateException (#10758).
  • Compilación:
    • Se aplicó una compileSdkVersion mínima para evitar errores de compilación (#10684).
    • Evita el bloque de publicación cuando se incluye en otra compilación de Gradle.
  • Selección de pistas:
    • Prefiere otras pistas en lugar de Dolby Vision si la pantalla no las admite (#8944)
  • Descargas:
    • Se corrigió el posible bucle infinito en ProgressiveDownloader que generaba la descarga y la reproducción simultánea con el mismo PriorityTaskManager (#10570).
    • Se muestra la notificación de descarga de inmediato (#183).
    • Limita las eliminaciones de descargas paralelas a 1 para evitar la creación excesiva de subprocesos (#10458).
  • Video:
    • Prueba el decodificador alternativo para Dolby Vision si la pantalla no lo admite (#9794).
  • Audio:
    • Usa SingleThreadExecutor para liberar instancias de AudioTrack y evitar errores de OutOfMemory cuando se lanzan varios jugadores al mismo tiempo (#10057).
    • Agrega AudioOffloadListener.onExperimentalOffloadedPlayback para el estado de transferencia de AudioTrack (#134).
    • Hace que AudioTrackBufferSizeProvider sea una interfaz pública.
    • Se agregó ExoPlayer.setPreferredAudioDevice para establecer el dispositivo de salida de audio preferido (#135).
    • Se cambia el nombre de androidx.media3.exoplayer.audio.AudioProcessor a androidx.media3.common.audio.AudioProcessor.
    • Mapea el audio de 8 canales y el de 12 canales a las máscaras de canal 7.1 y 7.1.4, respectivamente, en todas las versiones de Android (#10701).
  • Metadatos:
    • MetadataRenderer ahora se puede configurar para procesar metadatos apenas estén disponibles. Crea una instancia con MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) para especificar si el procesador mostrará los metadatos antes o de forma sincronizada con la posición del reproductor.
  • DRM:
    • Soluciona un error en la implementación de ClearKey de Android 13 que muestra una URL de licencia no vacía, pero no válida.
    • Corrige el error setMediaDrmSession failed: session not opened cuando se alterna entre esquemas DRM en una lista de reproducción (p. ej., de Widevine a ClearKey).
  • Texto:
    • CEA-608: Garantiza que los comandos de cambio de servicio en el campo 2 se manejen de forma correcta (#10666).
  • DASH:
    • Se analiza EventStream.presentationTimeOffset de los manifiestos (#10460).
  • IU:
    • Usa las anulaciones actuales del reproductor como ajuste predeterminado en TrackSelectionDialogBuilder (#10429).
  • Sesión:
    • Garantiza que los comandos siempre se ejecuten en el orden correcto, incluso si algunos requieren resolución asíncrona (#85).
    • Agrega DefaultMediaNotificationProvider.Builder para compilar instancias de DefaultMediaNotificationProvider. El compilador puede configurar el ID de la notificación, el ID del canal de notificaciones y el nombre del canal de notificaciones que usa el proveedor. Además, agrega el método DefaultMediaNotificationProvider.setSmallIcon(int) para configurar el ícono pequeño de notificaciones (#104).
    • Garantiza que los comandos enviados antes de MediaController.release() no se descarten (#99).
    • SimpleBitmapLoader puede cargar mapa de bits a partir de URI de file:// (#108).
    • Se corrigió la aserción que impide que MediaController busque un anuncio en un período (#122).
    • Cuando finaliza la reproducción, se detiene MediaSessionService desde el primer plano y se muestra una notificación para reiniciar la reproducción del último elemento multimedia reproducido (#112).
    • No se inicia un servicio en primer plano con un intent pendiente para pausar (#167).
    • Oculta manualmente la "insignia" asociada con la notificación que creó DefaultNotificationProvider en el nivel de API 26 y 27 (la insignia se oculta de forma automática en el nivel API 28 y posteriores) (#131).
    • Se corrigió un error por el que una segunda conexión de Binder de una MediaSession heredada a un MediaController de Media3 ocasiona IllegalStateExceptions (#49).
  • RTSP:
    • Se agregó el manejo de paquetes fragmentados de H263 (#119).
    • Se agregó compatibilidad con MP4A-LATM (#162).
  • IMA:
    • Se agregó tiempo de espera para cargar la información del anuncio y manejar casos en los que el SDK de IMA se atasca cuando se carga un anuncio (#10510).
    • Se evita la omisión de los anuncios durante el video cuando se busca al final del contenido (#10685).
    • Se calcula de forma correcta la duración del período para las transmisiones en vivo con anuncios insertados en el servidor, por ejemplo, la DAI de IMA (#10764).
  • Extensión FFmpeg:
    • Agrega las nuevas marcas obligatorias para vincular las bibliotecas FFmpeg con el NDK 23.1.7779620 y versiones posteriores (#9933).
  • Extensión AV1:
    • Se actualizó la versión de CMake para evitar incompatibilidades con las versiones más recientes de Android Studio (#9933).
  • Extensión Cast:
    • Implementa getDeviceInfo() para poder identificar CastPlayer cuando se controla la reproducción con un MediaController (#142).
  • Transformador:
    • Se agregó el temporizador del perro guardián del combinador para detectar cuándo la generación de una muestra de salida es demasiado lenta.
  • Se quitan los símbolos obsoletos:
    • Se quita Transformer.Builder.setOutputMimeType(String). Se quitó esta función. El tipo de MIME siempre será MP4 cuando se use el combinador predeterminado.

Versión 1.0.0-beta02

21 de julio de 2022

Lanzamiento de androidx.media3:media3-*:1.0.0-beta02. La versión 1.0.0-beta02 contiene estas confirmaciones.

Esta versión corresponde a la versión de ExoPlayer 2.18.1.

  • Biblioteca principal:
    • Asegúrate de que, si cambias ShuffleOrder con ExoPlayer.setShuffleOrder, se genere una llamada a Player.Listener#onTimelineChanged con reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Para los medios progresivos, incluye solo las pistas seleccionadas en la posición de almacenamiento en búfer (#10361).
    • Se permite el registrador personalizado para todos los resultados de registro de ExoPlayer (#9752).
    • Se corrigió la implementación de setDataSourceFactory en DefaultMediaSourceFactory, que no funcionaba en algunos casos (#116).
  • Extractores:
    • Se corrigió el análisis de conjuntos de imágenes de referencia a corto plazo de H265 (#10316).
    • Se corrigió el análisis de las tasas de bits de los cuadros esds (#10381).
  • DASH:
    • Se analizan las URLs de licencia de ClearKey de los manifiestos (#10246).
  • IU:
    • Asegúrate de que TalkBack anuncie la opción de velocidad actualmente activa en el menú de controles de reproducción (#10298).
  • RTSP:
    • Se agregó el manejo de paquetes fragmentados de VP8 (#110).
  • Extensión Leanback:
    • Escucha los cambios de playWhenReady en LeanbackAdapter (10420).
  • Transmisión:
    • Usa el MediaItem que se haya pasado a los métodos de la lista de reproducción como Window.mediaItem en CastTimeline (#25, #8212).
    • Se admiten Player.getMetadata() y Listener.onMediaMetadataChanged() con CastPlayer (#25).

Versión 1.0.0-beta01

16 de junio de 2022

Lanzamiento de androidx.media3:media3-*:1.0.0-beta01. La versión 1.0.0-beta01 contiene estas confirmaciones.

Esto corresponde a la versión 2.18.0 de ExoPlayer.

  • Biblioteca principal:
    • Habilita la compatibilidad con el diagnóstico de la plataforma de Android a través de MediaMetricsManager. ExoPlayer reenviará eventos de reproducción y datos de rendimiento a la plataforma, lo que ayuda a proporcionar información de rendimiento y depuración del sistema en el dispositivo. Google también puede recopilar estos datos si el usuario del dispositivo habilita compartir los datos de uso y diagnóstico. Las apps pueden inhabilitar la opción de contribuir al diagnóstico de la plataforma para ExoPlayer con ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Se corrigió el error por el que las pistas se restablecen con demasiada frecuencia cuando se usa MergingMediaSource, por ejemplo, cuando se transfieren subtítulos y se cambia el subtítulo seleccionado durante la reproducción (#10248).
    • Ya no se detecta el tipo de red 5G-NSA en las API 29 y 30. Estas reproducciones supondrán que la red es 4G.
    • No permite que se pase null a MediaSource.Factory.setDrmSessionManagerProvider ni MediaSource.Factory.setLoadErrorHandlingPolicy. Las instancias de DefaultDrmSessionManagerProvider y DefaultLoadErrorHandlingPolicy se pueden pasar de forma explícita si es necesario.
    • Se agregó MediaItem.RequestMetadata para representar los metadatos necesarios a fin de reproducir contenido multimedia cuando no se conoce el LocalConfiguration exacto. También se quitó MediaMetadata.mediaUrl, ya que ahora se incluye en RequestMetadata.
    • Se agregó Player.Command.COMMAND_SET_MEDIA_ITEM para permitir que los jugadores dejen configurar un solo elemento.
  • Selección de pistas:
    • Se compactó la clase TrackSelectionOverrides en TrackSelectionParameters y promueve TrackSelectionOverride a una clase de nivel superior.
    • Se cambió el nombre de TracksInfo por Tracks y el de TracksInfo.TrackGroupInfo por Tracks.Group. También se cambió el nombre de Player.getCurrentTracksInfo y Player.Listener.onTracksInfoChanged por Player.getCurrentTracks y Player.Listener.onTracksChanged. Esto incluye "anular la baja" del nombre del método Player.Listener.onTracksChanged, pero con diferentes tipos de parámetros.
    • Se cambió DefaultTrackSelector.buildUponParameters y DefaultTrackSelector.Parameters.buildUpon para mostrar DefaultTrackSelector.Parameters.Builder en lugar de DefaultTrackSelector.ParametersBuilder, que dejó de estar disponible.
    • Se agregó DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, que está habilitado de forma predeterminada. Cuando se habilite, DefaultTrackSelector preferirá pistas de audio cuyo recuento de canales no supere las capacidades de salida del dispositivo. En dispositivos de mano, DefaultTrackSelector preferirá los formatos estéreo o mono, en lugar de los formatos de audio multicanal, a menos que el formato multicanal pueda espacializarse (Android 12L y versiones posteriores) o sea un formato de sonido envolvente Dolby. Además, en los dispositivos compatibles con la espacialización de audio, DefaultTrackSelector supervisará los cambios en las propiedades de espacializador y activará una selección de pistas nueva en esos casos. Los dispositivos con un modo de IU television se excluyen de estas restricciones y se dará prioridad al formato con el recuento de canales más alto. Para habilitar esta función, la instancia DefaultTrackSelector debe construirse con un Context.
  • Video:
    • Se cambió el nombre de DummySurface por PlaceholderSurface.
    • Se agregó compatibilidad con AV1 a MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Audio:
    • Se usa el tipo de MIME no estándar de publicidad de decodificador de audio LG AC3.
    • Se cambió el tipo de datos que se muestra de AudioAttributes.getAudioAttributesV21() de android.media.AudioAttributes a una nueva clase de wrapper AudioAttributesV21 para evitar una verificación lenta de ART en niveles de API inferiores a 21.
    • Consulta la plataforma (nivel de API 29 o superior) o supone el recuento de canales de codificación de audio para la transferencia de audio cuando el recuento de canales de audio de formato no está configurado, lo que se produce con la preparación sin fragmentos de HLS (10204).
    • Se configura AudioTrack con la máscara de canal AudioFormat.CHANNEL_OUT_7POINT1POINT4 si el decodificador produce audio PCM de 12 canales (#10322).
  • DRM
    • Se asegura de que la sesión de DRM se actualice siempre de forma correcta cuando busque inmediatamente después de un cambio de formato (10274).
  • Texto:
    • Se cambió Player.getCurrentCues() para mostrar CueGroup en lugar de List<Cue>.
    • SSA: Admite la configuración de estilo OutlineColour cuando BorderStyle == 3 (es decir, OutlineColour establece el fondo de la indicación) (#8435).
    • CEA-708: Analiza datos en varios bloques de servicio e ignora bloques que no estén asociados con el número de servicio seleccionado en el momento.
    • Se quitó RawCcExtractor, que solo se usaba para controlar un formato de subtítulos interno de Google.
  • Extractores:
    • Se agregó compatibilidad con AVI (#2092).
    • Matroska: Analiza DiscardPadding para pistas de Opus.
    • MP4: Analiza las tasas de bits de los cuadros esds.
    • Ogg: Permite el ID de Opus duplicado y los encabezados de comentarios (#10038).
  • IU:
    • Se corrigió la entrega de eventos a los OnClickListener configurados en PlayerView en el caso de useController=false (#9605). También se corrigió la entrega de eventos a OnLongClickListener para todas las configuraciones de vista.
    • Se corrigió el tratamiento incorrecto de una secuencia de eventos táctiles que salen de los límites de PlayerView antes de ACTION_UP como un clic (#9861).
    • Se corrigió el problema de accesibilidad a PlayerView, en el que la presión podía activar o desactivar la reproducción en lugar de ocultar los controles (#8627).
    • Se reescribió TrackSelectionView y TrackSelectionDialogBuilder para que funcionen con la interfaz Player en lugar de ExoPlayer. Esto permite que las vistas se usen con otras implementaciones de Player y quita la dependencia del módulo de IU con el módulo de ExoPlayer. Este es un cambio rotundo.
    • No se muestran pistas de texto forzado en el selector de pistas PlayerView; además, mantiene seleccionada una pista de texto forzado adecuada si se selecciona "Ninguno" (#9432).
  • DASH:
    • Se analiza el recuento de canales desde los elementos DTS AudioChannelConfiguration. Esto vuelve a habilitar la transferencia de audio para transmisiones de DTS (#10159).
    • No se permite que se pase null a DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Las instancias de DefaultCompositeSequenceableLoaderFactory se pueden pasar de forma explícita si es necesario.
  • HLS:
    • Se usa el resguardo de la preparación fragmentada si el atributo de la lista de reproducción CODECS no contiene el códec de audio (#10065).
    • No se permite que se pase null a HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory ni HlsMediaSource.Factory.setPlaylistTrackerFactory. Las instancias de DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory o una referencia a DefaultHlsPlaylistTracker.FACTORY se pueden pasar de forma explícita si es necesario.
  • Transmisión fluida:
    • No se permite que se pase null a SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Las instancias de DefaultCompositeSequenceableLoaderFactory se pueden pasar de forma explícita si es necesario.
  • RTSP:
    • Se agregó el lector RTP para H263 (#63).
    • Se agregó el lector de RTP para MPEG4 (#35).
    • Se agregó el lector de RTP para HEVC (#36).
    • Se agregó el lector de RTP para AMR. Actualmente, solo se admiten transmisiones AMR de un canal no intercaladas. No se admite la carga útil de RTP de AMR (#46).
    • Se agregó el lector de RTP para VP8 (#47).
    • Se agregó el lector de RTP para WAV (#56).
    • Se corrigió el encabezado de autorización básica de RTSP (#9544).
    • Ya no se verifican los campos SDP obligatorios, puesto que ExoPlayer no los necesita (#10049).
    • Se arroja una excepción verificada cuando se analiza el tiempo de RTSP (#10165).
    • Se agregó el lector de RTP para VP9 (#47).
    • Se agregó el lector de RTP para OPUS (#53).
  • Fuentes de datos:
    • Se cambió el nombre de DummyDataSource por PlaceholderDataSource.
    • Se solucionó el control de la interrupción de OkHttp.
  • Sesión:
    • Se reemplazó MediaSession.MediaItemFiller por MediaSession.Callback.onAddMediaItems para permitir la resolución asíncrona de las solicitudes.
    • Ahora se admiten métodos setMediaItems(s) cuando MediaController se conecta a una sesión multimedia heredada.
    • Se quitaron MediaController.setMediaUri y MediaSession.Callback.onSetMediaUri. La misma funcionalidad se puede lograr con MediaController.setMediaItem y MediaSession.Callback.onAddMediaItems.
    • Ahora se desvían las llamadas heredadas de MediaController a fin de reproducir contenido multimedia en MediaSession.Callback.onAddMediaItems, en lugar de onSetMediaUri.
    • Se agregaron MediaNotification.Provider y DefaultMediaNotificationProvider para proporcionar personalización de la notificación.
    • Se agregaron BitmapLoader y SimpleBitmapLoader para descargar imágenes de material gráfico.
    • Se agregaron MediaSession.setCustomLayout() para proporcionar retrocompatibilidad con la sesión heredada.
    • Se agregaron MediaSession.setSessionExtras() para proporcionar paridad de funciones con la sesión heredada.
    • Se cambió el nombre de MediaSession.MediaSessionCallback por MediaSession.Callback, el de MediaLibrarySession.MediaLibrarySessionCallback por MediaLibrarySession.Callback y el de MediaSession.Builder.setSessionCallback por setCallback.
    • Se corrigió la NPE en MediaControllerImplLegacy (#59).
    • Se actualizó la información de posición de la sesión en el cambio de cronograma (#51).
    • Se corrigió la NPE en MediaControllerImplBase después de lanzar el controlador (#74).
  • Reproducción de anuncios/IMA:
    • Se disminuyó la frecuencia de sondeo de anuncios de 100 ms a 200 ms para cumplir con las recomendaciones del Media Rating Council (MRC).
  • Extensión FFmpeg:
    • Se actualizó la versión de CMake a 3.21.0+ para evitar un error de CMake que provocaba una falla en la sincronización de Gradle de Android Studio (#9933).
  • Se quitaron los símbolos obsoletos:
    • Se quitó Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Se usa Player.Listener.onTracksChanged(Tracks) en su lugar.
    • Se quitaron Player.getCurrentTrackGroups y Player.getCurrentTrackSelections. Usa Player.getCurrentTracks en su lugar. También puedes seguir usando ExoPlayer.getCurrentTrackGroups y ExoPlayer.getCurrentTrackSelections, aunque estos métodos permanecen obsoletos.
    • Se quitaron las constantes DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT y DEFAULT_TRACK_SELECTOR_PARAMETERS de DownloadHelper. Usa getDefaultTrackSelectorParameters(Context) cuando sea posible y, de lo contrario, usa DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Se quitó el constructor DefaultTrackSelector(ExoTrackSelection.Factory). Usa DefaultTrackSelector(Context, ExoTrackSelection.Factory) en su lugar.
    • Se quitó Transformer.Builder.setContext. En su lugar, se debe pasar el Context al constructor Transformer.Builder.

Versión 1.0.0-alpha03

14 de marzo de 2022

Lanzamiento de androidx.media3:media3-*:1.0.0-alpha03. La versión 1.0.0-alpha03 contiene estas confirmaciones.

Esto corresponde a la versión 2.17.1 de ExoPlayer.

  • Audio:
    • Se corrigieron las comprobaciones de errores de las capacidades de audio de Dolby Atmos (E-AC3-JOC) en HLS.
  • Extractores:
    • FMP4: Se corrige el problema por el que los metadatos de muestra de emsg podrían salir en el orden incorrecto para las transmisiones que contienen emsg atoms v0 y v1 (#9996).
  • Texto:
    • Se corrige la interacción de SingleSampleMediaSource.Factory.setTrackId y MediaItem.SubtitleConfiguration.Builder.setId para priorizar el campo SubtitleConfiguration y recurrir al valor Factory si no está configurado (#10016).
  • Reproducción de anuncios:
    • Se corrigen los agotamientos de audio entre períodos de anuncios en las transmisiones en vivo de HLS SSAI.

Versión 1.0.0-alpha02

2 de marzo de 2022

Lanzamiento de androidx.media3:media3-*:1.0.0-alpha02. La versión 1.0.0-alpha02 contiene estas confirmaciones.

Esto corresponde a la versión 2.17.0 de ExoPlayer.

  • Biblioteca principal:
    • Se agrega el método protegido DefaultRenderersFactory.getCodecAdapterFactory() para que las subclases de DefaultRenderersFactory que anulen buildVideoRenderers() o buildAudioRenderers() puedan acceder a la fábrica del adaptador de códec y pasarlo a las instancias MediaCodecRenderer que crean.
    • Se propagan los campos de encabezado ICY name y genre a MediaMetadata.station y MediaMetadata.genre respectivamente para que lleguen a la app a través de Player.Listener.onMediaMetadataChanged() (#9677).
    • Se quitan las claves nulas de DefaultHttpDataSource#getResponseHeaders.
    • Se suspende y vuelve a intentar cuando se produce un error en la creación de una instancia MediaCodec. Esto soluciona un problema que ocurre en algunos dispositivos cuando se cambia una plataforma de un códec seguro a otro (#8696).
    • Se agrega MediaCodecAdapter.getMetrics() para permitir que los usuarios obtengan datos de métricas de MediaCodec (#9766).
    • Se corrige la resolución de dependencia de Maven (#8353).
    • Se inhabilita el ajuste automático de velocidad para las transmisiones en vivo que no tienen funciones de baja latencia ni una solicitud de usuario que establezca la velocidad (#9329).
    • Se cambia el nombre de DecoderCounters#inputBufferCount a queuedInputBufferCount.
    • Se hace el elemento SimpleExoPlayer.renderers privado. Se puede acceder a los procesadores a través de ExoPlayer.getRenderer.
    • Se actualizaron algunos valores constantes de AnalyticsListener.EventFlags para que coincidan con los valores en Player.EventFlags.
    • Se divide AnalyticsCollector en una interfaz y una implementación predeterminada para permitir que R8 lo quite si una app no lo necesita.
  • Selección de pistas:
    • Se admiten las marcas de función de video preferidas en la selección de pistas (#9402).
    • Se actualiza la lógica de selección de pistas de video a fin de tener en cuenta las marcas de función y los tipos de MIME preferidos cuando se seleccionan varias pistas de video para adaptarlas (#9519).
    • Se actualiza la lógica de selección de pistas de audio y video para solo elegir formatos de selecciones adaptables que tengan el mismo nivel de compatibilidad con decodificadores y hardware (#9565).
    • Se actualiza la lógica de selección de las pistas de video para dar prioridad a códecs más eficientes si se admiten varios códecs con decodificadores principales acelerados por hardware (#4835).
    • Se eligen las preferencias de contenido de audio (por ejemplo, la pista de audio "predeterminada" o una pista que coincida con el idioma de la configuración regional del sistema) por sobre las restricciones técnicas de selección de pistas (por ejemplo, el tipo de MIME preferido o la cantidad máxima de canales).
    • Se corrigió un problema de selección de pistas en el que la anulación de un grupo de pistas no inhabilitaba otros grupos del mismo tipo (#9675).
    • Se corrige un problema de selección de pistas en el que no se aplicaba, de forma correcta, una combinación de anulaciones de pista no vacía y vacía (#9649).
    • Se prohíbe duplicar TrackGroup en TrackGroupArray. TrackGroup siempre se pueden distinguir si se configura id en el constructor TrackGroup. De esta manera, se corrige una falla que se producía cuando se reanudaba la reproducción después de ejecutar la app en segundo plano con una anulación de pista activa (#9718).
    • Se modifica la lógica en AdaptiveTrackSelection para permitir un aumento de calidad con suficiente ancho de banda de red, incluso si la reproducción está muy cerca del borde activo (#9784).
  • Video:
    • Se corrige la lógica de resguardo del decodificador para Dolby Vision a fin de usar un decodificador H264/H265 compatible si es necesario.
  • Audio:
    • Se corrige la lógica de resguardo del decodificador para Dolby Atmos (E-AC3-JOC) a fin de usar un decodificador E-AC3 compatible si es necesario.
    • Se cambian las API de AudioCapabilities para que sea necesario pasar AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES de manera explícita en lugar de null.
    • Se permite la personalización del cálculo del tamaño del búfer de AudioTrack mediante la inserción de AudioTrackBufferSizeProvider en DefaultAudioSink (#8891).
    • Vuelve a intentar la creación de AudioTrack si el tamaño del búfer solicitado es superior a 1 MB (#9712).
  • Extractores:
    • WAV: Se agrega compatibilidad con transmisiones RF64 (#9543).
    • Se corrige el análisis incorrecto de unidades SPS NAL H.265 (#9719).
    • Se analizan los comentarios de Vorbis (incluido METADATA_BLOCK_PICTURE) en los archivos Ogg Opus y Ogg Vorbis.
  • Texto:
    • Se agrega un campo MediaItem.SubtitleConfiguration.id que se propaga al campo Format.id de la pista de subtítulo creada a partir de la configuración (#9673).
    • Se agrega compatibilidad básica con los subtítulos de WebVTT en contenedores de Matroska (#9886).
    • No se permite que Cea708Decoder lea más que el tamaño declarado de un bloque de servicios.
  • DRM:
    • Se quita playbackLooper de DrmSessionManager.(pre)acquireSession. Cuando una app usa DrmSessionManager en MediaSource personalizado, en su lugar, playbackLooper debe pasarse a DrmSessionManager.setPlayer.
  • Reproducción de anuncios / IMA:
    • Se agrega compatibilidad con la inserción de anuncios dinámicos (DAI) de IMA (#8213).
    • Se agrega un método a AdPlaybackState para permitir el restablecimiento de un grupo de anuncios a fin de que se pueda volver a reproducir (#9615).
    • Se aplica, de forma forzosa, la velocidad de reproducción de 1.0 durante la reproducción de anuncios (#9018).
    • Se corrige un problema por el que un grupo de anuncios que no se cargaba causaba un restablecimiento inmediato de reproducción (#9929).
  • IU:
    • Se corrige el color de los números en los botones para avanzar y retroceder StyledPlayerView cuando se usan ciertos temas (#9765).
    • Se traducen correctamente las strings de velocidad de reproducción (#9811).
  • DASH:
    • Se agregan propiedades analizadas, esenciales y adicionales a Representation (#9579).
    • Se admite la función de seguimiento forced-subtitle (#9727).
    • Ya no se interpreta la función de pista main como C.SELECTION_FLAG_DEFAULT.
    • Se corrige la lógica de exclusión de la URL base para manifiestos que no declaran el espacio de nombres de DVB (#9856).
    • Se admiten URLs MPD.Location relativas (#9939).
  • HLS:
    • Se propaga correctamente Format.label para las transmisiones HLS de solo audio (#9608).
    • Se usa la preparación sin fragmentos de forma predeterminada para mejorar el tiempo de inicio. Si tus formatos contienen pistas de subtítulos multiplexados que no están declaradas en la lista de reproducción principal, debes agregarlas a esta lista, de modo que estén disponibles para reproducirse o debes desactivar la preparación sin fragmentos con HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Se admite la búsqueda precisa de fotogramas clave en HLS (#2882).
  • RTSP:
    • Se proporciona una API de cliente a fin de anular SocketFactory que se utiliza para cualquier conexión del servidor (#9606).
    • Se prefiere el método de autenticación DIGEST en lugar de BASIC si ambos están presentes (#9800).
    • Se controla cuando no está disponible el tiempo de seguimiento de RTSP (#9775).
    • Se ignoran los valores de encabezado de RTP-Info no válidos (#9619).
  • Transformador:
    • Se aumenta la versión mínima requerida de la API a 21.
    • TransformationException ahora se usa para describir errores que se producen durante una transformación.
    • Se agregó TransformationRequest para especificar las opciones de transformación.
    • Se permite que se registren varios objetos de escucha.
    • Se corrige el problema que atasca el transformador cuando el resultado del códec se lee de forma parcial.
    • Se corrige la NPE posible en Transformer.getProgress cuando se liberan los lanzamientos del combinador.
    • Se agregó una app de demo para aplicar transformaciones.
  • Extensión MediaSession:
    • De forma predeterminada, MediaSessionConnector ahora borra la lista de reproducción detenida. Las apps que quieran conservar la lista de reproducción pueden llamar a setClearMediaItemsOnStop(false) en el conector.
  • Extensión Cast:
    • Se corrige el error que impedía que CastPlayer llamara a onIsPlayingChanged correctamente (#9792).
    • Se admiten metadatos de audio, incluido el material gráfico con DefaultMediaItemConverter (#9663).
  • Extensión FFmpeg:
    • Causa que build_ffmpeg.sh dependa de binutils de LLVM en lugar de los de GNU (#9933).
  • Compatibilidad con Android 12:
    • Se actualiza la extensión Cast para que dependa de com.google.android.gms:play-services-cast-framework:20.1.0. Las versiones anteriores de play-services-cast-framework no son compatibles con las apps orientadas a Android 12 y fallan con IllegalArgumentException cuando se crean PendingIntent (#9528)..
  • Se quitan los símbolos obsoletos:
    • Se quita Player.EventListener. Se usa Player.Listener en su lugar.
    • Se quitan MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory y MediaSourceFactory#setDrmUserAgent. Se usa MediaSourceFactory#setDrmSessionManagerProvider en su lugar.
    • Se quita MediaSourceFactory#setStreamKeys. Se usa MediaItem.Builder#setStreamKeys en su lugar.
    • Se quita MediaSourceFactory#createMediaSource(Uri). Se usa MediaSourceFactory#createMediaSource(MediaItem) en su lugar.
    • Se quita setTag de DashMediaSource, HlsMediaSource y SsMediaSource. Se usa MediaItem.Builder#setTag en su lugar.
    • Se quita DashMediaSource#setLivePresentationDelayMs(long, boolean). Se usan MediaItem.Builder#setLiveConfiguration y MediaItem.LiveConfiguration.Builder#setTargetOffsetMs para anular el manifiesto, o DashMediaSource#setFallbackTargetLiveOffsetMs para proporcionar un valor de resguardo.
    • Se quita (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Ya no es posible inhabilitar la aplicación forzosa de subprocesos.
    • Se quitan ActionFile y ActionFileUpgradeUtil. Se usa ExoPlayer 2.16.1 o una versión anterior para usar ActionFileUpgradeUtil a fin de combinar archivos de acción heredados en DefaultDownloadIndex.
    • Se quita ProgressiveMediaSource#setExtractorsFactory. Se usa el constructor ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory) en su lugar.
    • Se quitan ProgressiveMediaSource.Factory#setTag y ProgressiveMediaSource.Factory#setCustomCacheKey. Se usan MediaItem.Builder#setTag y MediaItem.Builder#setCustomCacheKey en su lugar.
    • Se quitan los constructores DefaultRenderersFactory(Context, @ExtensionRendererMode int) y DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Se usan el constructor DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode y DefaultRenderersFactory#setAllowedVideoJoiningTimeMs en su lugar.
    • Se quitan todos los constructores públicos CronetDataSource. Se usa CronetDataSource.Factory en su lugar.
  • Se cambia el siguiente IntDefs solo a @Target(TYPE_USE). Es posible que se interrumpa la compilación de usos en Kotlin, que se puede corregir si se mueve la anotación para anotar el tipo (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (en el paquete com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (en el paquete com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Versión 1.0.0-alpha01

27 de octubre de 2021

Lanzamiento de androidx.media3:media3-*:1.0.0-alpha01. La versión 1.0.0-alpha01 contiene estas confirmaciones.

Funciones nuevas

Media3 es la nueva casa de las bibliotecas de compatibilidad de contenido multimedia, incluido ExoPlayer. La primera versión alfa contiene implementaciones funcionales y anticipadas de bibliotecas para implementar casos de uso de contenido multimedia, como los siguientes:

  • ExoPlayer, un reproductor multimedia a nivel de la aplicación para Android fácil de personalizar y extender
  • Funcionalidad de sesión multimedia a los efectos de exponer y controlar las reproducciones Este nuevo módulo de sesiones usa la misma interfaz de Player que ExoPlayer.
  • Componentes de la IU para compilar interfaces de usuario de reproducción de contenido multimedia
  • Módulos que unen la funcionalidad en otras bibliotecas con el fin de usarlos con ExoPlayer, por ejemplo, la inserción de anuncios a través del SDK de IMA

Si deseas obtener más información, consulta el proyecto de GitHub de Media3.

Anteriormente, ExoPlayer se alojaba en un proyecto de GitHub de ExoPlayer independiente. En Media3, el nombre de su paquete es androidx.media3.exoplayer. Planeamos mantener y lanzar el proyecto de GitHub de ExoPlayer por un tiempo, de modo que las apps puedan migrar a Media3. Media3 tiene reemplazos para todos los módulos de ExoPlayer, excepto las extensiones heredadas media2 y mediasession, que se reemplazan con el nuevo módulo media3-session. Esto brinda una integración directa entre las reproducciones y las sesiones de contenido multimedia sin necesidad de usar una clase de adaptador o conector.