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
20 de diciembre de 2024 1.5.1 - - 1.6.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.4.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
    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 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 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.4.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
    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 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 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 a fin de encontrar respuestas a preguntas, problemas conocidos y solicitudes de funciones, así como para informar problemas nuevos.

Versión 1.6.0

Versión 1.6.0-alpha01

20 de diciembre de 2024

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

  • Biblioteca común:
    • Se quitó el método Format.toBundle(boolean excludeMetadata). Usa Format.toBundle() en su lugar.
    • Agrega AudioManagerCompat y AudioFocusRequestCompat para reemplazar las clases equivalentes en androidx.media.
  • ExoPlayer:
    • Ten en cuenta 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 de idioma de video explícitas se pueden expresar con TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Se agregó el parámetro selectedAudioLanguage al método DefaultTrackSelector.selectVideoTrack().
    • Se agregó el parámetro retryCount a MediaSourceEventListener.onLoadStarted y a los métodos MediaSourceEventListener.EventDispatcher correspondientes.
    • Se corrigió el error por el que los elementos o períodos de las playlists en transmisiones DASH de varios períodos con duraciones que no coincidían con el contenido real podían provocar que las tramas se bloquearan al final del elemento (#1698).
    • Reduce los valores predeterminados de bufferForPlaybackMs y bufferForPlaybackAfterRebufferMs en DefaultLoadControl a 1,000 y 2,000 ms, respectivamente.
    • Agrega MediaExtractorCompat, una clase nueva que proporciona funciones equivalentes a la plataforma MediaExtractor.
    • Mueve BasePreloadManager.Listener a un PreloadManagerListener de nivel superior.
    • Se puede implementar RenderersFactory.createSecondaryRenderer para proporcionar renderizadores secundarios para la preparación previa. El preacondicionamiento permite transiciones más rápidas de elementos multimedia durante la reproducción.
    • Se habilitó el envío de CmcdData para las solicitudes de manifiesto en los formatos de transmisión adaptable DASH, HLS y SmoothStreaming (#1951).
    • Proporciona MediaCodecInfo del códec que se inicializará en MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Cambia AdsMediaSource para permitir que AdPlaybackStates crezca adjuntando grupos de anuncios. Se detectan modificaciones no válidas y se arroja una excepción.
  • Transformador:
    • Actualiza los parámetros de VideoFrameProcessor.registerInputStream y VideoFrameProcessor.Listener.onInputStreamRegistered para usar Format.
    • Se agregó compatibilidad con la transmuxación en formatos alternativos retrocompatibles.
    • Genera metadatos estáticos HDR cuando usas DefaultEncoderFactory.
  • Extractores:
    • AVI: Se corrigió el manejo de archivos con audio comprimido de tasa de bits constante en los que el encabezado de flujo almacena la cantidad de bytes en lugar de la cantidad de fragmentos.
  • Audio:
    • Se corrigió onAudioPositionAdvancing para que se llame cuando se reanuda la reproducción (anteriormente, se llamaba cuando se pausaba la reproducción).
  • Video:
    • Se corrigió MediaCodecVideoRenderer de modo que, cuando no hay un Surface, el renderizador omite solo los fotogramas anteriores solo si VideoFrameReleaseControl.getFrameReleaseAction no es FRAME_RELEASE_TRY_AGAIN_LATER.
  • Texto:
    • Se detuvo la carga anticipada de todos los archivos de subtítulos configurados con MediaItem.Builder.setSubtitleConfigurations y, en su lugar, solo se carga uno si se selecciona por selección de pista (#1721).
  • Efecto:
    • Se movió la funcionalidad de OverlaySettings a StaticOverlaySettings. Se puede crear una subclase de OverlaySettings para permitir la configuración de superposición dinámica.
  • Muxers:
    • Se quitó MuxerException de la interfaz de Muxer para evitar un nombre completamente calificado demasiado largo.
  • Sesión:
    • Se agregó "Context" como parámetro a "MediaButtonReceiver.shouldStartForegroundService" (#1887).
  • IU:
    • Se agregó el elemento componible PlayerSurface al módulo media3-ui-compose.
    • Agrega las clases PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState y ShuffleButtonState, y los elementos componibles rememberPlayPauseButtonState, rememberNextButtonState, rememberPreviousButtonState, rememberRepeatButtonState y rememberShuffleButtonState correspondientes al módulo media3-ui-compose.
  • Extensión HLS:
    • Agrega una primera versión de HlsInterstitialsAdsLoader. El cargador de anuncios lee los anuncios intersticiales HLS de una playlist multimedia HLS y los asigna al AdPlaybackState que se pasa a 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.
  • Extensión de DASH:
    • Se agregó compatibilidad con el formato AC-4 de nivel 4 para DASH (#1898).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etcétera):
    • Se agregó el módulo de decodificador MPEG-H, que usa el módulo de decodificador MPEG-H nativo para decodificar audio MPEG-H (#1826).
  • App de demo:
    • Se agregaron elementos de IU componibles MinimalControls (PlayPauseButton, NextButton, PreviousButton) y ExtraControls (RepeatButton, ShuffleButton) a demo-compose con PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState y ShuffleButtonState.
  • 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 pásalo a Transformer.start().
      • setVideoEffects(), establece el efecto de video en un EditedMediaItem.Builder.setEffects() y 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 del EditedMediaItem que se pasa a Transformer.start().
      • setFlattenForSlowMotion(), usa EditedMediaItem.Builder.setFlattenForSlowMotion() para aplanar el EditedMediaItem que se pasa a Transformer.start().
      • setListener(), usa addListener(), removeListener() o removeAllListeners().
    • 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 TransformationResult obsoleta. Se usa ExportResult en su lugar.
    • Se quitó la clase TransformationException obsoleta. Se usa ExportException en su lugar.
    • Se quitó Transformer.PROGRESS_STATE_NO_TRANSFORMATION obsoleto. Se usa Transformer.PROGRESS_STATE_NOT_STARTED en su lugar.
    • Se quitó Transformer.setListener() obsoleto. En su lugar, usa Transformer.addListener(), Transformer.removeListener() o Transformer.removeAllListeners().
    • Se quitó Transformer.startTransformation() obsoleto. Se usa Transformer.start(MediaItem, String) en su lugar.
    • Se quitó SingleFrameGlShaderProgram obsoleto. Se usa BaseGlShaderProgram en su lugar.
    • Se quita Transformer.flattenForSlowMotion. Se usa EditedMediaItem.flattenForSlowMotion en su lugar.

Versión 1.5

Versión 1.5.1

19 de diciembre de 2024

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

  • ExoPlayer:
    • Se inhabilitó el uso de la desencriptación asíncrona en MediaCodec para evitar los problemas de tiempo de espera del 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 en píxeles proporcionados por MediaCodecAdapter cuando se proporcionaban durante el procesamiento de onOutputFormatChanged (#1371).
  • Texto:
    • Se corrigió un error en ReplacingCuesResolver.discardCuesBeforeTimeUs por el que se descartaba de forma incorrecta la señal activa en timeUs (que se inició antes, pero aún no finalizaba) (#1939).
  • Metadatos:
    • Se extraen el número de disco o pista 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 contiene estas confirmaciones.

  • Biblioteca común:
    • Se agregó ForwardingSimpleBasePlayer, que permite reenviar a otro reproductor con pequeños ajustes y, al mismo tiempo, 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 Tracks y Metadata actuales en lugar de crear una estructura de playlist.
    • Se aumentó minSdk a 21 (Android Lollipop). Esto está alineado con todas las demás bibliotecas de AndroidX.
    • Se agregó el artefacto androidx.media3:media3-common-ktx, que proporciona funcionalidad específica de Kotlin compilada sobre la biblioteca Common.
    • Agrega la función de extensión de suspensión Player.listen para activar una corrutina que escuche Player.Events en la biblioteca media3-common-ktx.
    • Se quitaron las anotaciones @DoNotInline de las clases internas fuera de línea que se compilan de forma manual y que se diseñaron para evitar errores de verificación de clases del entorno de ejecución. Las versiones recientes de R8 ahora realizan llamadas fuera de línea como estas automáticamente para evitar fallas en el tiempo de ejecución (por lo que ya no es necesario realizar la salida de línea manual). Todos los usuarios de Gradle de la biblioteca ya deben usar 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 o ofuscación equivalente a R8 realice un proceso automático similar de alineación para evitar fallas de verificación de clases en el tiempo 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.
    • Agrega PreloadMediaSource.PreloadControl.onPreloadError para permitir que las implementaciones de PreloadMediaSource.PreloadControl realicen acciones cuando se produzca un error.
    • Agrega BasePreloadManager.Listener para propagar eventos de carga previa a las apps.
    • Se permite cambiar el tiempo de espera del cliente SNTP y volver a intentar direcciones alternativas cuando se agote el tiempo de espera (#1540).
    • Quita MediaCodecAdapter.Configuration.flags, ya que el campo siempre era cero.
    • Permite que el usuario seleccione la bocina integrada para la reproducción en Wear OS a partir de la API 35 (si el dispositivo anuncia compatibilidad con esta función).
    • Pospone la llamada de bloqueo a Context.getSystemService(Context.AUDIO_SERVICE) hasta que se habilite el manejo de enfoque de audio. Esto garantiza que no se realice la llamada de bloqueo si no está habilitada la administración de enfoque de audio (#1616).
    • Se permite la reproducción independientemente de la duración almacenada en búfer cuando se produce un error de carga (#1571).
    • Agrega AnalyticsListener.onRendererReadyChanged() para indicar cuándo los renderizadores individuales permiten que la reproducción esté lista.
    • Se corrigió el problema por el que, a veces, MediaCodec.CryptoException se informaba como un "error inesperado del entorno de ejecución" cuando MediaCodec se operaba 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. Luego, las apps necesitan pasar un valor que represente una duración específica desde la posición de inicio predeterminada para la que la fuente de contenido multimedia correspondiente se debe cargar previamente con esta IntDef, en lugar de una posición.
    • Se agregó una 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. Las apps pueden llamar a ExoPlayer.setPreloadConfiguration(PreloadConfiguration) según corresponda para habilitar la carga previa. De forma predeterminada, la carga previa está inhabilitada. Cuando se habilita y para no interferir con la reproducción, DefaultLoadControl restringe la carga previa para que comience 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 subclase (1736).
    • Agrega DefaultPreloadManager.Builder que compila las instancias de DefaultPreloadManager y ExoPlayer con configuraciones compartidas 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 dejó de usar DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) y se marcó el método como definitivo para evitar anulaciones. En su lugar, se debe usar el nuevo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Informa los eventos de MediaSourceEventListener de fuentes secundarias en MergingMediaSource. Esto provocará que se informen eventos de inicio, error, cancelación o finalización de carga para los subtítulos transferidos lateralmente (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 demás (#1722).
      • En el nuevo manejo de subtítulos (durante la extracción), el análisis asociado (p.ej., datos de subtítulos no válidos) y los errores de carga (p.ej., HTTP 404) se emiten a través de devoluciones de llamada de onLoadError.
      • En el manejo de subtítulos heredados (durante la renderización), solo se emiten 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ó el error por el que los elementos o períodos de las playlists en transmisiones DASH de varios períodos con duraciones que no coincidían con el contenido real podían provocar que las tramas se bloquearan al final del elemento (#1698).
    • Se agregó un set a SntpClient para establecer el tiempo transcurrido máximo desde la última actualización, después de la cual se vuelve a inicializar el cliente (#1794).
  • Transformador:
    • Agrega SurfaceAssetLoader, que admite la creación de filas de datos de video en Transformer a través de un Surface.
    • ImageAssetLoader informa la entrada no admitida a través de AssetLoader.onError en lugar de generar una IllegalStateException.
    • Se hace obligatorio configurar la duración de la imagen con MediaItem.Builder.setImageDurationMs 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: Se prefiere el audio basado en objetos en lugar del audio basado en canales cuando los demás factores son iguales.
  • Extractores:
    • Permite que Mp4Extractor y FragmentedMp4Extractor identifiquen muestras de H264 que no se usen como referencia en muestras posteriores.
    • Se agregó la opción para habilitar el salto basado 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 MP3, ahora detienen la reproducción al final de los datos MP3 en lugar de fallar con ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Se corrigió el manejo de muestras de preroll para 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 mediante el uso de 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, media_time ahora se escala correctamente con la escala de tiempo de la pista, como lo especifica el estándar de formato MP4 (#1792).
    • Se controlan los fotogramas fuera de orden en el cálculo de endIndices para MP4 con una lista de edición (#1797).
    • Se corrigió el análisis de la duración del contenido multimedia en el cuadro mdhd de los archivos MP4 para controlar los valores -1 (#1819).
    • Se agregó compatibilidad para identificar el cuadro h263 en archivos MP4 para videos H.263 (#1821).
    • Se agregó compatibilidad con el formato de archivo multimedia base ISO de nivel 4 AC-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() devuelve el URI resuelto (como se documenta). Cuando esto es diferente del URI solicitado, las pruebas pueden indicarlo con el nuevo método DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: Confirma que DataSource.getUri() y getResponseHeaders() devuelvan su valor "open" después de una llamada fallida a open() (debido a un recurso "not found") y antes de una llamada close() posterior.
      • La anulación de DataSourceContractTest.getNotFoundResources() permite que las subclase de prueba proporcionen varios recursos de "no encontrado" y también proporcionen los encabezados esperados. Esto permite distinguir entre HTTP 404 (con encabezados) y "no se encontró el servidor" (sin encabezados).
  • Audio:
    • Configura automáticamente los metadatos de volumen CTA-2075 en el códec si están presentes en el contenido multimedia.
    • Asegúrate de que el volumen disminuya de forma suave cuando se busque un contenido.
    • Se corrigieron los sonidos de pop que pueden ocurrir durante los saltos.
    • Se corrigió la acumulación de errores de truncamiento para el algoritmo de estiramiento de tiempo o cambio de tono de Sonic.
    • Se corrigió un error en SpeedChangingAudioProcessor que causaba que se descartaran fotogramas de salida.
  • Video:
    • MediaCodecVideoRenderer evita decodificar muestras que no se renderizan ni se usan como referencia por otros samples.
    • En el nivel de API 35 y versiones posteriores, MediaCodecAdapter ahora puede recibir un Surface null en configure y llamar a un nuevo método detachOutputSurface para quitar un Surface establecido anteriormente si el códec lo admite (MediaCodecInfo.detachedSurfaceSupported).
    • Usa los valores de relación de aspecto en píxeles proporcionados por MediaCodecAdapter si se proporcionan cuando se procesa onOutputFormatChanged (#1371).
    • Se agregó una solución alternativa para un problema del dispositivo en Galaxy Tab S7 FE que causaba que las transmisiones H264 seguras de 60 fps se marcaran como no compatibles (#1619).
    • Se agregó una solución para los códecs que se bloquean después del último muestreo sin mostrar una señal de fin de transmisión.
  • Texto:
    • Se agregó un VoiceSpan personalizado y se propagó para los intervalos de voz de WebVTT (#1632).
    • Asegúrate de que se muestren 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 de MPEG 90,000) (#1763).
    • Compatibilidad con subtítulos CEA-608 en contenido Dolby Vision (#1820).
    • Se corrigió la reproducción que se bloqueaba en las transmisiones de varios períodos de DASH cuando estaban habilitados los subtítulos CEA-608 (#1863).
  • Metadatos:
    • Asigna el tipo C.TRACK_TYPE_METADATA a las pistas que contienen contenido de icy o vnd.dvb.ait.
  • Imagen:
    • Agrega ExternallyLoadedImageDecoder para simplificar la integración con bibliotecas de carga de imágenes externas, 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 una escala pequeña que corte un borde de 1 texels alrededor del borde de un búfer recortado. Ahora se controla de modo que el resultado sea más cercano 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 un ArrayIndexOutOfBoundsException en ImaServerSideAdInsertionMediaSource.
    • Se corrigió un error por el que las transmisiones de DAI insertadas del servidor sin un anuncio previo podían generar un ArrayIndexOutOfBoundsException cuando se reproducían después del último anuncio durante el contenido (#1741).
  • Sesión:
    • Agrega MediaButtonReceiver.shouldStartForegroundService(Intent) para permitir que las apps supriman un comando de reproducción que se recibe para reanudar la reproducción anulando este método. 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ó el error que causaba que los comandos personalizados enviados desde un MediaBrowser se enviaran a MediaSessionCompat.Callback en lugar de a la variante MediaBrowserServiceCompat del método cuando se conectaban a un servicio heredado. Esto impidió que MediaBrowser recibiera el valor real que devolvió el servicio heredado (#1474).
    • Controla el IllegalArgumentException que arrojan los dispositivos de ciertos fabricantes cuando se configura el receptor de emisión para intents de botones multimedia (#1730).
    • Agrega botones de comando para 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 los botones de comando Media3, los elementos multimedia están disponibles para MediaBrowser y MediaController. Consulta Acciones de exploración personalizadas de AAOS.
    • 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.
    • Pasa las sugerencias de conexión de un navegador Media3 al MediaBrowserCompat inicial cuando te conectes 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 que enviaba el servicio después de que el navegador se suscribía a un parentid.
    • Mejora el comportamiento de interoperabilidad para que un navegador Media3 que está conectado a un MediaBrowserService heredado no solicite los elementos secundarios de un parentId dos veces cuando se suscriba a un elemento superior.
  • IU:
    • Se habilitó la opción para aceptar el video estirado o recortado en la solución alternativa PlayerViewen 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ó el error por el que la opción "Ninguno" en la selección de texto no funcionaba si había preferencias de selección de pista de texto definidas por la app.
  • Extensión de DASH:
    • Se agregó compatibilidad con períodos que comienzan en medio de un segmento (#1440).
  • Extensión de transmisión fluida:
    • Se corrigió un error de Bad magic number for Bundle cuando se reproducían transmisiones de SmoothStreaming con pistas de texto (#1779).
  • Extensión RTSP:
    • Se corrigió la eliminación de información del usuario para las URLs que contienen caracteres @ codificados (#1138).
    • Se corrigió la falla que se producía cuando se analizaban paquetes RTP con extensiones de encabezado (#1225).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, etcétera):
    • Agrega el módulo de decodificador IAMF, que proporciona compatibilidad con la reproducción de archivos MP4 que contienen pistas 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 de Cast:
    • Deja de limpiar la línea de tiempo después de que se desconecte CastSession, lo que permite que la app del remitente 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 un RoutingSession, lo que es necesario para integrar el selector de salida (#1056).
  • Utilidades de prueba:
    • DataSourceContractTest ahora incluye pruebas para verificar lo siguiente:
      • Se actualiza 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 Player.hasPrevious y Player.hasPreviousWindow() obsoletos. En su lugar, usa Player.hasPreviousMediaItem().
    • 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 se produce un error de carga (#1571).
  • Extractores:
    • MP3: Se corrigió el error Searched too many bytes ignorando correctamente los datos no MP3 finales según el campo de longitud en un marco Info (#1480).
  • Texto:
    • TTML: Se corrigió el manejo de los valores de tts:fontSize de porcentaje para garantizar que se hereden correctamente de los nodos superiores con valores de tts:fontSize de porcentaje.
    • Se corrigió IndexOutOfBoundsException en LegacySubtitleUtil debido a que se controlaba de forma incorrecta el caso en el que la hora de inicio de la 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 el 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:
    • Se agregó un método release() a GlObjectsProvider.
  • Sesión:
    • Se transformó una presión doble de KEYCODE_HEADSETHOOK en una acción de "saltar al siguiente", como se documentó (#1493).
    • Controla KEYCODE_HEADSETHOOK como un comando "play" en MediaButtonReceiver cuando decidas si ignorarlo 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 contiene estas confirmaciones.

  • Biblioteca común:
    • Reenvía las llamadas de búsqueda que se presumen sin operación a los métodos BasePlayer.seekTo() y SimpleBasePlayer.handleSeek() protegidos 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 en 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 de imagen (como se documenta).
    • Agrega Format.customData para almacenar información personalizada proporcionada por la app sobre las instancias de Format.
  • ExoPlayer:
    • Agrega BasePreloadManager, que coordina la carga previa de varias fuentes según las prioridades definidas por su rankingData. La personalización es posible si extiendes 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 búfer 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) muestre 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 carga previa.
    • 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ó el problema con la actualización del último tiempo de reabastecimiento de búfer, lo que generaba una clave bs (falta de 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 carguen previamente la siguiente fuente o realicen otras acciones.
    • Se corrigió un error por el que el omitir silencios 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 recuperan recursos de códec para tareas de prioridad más alta.
    • Permite que AdsMediaSource cargue anuncios previos al video antes de que se complete la preparación inicial del contenido multimedia (#1358).
    • Se corrigió el 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 las 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 avanzar. Puedes habilitarlo con experimentalSetDynamicSchedulingEnabled() cuando configures tu instancia de ExoPlayer.
    • Agrega Renderer.getDurationToProgressUs(). Un Renderer puede implementar este método para mostrarle a ExoPlayer la duración que debe avanzar la reproducción para que el renderizador avance. Si ExoPlayer se configura con experimentalSetDynamicSchedulingEnabled(), ExoPlayer llamará a este método cuando calcule el tiempo para programar su tarea de trabajo.
    • Se agregó MediaCodecAdapter#OnBufferAvailableListener para alertar cuando los búferes de entrada y salida están disponibles para que los use MediaCodecRenderer. MediaCodecRenderer indicará 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 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 de enfoque de audio, p.ej., no se informaba la pérdida de enfoque completa o transitoria mientras el reproductor estaba en pausa (#1436).
    • Se corrigió un posible error 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 con la compensación del renderizador quitada (#1098).
    • Se corrigió un posible IllegalArgumentException cuando se controlaba el error del reproductor que se producía mientras se leía otro elemento de la playlist (#1483).
  • Transformador:
    • Agrega audioConversionProcess y videoConversionProcess a ExportResult para indicar cómo se creó la pista correspondiente en el archivo de salida.
    • Se relajaron las verificaciones de nivel de H.264 de 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 solucionó un problema por el que DefaultAudioMixer no mostraba la cantidad correcta de bytes después de restablecerse y reutilizarse.
    • Se solucionó un error de decodificador en el que la cantidad de canales de audio se limitaba a estéreo cuando se controlaba la entrada 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 el caso de una excepción de códec, los detalles del códec estarán disponibles en ExportException.codecInfo.
  • Extractores:
    • MPEG-TS: Se aplicó el cambio para garantizar que se renderice 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 HLS de solo fotogramas I(#1150) y las transmisiones HLS de H.262 (#1126).
    • MP3: Se prefiere el tamaño de los datos de una trama Info en lugar del tamaño que informa el flujo subyacente (p.ej., el tamaño del archivo o el encabezado Content-Length de HTTP). Esto ayuda a excluir los datos de los avances que no se pueden reproducir (p.ej., la portada 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 desde la tasa de bits del fotograma después del fotograma Info, que puede ser artificialmente pequeña, p.ej., el fotograma PCUT (#1376).
    • Se corrigió la extracción de formato de audio PCM en contenedores AVI.
  • Audio:
    • Se corrigieron los atributos de codificación de DTS:X Profile 2 para la reproducción de transferencia (#1299).
    • Para 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() para 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, estéreo a mono) podían hacer que el procesador arrojara una excepción (#1352).
    • Implementa MediaCodecAudioRenderer.getDurationToProgressUs() para que MediaCodecAudioRenderer pueda realizar progresos cuando ExoPlayer programe de forma dinámica su bucle de trabajo principal.
  • Video:
    • Se solucionó el 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 a fin de usar un decodificador AV1 compatible si es necesario (#1389).
    • Se corrigió la excepción de códec que puede producirse cuando se habilita un renderizador de video durante la reproducción.
  • Texto:
    • Se solucionó el 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 de análisis de subtítulos para que se realice durante la extracción en lugar de durante la renderización (consulta el diagrama de arquitectura de ExoPlayer para conocer la diferencia entre extracción y renderización).
      • Para anular este cambio, llama a ambos MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) y TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulta los documentos sobre 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 personalizadas de SubtitleDecoder deben actualizarse 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 establece que se debe suponer que rowLock y columnLock son verdaderos, independientemente de los valores presentes en la transmisión (no se implementó la compatibilidad con columnLock, por lo que se supone que siempre es falso).
      • Esto se incluyó originalmente en las notas de la versión 1.3.0-alpha01, pero el cambio se revirtió accidentalmente antes del lanzamiento de 1.3.0-rc01. Este problema ya se solucionó, por lo que el cambio vuelve a estar presente.
    • CEA-708: Evita que ExoPlayer agregue líneas nuevas duplicadas con el manejo ingenuo del comando "set pen location" (#1315).
    • Corrige un IllegalArgumentException de LegacySubtitleUtil cuando una muestra de subtítulos WebVTT no contiene indicadores, p.ej., como parte de una transmisión DASH (#1516).
  • Metadatos:
    • Se corrigió la asignación de MP4 a etiquetas de clasificació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.
    • Se propagó la trama TCON de ID3 a MediaMetadata.genre (#1305).
  • Imagen:
    • Se agregó compatibilidad con cuadrículas de miniaturas DASH no cuadradas (#1300).
    • Se agregó compatibilidad con AVIF para niveles de API 34 y superiores.
    • Permite null como parámetro para ExoPlayer.setImageOutput() para borrar un ImageOutput configurado anteriormente.
  • DataSource:
    • Implementa la compatibilidad con los URIs de recursos sin procesar de android.resource://package/id, en los que package es diferente del paquete de la aplicación actual. Anteriormente, no se documentaba que funcionara, pero es una forma más eficiente de acceder a los recursos en otro paquete que por nombre.
    • Verifica con entusiasmo que url no sea nulo en los constructores de DataSpec. Este parámetro ya se anoto como no nulo.
    • Permite que ByteArrayDataSource resuelva un URI en un array de bytes durante open(), en lugar de estar codificado de forma fija en la construcción (#1405).
  • DRM:
    • Se permite configurar un LoadErrorHandlingPolicy en DefaultDrmSessionManagerProvider (#1271).
  • Efecto:
    • Admite varios cambios de velocidad dentro del mismo EditedMediaItem o Composition en SpeedChangeEffect.
    • Compatibilidad con la 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 HLG en ExoPlayer.setVideoEffect y Debug SurfaceView de Transformer.
    • Actualiza la implementación de la matriz de superposición para que sea coherente con la documentación. Para ello, invierte 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ó el error por el que TimestampWrapper fallaba cuando se usaba con ExoPlayer#setVideoEffects (#821).
    • Cambia el espacio de trabajo de color SDR predeterminado de los colores lineales a los videos SDR eléctricos BT 709. También proporciona una tercera opción para conservar el espacio de color original.
    • Se permite definir un orden en Z indeterminado de EditedMediaItemSequences (#1055).
    • Mantén un rango de luminancia coherente en los diferentes elementos de contenido HDR (usa el rango HLG).
    • Se agregó compatibilidad con superposiciones Ultra HDR (mapa de bits) en el contenido HDR.
    • Permite que se usen efectos SeparableConvolution antes de la API 26.
    • Quita los OverlaySettings.useHdr que no se usen, 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 necesaria para que las apps reproduzcan flujos 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 durante el tiempo 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).
    • Modifica la versión del SDK de IMA a la 3.33.0 para corregir un NullPointerException cuando se usan URIs de etiquetas de anuncio 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 se debe detener el servicio en onTaskRemoved() (#1219).
    • Agrega MediaSessionService.pauseAllPlayersAndStopSelf() que, de manera conveniente, permite pausar la reproducción de todas las sesiones y llamar 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 detenga el servicio de otra manera.
    • Para ocultar la barra de desplazamiento en la notificación multimedia de las transmisiones en vivo, no configures 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 lógica preferidos cuando selecciones propiedades de metadatos como en media1.
    • Se agregó MediaSession.sendError(), que permite enviar errores recuperables al controlador 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 controlador 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 media3 que se puede usar para probar las interacciones con apps que publican una sesión multimedia.
    • Propagación de los elementos adicionales pasados al MediaSession[Builder].setSessionExtras() de media3 al PlaybackStateCompat.getExtras() de un controlador de media1
    • Asigna errores irrecuperables y recuperables a la sesión de la plataforma y viceversa. Un PlaybackException se asigna a un estado de error irrecuperable de 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 y el mensaje de error, pero el estado de la sesión de la plataforma sigue siendo diferente de STATE_ERROR.
    • Permite que la actividad de la sesión se configure 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 conecte, la actividad de la sesión se puede actualizar con MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Se mejoró la replicación de errores de las llamadas a MediaLibrarySession.Callback. Ahora se puede configurar la replicación de errores 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 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:
    • Asegúrate de que DownloadHelper no filtre instancias de Renderer que aún no se lanzaron, lo que podría provocar que una app falle con IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Extensión de Cronet:
    • Se corrigió SocketTimeoutException en CronetDataSource. En algunas versiones de Chromet, 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 los ejemplos de EMSG pendientes que esperaban una discontinuidad se delegaban en HlsSampleStreamWrapper con una compensación incorrecta, lo que generaba un IndexOutOfBoundsException o un IllegalArgumentException (#1002).
    • Se corrigió el error por el que las playlists que no son principales se volvían a cargar para las transmisiones LL-HLS (#1240).
    • Se corrigió el error que se generaba cuando se habilitaba CMCD para HLS con segmentos de inicialización, lo que 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ó el error que se generaba cuando se habilitaba CMCD para las transmisiones en vivo de HLS (#1395).ArrayIndexOutOfBoundsException
  • Extensión de DASH:
    • Se corrigió un error por el que la preparación de una transmisión en vivo de varios períodos podía generar una IndexOutOfBoundsException (#1329).
    • Se agregó compatibilidad con las URLs de licencias dashif:Laurl (#1345).
  • Extensión de Cast:
    • Se corrigió el error que convertía el título del álbum de MediaQueueItem en el artista del elemento multimedia Media3 (#1255).
  • Utilidades de prueba:
    • Se implementó onInit() y onRelease() en FakeRenderer.
    • Cambia los métodos TestPlayerRunHelper.runUntil()/playUntil() para que fallen en errores recuperables (p.ej., los informados 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 breve.
    • 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 quitaron 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 quitaron los constructores OkHttpDataSource y OkHttpDataSourceFactory. En su lugar, usa OkHttpDataSource.Factory.
    • 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 quitaron 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 quitó el método DrmSessionManager.DUMMY y getDummyDrmSessionManager(). En su lugar, usa DrmSessionManager.DRM_UNSUPPORTED.
    • Se quitaron AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format) y VideoRendererEventListener.onVideoInputFormatChanged(Format). En su lugar, usa las sobrecargas que toman un DecoderReuseEvaluation.
    • Se quitan RendererSupport.FormatSupport IntDef y las constantes FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE y FORMAT_UNSUPPORTED_TYPE. En su lugar, usa la IntDef y las constantes equivalentes en androidx.media3.common.C (p.ej., C.FORMAT_HANDLED).
    • Se quitó 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 contiene estas confirmaciones.

  • Biblioteca común:
    • Agrega Format.labels para permitir etiquetas localizadas o de otro tipo.
  • ExoPlayer:
    • Se solucionó un problema por el que PreloadMediaPeriod no podía retener las transmisiones cuando se volvía a precargar.
    • Aplica el TrackSelectionResult correcto al período de reproducción en la reselección de pistas.
    • Inicia los renderizadores habilitados con anticipación 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 retorno faltante a la regla -keepclasseswithmembers de Proguard para DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformador:
    • Se agregó una solución para la excepción que se generaba debido a que MediaMuxer no admitía marcas de tiempo de presentación negativas antes de la API 30.
  • Selección de pistas:
    • DefaultTrackSelector: Se prefieren 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 no establecida. Esto garantiza que el reproductor seleccione la pista de video "real" en los archivos 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 omitió el padding cuando se leían fragmentos de tamaño impar de archivos WAV (#1117).
    • MP3: Completa Format.averageBitrate a partir de marcos de metadatos, como XING y VBRI.
    • MPEG-TS: Se revierte un cambio que tenía como objetivo garantizar que se renderice la última trama 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 HLS de solo fotogramas I (#1150) y las transmisiones HLS de H.262 (#1126).
  • Audio:
    • Para permitir la recuperación del renderizador, inhabilita 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 de dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que causaba que las transmisiones H265 de 60 fps se marcaran como no compatibles.
    • Se agregó una solución alternativa que garantiza que el primer fotograma siempre se renderice durante el tunelización, incluso si el dispositivo no lo hace automáticamente, como lo requiere la API (#1169). (#966).
    • Se corrigió el 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: Evita que las indicaciones consecutivas directas creen instancias adicionales de CuesWithTiming falsas a partir de WebvttParser.parse (#1177).
  • DRM:
    • Se solucionó un problema con un NoSuchMethodError que puede arrojar el framework MediaDrm en lugar de ResourceBusyException o NotProvisionedException en algunos dispositivos Android 14 (#1145).
  • Efecto:
    • Se mejoró la asignación de tonos de PQ a SDR mediante la conversión de espacios de color.
  • Sesión:
    • Se corrigió el problema por el que la posición actual retrocedía cuando el controlador reemplazaba el elemento actual (#951).
    • Se corrigió el problema por el que MediaMetadata con solo extras no nulo no se transmitía entre controladores y sesiones de música (#1176).
  • IU:
    • Se incluye el nombre del idioma de la pista de audio como resguardo si Locale no puede identificar un nombre visible (#988).
  • Extensión de DASH:
    • Se completan 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étera):
    • Inhabilita 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 contiene estas confirmaciones.

  • Biblioteca común:
    • Se implementó 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 funcionaba, pero no se implementó correctamente hasta ahora.
    • Normaliza los tipos MIME establecidos por el código de la app o leídos de los medios para que sean 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 carga previa implementando PreloadMediaSource.PreloadControl y configuran 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.
    • 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 habilitarlo con MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Admite fuentes de medios adaptables con PreloadMediaSource.
    • Implementa HttpEngineDataSource, un HttpDataSource con la API de HttpEngine.
    • Evita la creación de subclases de CompositeSequenceableLoader. Este componente se había hecho extensible anteriormente, pero nunca se creó una subclase dentro de la biblioteca. Para realizar personalizaciones, une una instancia con el patrón de decorador y, luego, implementa un CompositeSequenceableLoaderFactory personalizado.
    • Se corrigió el problema por el que repetir la misma hora hacía 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 fuente 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 los 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 transmuxing, en especial para las ediciones de "quitar video".
    • Se agregó la API para garantizar que el archivo de salida comience en un fotograma de video. 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 activo.
    • Se agregó compatibilidad para garantizar que un fotograma de video tenga la primera marca de tiempo en el archivo de salida. Se corrigieron los archivos de salida que comenzaban con un marco negro en reproductores basados en iOS (#829).
  • Selección de pistas:
    • Agrega DefaultTrackSelector.selectImageTrack para habilitar la selección de segmentos de imagen.
    • Agrega TrackSelectionParameters.isPrioritizeImageOverVideoEnabled para determinar si se debe seleccionar una pista de imagen si hay una pista de imagen y una de video disponibles. 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 AV1C adicional al extractor de MP4 para recuperar los valores ColorInfo.colorSpace, ColorInfo.colorTransfer y ColorInfo.colorRange (#692).
    • MP3: Usa la búsqueda de tasa de bits constante (CBR) para archivos con un encabezado Info (el equivalente CBR del encabezado Xing). Anteriormente, usábamos la tabla de búsqueda del encabezado Info, pero esto generaba búsquedas menos precisas que si lo ignoráramos y asumiéramos 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 TS y se asignan a marcas de función, lo que permite a los usuarios realizar selecciones de pistas de audio mejor informadas (#973).
  • Audio:
    • Se mejoró el algoritmo de omisión de silencio con una rampa de volumen suave, se retuvo el silencio mínimo y se obtuvieron duraciones de silencio más naturales (#7423).
    • Se informa el silencio omitido de forma más determinista (#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 destino de video a MediaCodecVideoRenderer.
  • Texto:
    • Se corrigió la serialización de indicadores 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 establece que se debe suponer que rowLock y columnLock son verdaderos, independientemente de los valores presentes en la transmisión (no se implementó la compatibilidad con columnLock, por lo que se supone que siempre es falso).
  • Imagen:
    • Se agregó compatibilidad con miniaturas de DASH. Las imágenes de la cuadrícula se recortan y se proporcionan miniaturas individuales a ImageOutput cerca de sus tiempos de presentación.
  • DRM:
  • Extensión IMA:
    • Se corrigió el problema por el que no se podían reproducir los anuncios DASH y HLS sin la extensión de archivo adecuada.
  • Sesión:
    • Inhabilita la detección de doble clic para apps para TV (#962).
    • Se corrigió el problema por el que MediaItem.RequestMetadata con solo extras no nulos no se transmitía entre los controladores de contenido multimedia y las sesiones.
    • Se agregó un constructor a MediaLibrarySession.Builder que solo toma un Context en lugar de un MediaLibraryService.
  • Extensión HLS:
    • Se redujo HlsMediaPeriod a la visibilidad de paquete privado. No se debe depender directamente de este tipo desde fuera del paquete 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étera):
    • Decodificador MIDI: Ignora 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 otras acciones.
  • 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ó el problema por el que los saltos manuales fuera del rango de LiveConfiguration.min/maxOffset seguían ajustando el desplazamiento a min/maxOffset.
    • Se corrigió el 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 que la transmisión comenzara de forma incorrecta 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 las fuentes de fragmentos, lo que generaba un IllegalArgumentException (#888).
  • Transformador:
    • Se solucionó un problema por el que el codificador se arrojaba en el momento de la configuración debido a que se establecía una tasa de operación alta.
  • Extractores:
    • Marca las pistas HEVC secundarias (no reproducibles) 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 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 manejo de EOS para SilenceSkippingAudioProcessor cuando se lo llamaba varias veces (#712).
  • Video:
    • Se agregó una solución para un problema de dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que causaba que las transmisiones de AVC de 60 fps se marcaran como no compatibles (#693).
  • Metadatos:
    • Se corrigió un error por el que MediaMetadata solo se propagaba desde los comentarios de Vorbis con claves en mayúsculas (#876).
    • Captura 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 para la URL de licencia https://default.url de ClearKey falsa al nivel de API 33 y versiones posteriores (antes, la solución solo se aplicaba al nivel de API 33 exactamente) (#837).
    • Se corrigió ERROR_DRM_SESSION_NOT_OPENED cuando se cambiaba de contenido encriptado a contenido claro sin una superficie conectada al reproductor. El error se produjo debido al uso incorrecto de un decodificador seguro para reproducir el contenido claro.
  • Sesión:
    • Se colocaron las claves y los valores personalizados en MediaMetadataCompat a MediaMetadata.extras y MediaMetadata.extras a MediaMetadataCompat (#756, #802).
    • Se corrigió la transmisión de notifyChildrenChanged para controladores heredados (#644).
    • Se corrigió un error en el que establecer un tiempo negativo para un temporizador setWhen inhabilitado de la notificación causaba una falla en algunos dispositivos (#903).
    • Se corrigió IllegalStateException cuando el controlador de notificaciones multimedia no completaba la conexión cuando se solicitaba la primera actualización de notificación (#917).
  • IU:
    • Se solucionó el problema por el que los botones para avanzar y retroceder no se veían cuando se usaban con Material Design en un BottomSheetDialogFragment (#511).
    • Se solucionó un problema por el que los números en el botón de avance rápido de PlayerControlView estaban desalineados (#547).
  • Extensión de DASH:
    • Se analiza "f800" como un recuento de canales de 5 para Dolby en el manifiesto de DASH (#688).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etcétera):
    • MIDI: Se corrigió el problema por el que el avance saltaba los eventos de cambio de programa (#704).
    • Migra a FFmpeg 6.0 y actualiza el NDK compatible a r26b (#707, #867).
  • Extensión de Cast:
    • Se sanciona la creación de un Timeline para que la app no falle cuando se carga contenido multimedia en el dispositivo de transmisión (#708).

Versión 1.2.0

15 de noviembre de 2023

  • Biblioteca común:
    • Se agregó 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 así lo desean (posiblemente con Logger.appendThrowableString(String, Throwable)).
    • Se corrigió el problema de compatibilidad de Kotlin en el que los parámetros de tipo genérico anulable y los tipos de elementos de array anulables no se detectaban como anulables. Algunos ejemplos son los parámetros de método TrackSelectorResult y SimpleDecoder (#6792).
    • Cambia el comportamiento predeterminado de la IU y las notificaciones en Util.shouldShowPlayButton para mostrar un botón de reproducción mientras se suprime temporalmente la reproducción (p.ej., debido a una pérdida transitoria del foco de audio). Se puede mantener el comportamiento heredado 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.
    • Mueve ExoPlayer.setAudioAttributes a la interfaz Player.
  • ExoPlayer:
    • Se corrigieron los problemas de salto en las transmisiones AC4 causados 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 contenido 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 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ía y lee un archivo PNG completo en TrackOutput como un solo sample.
    • Mejora el método SequenceableLoader.continueLoading(long) en la interfaz SequenceableLoader a 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 inicio (su) (#8699).
    • Se agregó la profundidad de bits de luma y crominancia 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).
    • Agrega el parámetro MediaPeriodId a CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Se admite ClippingMediaSource (y otras fuentes con desfases 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 imagen.
    • 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 corregir 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 denegar de forma explícita la adaptación no fluida. El valor predeterminado permanece en su comportamiento actual de true.
  • Extractores:
    • MPEG-TS: Asegúrate de que se renderice la última fotograma pasando la última unidad de acceso de una transmisión a la cola de muestras (#7909).
    • Se corrigió un error de ortografía cuando se determinaba rotationDegrees. Se cambió projectionPosePitch por projectionPoseRoll (#461).
    • Se quitó la suposición de que las instancias de Extractor se pueden inspeccionar directamente con instanceof. Si deseas obtener acceso al tiempo 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 de big-endian de 24/32 bits en MP4 y Matroska, y se analizó la codificación de PCM para lpcm en MP4.
    • Se agregó compatibilidad para extraer audio Vorbis en MP4.
    • Se agregó 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. Muestra el nuevo AudioOffloadSupport que contiene isFormatSupported, isGaplessSupported y isSpeedChangeSupported.
    • Agrega AudioSink.setOffloadMode() a través del cual se configura la configuración de descarga en el objeto sink 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 como 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.
    • Se inhabilitó la compatibilidad sin interrupciones para la descarga cuando se usa un nivel de API anterior al 33 debido a un problema de posición de reproducción después de la transición de pista.
    • Se quitó el parámetro enableOffload de la firma del método DefaultRenderersFactory.buildAudioSink.
    • Quita el método DefaultAudioSink.Builder.setOffloadMode.
    • Se quitó el valor intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Se agregó compatibilidad con los metadatos sin interrupciones de Opus durante la reproducción de descarga.
    • Para permitir la recuperación del renderizador, inhabilita la descarga si falla en la primera escritura (#627).
    • Habilita la programación de transferencia de forma predeterminada para la reproducción transferida de solo 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 transferencia 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 del búfer de audio 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. TextRenderer ahora controla directamente las pistas de texto con sampleMimeType = application/x-media3-cues sin necesidad de una instancia de SubtitleDecoder.
  • Metadatos:
    • Ya no se llamará a MetadataDecoder.decode para muestras de "solo decodificación", ya que la implementación debe mostrar un valor nulo de todos modos.
  • 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 sea de bloqueo. 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 podía generar 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 en 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 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 medios que recibe MediaSessionService.onStartCommand() en Media3 en lugar de enrutarlos a la sesión de la plataforma y volver a Media3. Con esto, el controlador de llamadas siempre es el controlador de notificaciones 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 para el 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).
    • Agrega el módulo de demostración de sesión para el SO Automotive y habilita la demostración de sesión 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 multimedia. Con Android Auto como controlador de cliente que lee desde la sesión del framework, el botón queue de la IU de Android Auto no se muestra (#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 manejo de eventos de botones multimedia predeterminados.
  • 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. Para ello, inicia un diálogo del sistema para permitir que un usuario conecte 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 de DASH:
    • Se permite el uso de varios identificadores DASH iguales en la URL de la plantilla de segmento.
    • Se agregó compatibilidad experimental para analizar subtítulos durante la extracción. Esto tiene una mejor compatibilidad para combinar subtítulos superpuestos, lo que incluye resolver el parpadeo cuando se realiza la transición entre segmentos de subtítulos. Puedes habilitar esta función con DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Extensión RTSP:
    • Se corrigió una condición de carrera que podía generar IndexOutOfBoundsException cuando se volvía a TCP o la reproducción se bloqueaba en algunas situaciones.
    • Se verifica el estado en la configuración de RTSP cuando se muestra 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 mantenimiento de la conexión (#662).
  • Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etcétera):
    • Lanza el módulo de decodificador MIDI, que admite la reproducción de archivos MIDI estándar con la biblioteca Jsyn para sintetizar audio.
    • Agrega DecoderOutputBuffer.shouldBeSkipped para marcar directamente los búferes de salida que no se necesitan presentar. Esta opción es preferible a C.BUFFER_FLAG_DECODE_ONLY, que dejará de estar disponible.
    • Agrega Decoder.setOutputStartTimeUs y SimpleDecoder.isAtLeastOutputStartTimeUs para permitir que los decodificadores descarten muestras de solo decodificación antes de la hora de inicio. Se debe preferir a Buffer.isDecodeOnly, que dejará de estar disponible.
    • Se corrigió el error de publicación del 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. Se corrigió un error por el que la reproducción avanzaba de forma no determinista durante las interacciones de la vista de Espresso o Compose.
  • Se quitan los símbolos obsoletos:
    • Se quitan 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 que no sea obsoleto y 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 agregada 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 medios comunes (CMCD): formato de transmisión (sf), tipo de transmisión (st), versión (v), tasa de bits superior (tb), duración del objeto (d), rendimiento medido (mtp) y tipo de objeto (ot) (#8699).
  • Audio:
    • Se corrigió un error por el que Player.getState() nunca realizaba la transición a STATE_ENDED cuando se reproducían archivos muy cortos (#538).
  • Transferencia de audio:
    • Agrega el encabezado de ID de Ogg y las páginas de encabezado de comentarios al flujo de bits para la reproducción de Opus descargada de acuerdo con la 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 las especificaciones) (#11019).
  • Extensión IMA:
    • Modifica la versión del SDK de IMA a la versión 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 desean enviar diferentes diseños personalizados a diferentes controladores 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 generaba un UnsupportedOperationException (#78).
    • Corrige 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:
    • Se agregó un motivo de supresión para la ruta de audio no adecuada y se reproduce cuando está lista. Se cambió el motivo de supresión por un período demasiado largo. (#15).
    • Agrega comandos al reproductor:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Se agregaron métodos sobrecargados al reproductor 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.
    • Agrega Player.replaceMediaItem(s) como acceso directo para agregar y quitar elementos en la misma posición (#8046).
  • ExoPlayer:
    • Permite que ExoPlayer tenga control de 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 segmentos disponibles desde 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 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 teclas personalizado.
    • Se agregó una acción adicional al manifiesto de la demo principal para facilitar el inicio de la app de demo con un archivo *.exolist.json personalizado (#439).
    • Se agregó ExoPlayer.setVideoEffects() para usar Effect durante la reproducción de video.
    • Actualiza SampleQueue para almacenar sourceId como long en lugar de int. Esto cambia las firmas de los métodos públicos SampleQueue.sourceId y SampleQueue.peekSourceId.
    • Se agregaron parámetros a los métodos LoadControl shouldStartPlayback y onTracksSelected que permiten asociar estos métodos con el MediaPeriod relevante.
    • Para cambiar la firma de ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), agrega un parámetro de cronograma que contenga los períodos con los UIDs que se usan como claves en el mapa. Esto es necesario para evitar problemas de simultaneidad con transmisiones en vivo de varios períodos.
    • EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) y BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) dejaron de estar disponibles. En su lugar, se puede llamar a la variante de los métodos sin mediaTimeOffsetUs. Ten en cuenta que, incluso para las variantes obsoletas, el desplazamiento ya no se agrega a startTimeUs y 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 inconsistente entre ExoPlayer.setMediaItem(s) y addMediaItem(s) cuando se llamaba a una playlist 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 muxer) 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 está habilitado, DefaultTrackSelector activará una nueva selección de pista cuando cambien las capacidades del renderizador.
  • Extractores:
    • Ogg: Se corrigió el error que se producía cuando se saltaba en archivos con una duración larga (#391).
    • FMP4: Se corrigió el problema por el que TimestampAdjuster inicializaba un desfase de marca de tiempo incorrecto con la hora de muestra de metadatos del átomo de emsg (#356).
  • Audio:
    • Se corrigió un error por el que algunas reproducciones fallaban cuando el tunelización estaba habilitada y AudioProcessors estaba activo, p.ej., para el recorte sin interrupciones (#10847).
    • Encapsula los fotogramas de Opus en paquetes Ogg en reproducciones directas (transferencia).
    • Extrapolar la posición actual durante el modo de 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 jugador.
    • Escucha los 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 nuevo evento onAudioCapabilitiesChanged en la interfaz AudioSink.Listener y una nueva interfaz RendererCapabilities.Listener que activa eventos onRendererCapabilitiesChanged.
    • Se agregó ChannelMixingAudioProcessor para aplicar escalamiento o mezcla a los canales de audio.
    • Se agregó el nuevo valor int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons para descartar el decodificador de audio cuando el modo de omisión es posible después de que cambian las capacidades de audio.
    • Se agregó compatibilidad con la reproducción directa de 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 cuando aún no se determina el tamaño de la pista de video compatible.
  • DRM:
    • Se redujo la visibilidad de varios métodos solo para 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 muxer que se puede usar para crear un archivo de contenedor de MP4.
  • Extensión IMA:
    • Habilita transmisiones en vivo de DASH de varios períodos para la DAI. Ten en cuenta que la implementación actual aún no admite el salto en transmisiones en vivo (#10912).
    • Se corrigió un error en el que se insertaba un grupo de anuncios nuevo en las transmisiones en vivo porque la posición del contenido calculada en cronogramas consecutivos variaba ligeramente.
  • Sesión:
    • Agrega el método auxiliar MediaSession.getControllerForCurrentRequest para obtener información sobre el controlador que llama actualmente a un método Player.
    • 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 que envía, por ejemplo, un auricular Bluetooth (#167).
    • Se agregó la implementación predeterminada a MediaSession.Callback.onAddMediaItems para permitir que el MediaItems solicitado se pase a Player si tiene LocalConfiguration (p.ej., URI) (#282).
    • Se agregaron los botones de comando "avanzar al elemento anterior" y "avanzar al elemento 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 el MediaItems solicitado se pase a Player si tiene LocalConfiguration (p.ej., URI) (#282).
    • Se agregaron los botones de comando "avanzar al elemento anterior" y "avanzar al elemento 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 Util shouldShowPlayButton y handlePlayPauseButtonAction para escribir elementos de 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 SDP de respuesta de descripción (#302).
    • Usa el URI base para la resolución de la ruta de acceso relativa desde la sesión de RTSP si está presente en el encabezado de respuesta DESCRIBE (#11160).
  • Extensión de DASH:
    • Quita la compensación de tiempo de los medios de MediaLoadData.startTimeMs y MediaLoadData.endTimeMs para las transmisiones DASH de varios períodos.
    • Se corrigió un error por el que la nueva preparación de una fuente de contenido multimedia 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 genera un PlaybackException para evitar que la reproducción se detenga sin fin. El tiempo de espera se establece en cero de forma predeterminada (#323).
  • Utilidades de prueba:
    • Verifica si el esquema de URI distingue 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.
    • Se quitó HlsMasterPlaylist; en su lugar, usa HlsMultivariantPlaylist.
    • Se quita Player.stop(boolean). En su lugar, usa Player.stop() y Player.clearMediaItems() (si reset es true).
    • Se quitaron dos constructores SimpleCache obsoletos. Usa un constructor que no sea obsoleto que tome un DatabaseProvider en su lugar para obtener un mejor rendimiento.
    • Se quitó el constructor DefaultBandwidthMeter; en su lugar, usa DefaultBandwidthMeter.Builder.
    • Se quitan los constructores DefaultDrmSessionManager. Usa DefaultDrmSessionManager.Builder en su lugar.
    • Se quitaron dos constructores HttpDataSource.InvalidResponseCodeException obsoletos y se usa un constructor que no es obsoleto y que acepta campos adicionales(cause, responseBody) para mejorar el registro de errores.
    • Quita DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash y DownloadHelper.forSmoothStreaming, y usa DownloadHelper.forMediaItem.
    • Se quitó el constructor DownloadService obsoleto. Usa un constructor que no esté obsoleto y que incluya la opción de proporcionar un parámetro channelDescriptionResourceId.
    • Se quitaron las constantes de String 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 y se usa un constructor que no está obsoleto y que incluye la opción de proporcionar un parámetro Context.
    • Se quitaron los métodos obsoletos createVideoSampleFormat, createAudioSampleFormat, createContainerFormat y createSampleFormat, que se usaban para crear instancias de la clase Format. En su lugar, usa Format.Builder para crear instancias de Format.
    • Quita los métodos obsoletos copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate y copyWithVideoSize. En su lugar, usa Format.buildUpon() y los métodos set.
    • Se quitó el objeto ExoPlayer.retry() obsoleto; en su lugar, usa prepare().
    • Se quitó el constructor DefaultTrackSelector obsoleto con 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.
    • Se quitaron los elementos Player.Listener.onSeekProcessed y AnalyticsListener.onSeekProcessed obsoletos; en su lugar, usa onPositionDiscontinuity con DISCONTINUITY_REASON_SEEK.
    • Quita ExoPlayer.setHandleWakeLock(boolean) y usa setWakeMode(int) en su lugar.
    • Se quitó el objeto DefaultLoadControl.Builder.createDefaultLoadControl() obsoleto; en su lugar, usa build().
    • Se quitó el objeto MediaItem.PlaybackProperties obsoleto; 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 solucionó el problema por el que es posible que no se renderice el último fotograma si el último muestreo con fotogramas se quita de la cola sin leer el muestreo 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 de 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 solucionó el 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 un 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 objetivo cuando se busca la posición predeterminada (#11051).
    • Se corrigió un error por el que las transmisiones de muestras vacías en el contenido multimedia podían provocar que la reproducción se bloqueara.
  • Sesión:
    • Se corrigió el error por el que varios elementos de fila 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ó el error por el que llamar a MediaSession.setPlayer no actualizaba los comandos disponibles.
    • Se corrigió el 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ó el problema por el que Player.COMMAND_GET_CURRENT_MEDIA_ITEM debía estar disponible para acceder a los metadatos a través de MediaSessionCompat heredado.
    • Se corrigió el 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 multimedia sin que la app lo hubiera previsto (#314).
  • DASH:
    • Se corrigió el manejo de cronogramas de segmentos vacíos (#11014).
  • RTSP:
    • Vuelve a intentarlo 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ó NullPointerException cuando se llama a ExoPlayer.isTunnelingEnabled (#10977).
  • Descargas:
    • Haz que la diferencia máxima de la hora de inicio de los dos segmentos que se combinarán sea configurable en SegmentDownloader y subclases (#248).
  • Audio:
    • Se corrigió la reproducción de MP3 sin interrupciones en dispositivos Samsung (#8594).
    • Se corrigió el error por el que un cambio de velocidad anterior podía anular las velocidades de reproducción establecidas inmediatamente después de inhabilitar el audio (#10882).
  • Video:
    • Asigna el formato HEVC HDR10 a HEVCProfileMain10HDR10 en lugar de a HEVCProfileMain10.
    • Se agregó una solución para un problema de dispositivo en Chromecast con Google TV y Lenovo M10 FHD Plus que causaba que las transmisiones de AVC de 60 fps se marcaran como no compatibles (#10898).
    • Se corrigieron problemas de rendimiento de lanzamiento 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 STATE_IDLE transitorio cuando se realiza la transición entre elementos multimedia (#245).
  • RTSP:
    • Se captura la IllegalArgumentException que se arroja en el análisis de mensajes de respuesta de 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 comenzaran las transmisiones de DAI sin anuncios porque no se recibía el primer (y, en el caso sin anuncios, el único) evento LOADED.

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

Se lanzó androidx.media3:media3-*:1.0.0-beta01. La versión 1.0.0-beta01 contiene estas confirmaciones.

Esto corresponde a ExoPlayer versión 2.18.0.

  • 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 ExoPlayer versión 2.17.1.

  • 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 ExoPlayer versión 2.17.0.

  • 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.