Media3
Actualización más reciente | Versión estable | Versión potencial | Versión beta | Versión alfa |
---|---|---|---|---|
10 de julio de 2024 | 1.3.1 | 1.4.0-rc01 | 1.4.0-beta01 | 1.4.0-alpha02 |
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.4.0
Versión 1.4.0-rc01
10 de julio de 2024
Lanzamiento de androidx.media3:media3-*:1.4.0-rc01
.
La versión 1.4.0-rc01 contiene estas confirmaciones.
- Biblioteca común:
- Agrega
Format.customData
para almacenar información personalizada que proporciona la app sobre las instancias deFormat
.
- Agrega
- ExoPlayer:
- Se corrigieron algunas inconsistencias del foco de audio, p.ej., que no se informaba la pérdida de enfoque completa o transitoria mientras el reproductor estaba en pausa (#1436).
- Se corrigió el
IndexOutOfBoundsException
potencial causado por extractores que informan segmentos adicionales después del paso de preparación inicial (#1476). Effects
enExoPlayer.setVideoEffect()
recibirá las marcas de tiempo sin el desplazamiento del procesador quitado (#1098).- Se corrigió un posible error de
IllegalArgumentException
cuando se administra el error del reproductor que se producía mientras se leía hacia adelante en otro elemento de la playlist (#1483).
- Texto:
- Se corrigió una
IllegalArgumentException
deLegacySubtitleUtil
cuando una muestra de subtítulo de WebVTT no contiene indicaciones, p.ej., como parte de una transmisión DASH (#1516).
- Se corrigió una
- Sesión:
- Permite que la actividad de la sesión se configure por controlador para anular la actividad de sesión global. Se puede definir la actividad de la sesión para un controlador en el momento de la conexión creando un
ConnectionResult
conAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. Una vez conectada, la actividad de la sesión se puede actualizar conMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - Mejora la replicación de errores de las llamadas a
MediaLibrarySession.Callback
. La replicación de errores ahora se puede configurar conMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
para elegir el tipo de error o inhabilitar la replicación de errores, que está activada de forma predeterminada.
- Permite que la actividad de la sesión se configure por controlador para anular la actividad de sesión global. Se puede definir la actividad de la sesión para un controlador en el momento de la conexión creando un
- IU:
- Soluciona un error de la plataforma que causaba videos estirados o recortados cuando se usaba
SurfaceView
dentro de unAndroidView
de Compose en el nivel de API 34 (#1237).
- Soluciona un error de la plataforma que causaba videos estirados o recortados cuando se usaba
- App de demostración:
- Usa
HttpEngineDataSource
comoHttpDataSource
cuando el dispositivo lo admita.
- Usa
Versión 1.4.0-beta01
26 de junio de 2024
Lanzamiento de androidx.media3:media3-*:1.4.0-beta01
.
La versión 1.4.0-beta01 contiene estas confirmaciones.
- ExoPlayer:
- Agrega
ExoPlayer.isReleased()
para verificar si se llamó aExoplayer.release()
. - Se agregó
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs
a fin de configurar la posición máxima para la queseekToPrevious()
busca el elemento anterior (#1425).
- Agrega
- Transformador:
- Quitar el campo
ExportResult.processedInputs
. Si usas este campo para los detalles del códec, utilizaDefaultDecoderFactory.listener
en su lugar. En caso de una excepción de códec, los detalles de códec estarán disponibles en elExportException.codecInfo
.
- Quitar el campo
- Extractores:
- Se corrigió la extracción del formato de audio PCM en contenedores AVI.
- Imagen:
- Permite
null
como parámetro para queExoPlayer.setImageOutput
borre unImageOutput
configurado previamente.
- Permite
- Efecto:
- Quita los elementos
OverlaySettings.useHdr
que no se usan, ya que deben coincidir con el rango dinámico de la superposición y el marco. - Se agregó compatibilidad con HDR para
TextOverlay
. La luminosidad de la superposición de texto se puede ajustar conOverlaySettings.setHdrLuminanceMultiplier
.
- Quita los elementos
- Sesión:
- Agrega
MediaSession.Callback.onPlayerInteractionFinished
para informar las sesiones cuando finaliza una serie de interacciones de un jugador desde un control específico. - Agrega
SessionError
y úsalo enSessionResult
yLibraryResult
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 interacciones con apps que publican una sesión multimedia.
- Se propagan los elementos adicionales que se pasan al
MediaSession[Builder].setSessionExtras()
de media3 alPlaybackStateCompat.getExtras()
de un controlador media1. - Asigna errores fatales y no fatales desde y hacia la sesión de la plataforma. Un
PlaybackException
se asigna a un estado de error irrecuperable dePlaybackStateCompat
. UnSessionError
enviado al controlador de notificaciones multimedia conMediaSession.sendError(ControllerInfo, SessionError)
se asigna a un error recuperable enPlaybackStateCompat
, lo que significa que se configuraron el código de error y el mensaje, pero el estado de la sesión de la plataforma sigue siendo diferente aSTATE_ERROR
.
- Agrega
- IU:
- Se agregó compatibilidad con la pantalla de imágenes a
PlayerView
cuando se conecte a unaExoPlayer
(#1144). - Se agregó personalización de varios íconos en
PlayerControlView
a través de atributos XML para permitir diferentes elementos de diseño por instancia dePlayerView
, en lugar de anulaciones globales (#1200).
- Se agregó compatibilidad con la pantalla de imágenes a
- Extensión HLS:
- Se corrigió un error por el que las listas de reproducción no principales no se actualizaban durante la reproducción en vivo (#1240).
- Se quitan los símbolos obsoletos:
- Se quitó la interfaz
Bundleable
. Esto incluye quitar todos los campos de constantesBundleable.Creator<Foo> CREATOR
. En su lugar, los emisores deben usar los métodosBundle toBundle()
ystatic Foo fromBundle(Bundle)
en cada tipo.
- Se quitó la interfaz
Versión 1.4.0-alpha02
7 de junio de 2024
Lanzamiento de androidx.media3:media3-*:1.4.0-alpha02
.
La versión 1.4.0-alpha02 contiene estas confirmaciones.
- Biblioteca común:
- Reenvía las llamadas de búsqueda supuestas no-ops a los métodos
BasePlayer.seekTo
ySimpleBasePlayer.handleSeek
protegidos en lugar de ignorarlas. Si quieres implementar estos métodos en un reproductor personalizado, es posible que debas controlar estas llamadas adicionales conmediaItemIndex == C.INDEX_UNSET
. - Se quitó la dependencia de compilación en la expansión de sintaxis de Java 8 (#1312).
- Asegúrate de que se ignore la duración que se pasa a
MediaItem.Builder.setImageDurationMs
para unaMediaItem
que no sea de imagen (como se documenta).
- Reenvía las llamadas de búsqueda supuestas no-ops a los métodos
- ExoPlayer:
- Agrega
reset
aBasePreloadManager
para liberar todas las fuentes de retención y, al mismo tiempo, mantener la instancia del administrador de precarga. - Agrega
ExoPlayer.setPriority
(yBuilder.setPriority
) para definir el valor de prioridad que se usa enPriorityTaskManager
y para la importancia de MediaCodec de la API 35. - Se solucionó el problema con la actualización del tiempo de realmacenamiento en búfer más reciente que dio como resultado una clave incorrecta
bs
(inhabilitación del búfer) en CMCD (#1124). - Agrega
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
para indicar que la fuente se cargó hasta el final. Esto permite que las implementaciones deDefaultPreloadManager
yPreloadMediaSource.PreloadControl
personalizadas precargan la siguiente fuente o realicen otras acciones. - Se corrigió el error por el que la omisión de silencio al final de los elementos puede activar una excepción de reproducción
- Agrega
clear
aPreloadMediaSource
para descartar el período de precarga. - Agrega un nuevo código de error
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
, que se usa cuando se reclaman recursos de códecs para tareas de mayor prioridad. - Se 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 quitaba del manifiesto. - Cambia el nombre de
onTimelineRefreshed
poronSourcePrepared
y el deonPrepared
poronTracksSelected
enPreloadMediaSource.PreloadControl
. También cambia el nombre de los IntDefs enDefaultPreloadManager.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 el momento en que los procesadores pueden progresar.
Puedes habilitar esto con
experimentalSetDynamicSchedulingEnabled
cuando configures tu instancia de ExoPlayer. - Se agregó
Renderer.getDurationToProgressMs
, UnRenderer
puede implementar este método para mostrar a ExoPlayer la duración que debe avanzar la reproducción para que el procesador progrese. SiExoPlayer
se establece conexperimentalSetDynamicSchedulingEnabled
,ExoPlayer
llamará a este método cuando calcule el tiempo para programar su tarea de trabajo. - Agrega
MediaCodecAdapter#OnBufferAvailableListener
para alertar cuando los búferes de entrada y salida estén disponibles para que los useMediaCodecRenderer
.MediaCodecRenderer
indicaráExoPlayer
cuando reciba estas devoluciones de llamada y, siExoPlayer
se configura conexperimentalSetDynamicSchedulingEnabled
,ExoPlayer
programará su bucle de trabajo, ya que los procesadores pueden progresar. - Usa la clase de datos para los métodos
LoadControl
en lugar de parámetros individuales.
- Agrega
- Transformador:
- Se soluciona un error del decodificador en el que la cantidad de canales de audio se limitaba a estéreo cuando se manejaba 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
porandroidx.media3.muxer.Muxer
y quitaandroidx.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 AV.
- Extractores:
- MPEG-TS: reenvía el cambio para garantizar que se procese el último fotograma pasando la última unidad de acceso de una transmisión a la cola de muestra (#7909). Se incorporaron correcciones para resolver los problemas que surgieron en las transmisiones HLS de solo I-frame(#1150) y H.262 HLS (#1126).
- MP3: Se prefiere el tamaño de los datos de un marco
Info
sobre el tamaño informado por la transmisión subyacente (p.ej., el tamaño del archivo o el encabezado HTTPContent-Length
). Esto ayuda a excluir los datos de avances que no se pueden reproducir (p.ej., el material gráfico del álbum) de los cálculos de búsqueda a 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 la tasa de bits del fotograma después del fotogramaInfo
, que puede ser artificialmente pequeño, p.ej., un fotogramaPCUT
(#1376).
- Audio:
- Se corrigieron los atributos de codificación DTS:X del perfil 2 para la reproducción de transferencia (#1299).
- En el caso de la reproducción descargada, restablece el campo de seguimiento para la finalización de la transmisión en
DefaultAudioSink
antes de llamar aAudioTrack.stop()
, de modo queAudioTrack.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) pueden causar que el procesador arroje una excepción (#1352). - Implementa
MediaCodecAudioRenderer.getDurationToProgressUs
para que ExoPlayer programe de forma dinámica su bucle de trabajo principal en el momento en que el MediaCodecAudioRenderer pueda progresar.
- Video:
- Se corrigió la lógica de resguardo del decodificador para Dolby Vision para usar un decodificador AV1 compatible si es necesario (#1389).
- Texto:
- Se solucionó el problema por el que se omitían los subtítulos que se iniciaban antes de una posición del salto. Este problema solo se introdujo en Media3 1.4.0-alpha01.
- Cambia el comportamiento predeterminado del análisis de subtítulos para que suceda durante la extracción en lugar de durante la renderización (consulta el diagrama de arquitectura de ExoPlayer para conocer la diferencia entre la extracción y la renderización).
- Este cambio se puede anular llamando a tanto
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
comoTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. Consulta los documentos sobre personalización para obtener información sobre cómo conectar estos componentes a una instancia deExoPlayer
. Estos métodos (y toda la compatibilidad con la decodificación de subtítulos heredada) se quitarán en una versión futura. - Las apps con implementaciones de
SubtitleDecoder
personalizadas deben actualizarlas para implementarSubtitleParser
en su lugar (ySubtitleParser.Factory
en lugar deSubtitleDecoderFactory
).
- Este cambio se puede anular llamando a tanto
- 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 tantorowLock
comocolumnLock
son verdaderos, independientemente de los valores presentes en la transmisión (la compatibilidad concolumnLock
no se implementa, por lo que se supone efectivamente que siempre es falso).- Esto se incluyó originalmente en las notas de la versión de
1.3.0-alpha01
, pero el cambio se revirtió por accidente antes de la versión1.3.0-rc01
. Esto ya se corrigió, por lo que el cambio está presente de nuevo.
- Esto se incluyó originalmente en las notas de la versión de
- CEA-708: Evita que se agreguen saltos de línea duplicados mediante el control simple de ExoPlayer del comando “set pen location” (#1315).
- Metadatos:
- Se corrigió la asignación de las etiquetas de orden de MP4 a ID3. Anteriormente, las etiquetas MP4 "orden de álbum" (
soal
), "orden de artista" (soar
) y "orden de artista del álbum" (soaa
) se asignaron de forma incorrecta a las etiquetasTSO2
,TSOA
yTSOP
ID3 (#1302). - Se corrigió la lectura de las etiquetas numéricas
gnre
(género) ytmpo
(tempo) de MP4 (/iTunes) cuando el valor tiene más de un byte. - Se propaga el marco
TCON
de ID3 aMediaMetadata.genre
(#1305).
- Se corrigió la asignación de las etiquetas de orden de MP4 a ID3. Anteriormente, las etiquetas MP4 "orden de álbum" (
- Imagen:
- Se agregó compatibilidad con cuadrículas de miniaturas de DASH no cuadradas (#1300).
- Se agregó compatibilidad con AVIF para el nivel de API 34 y versiones posteriores.
- DataSource:
- Permite que
ByteArrayDataSource
resuelva un URI en un array de bytes duranteopen()
, en lugar de codificarlos de manera fija durante la construcción (#1405).
- Permite que
- DRM:
- Se permite la configuración de un
LoadErrorHandlingPolicy
enDefaultDrmSessionManagerProvider
(#1271).
- Se permite la configuración de un
- Efecto:
- Se corrigió el error por el que
TimestampWrapper
falla cuando se usa conExoPlayer#setVideoEffects
(#821). - Cambia el espacio de trabajo de color predeterminado del SDR de los colores lineales a los videos eléctricos BT 709 SDR. También proporciona una tercera opción para conservar el espacio de color original.
- Se permite definir el orden z indeterminado de EditedMediaItemSequences (#1055).
- Mantener un rango de luminancia coherente en las diferentes piezas de contenido HDR (usa el rango HLG)
- Agrega compatibilidad con superposiciones de Ultra HDR (mapa de bits) en el contenido HDR.
- Permite que se usen efectos de
SeparableConvolution
antes del nivel de API 26
- Se corrigió el error por el que
- Extensión IMA:
- Promover la API que se requiere para que las apps reproduzcan transmisiones de anuncios de DAI a niveles estables.
- Agrega
replaceAdTagParameters(Map <String, String>)
aImaServerSideAdInsertionMediaSource.AdLoader
, que permite reemplazar los parámetros de las etiquetas de anuncios en 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 uses URI de etiquetas de anunciosdata://
(#700).
- Sesión:
- Ocultar la barra de búsqueda en la notificación de contenido multimedia para las transmisiones en vivo sin configurar la duración en los metadatos de la sesión de la plataforma (#1256)
- Alinea la conversión de
MediaMetadata
conMediaDescriptionCompat
para usar el mismo orden y lógica preferidos cuando se seleccionan las propiedades de metadatos que en media1. - Agrega
MediaSession.sendError()
, que permite enviar errores recuperables al controlador de Media3. Cuando se usa el controlador de notificaciones (consultaMediaSession.getMediaNotificationControllerInfo()
), se usa el error personalizado para actualizar laPlaybackState
de la sesión de la plataforma a un estado de error con la información de error proporcionada (#543).
- Extensión Cronet:
- Corrige
SocketTimeoutException
enCronetDataSource
. En algunas versiones de Cronet, la solicitud que proporciona la devolución de llamada no siempre es la misma. Por lo tanto, no se completa la devolución de llamada y se agota el tiempo de espera de la solicitud (https://issuetracker.google.com/328442628).
- Corrige
- Extensión HLS:
- Se corrigió el error por el que las muestras de EMSG pendientes que esperaban una discontinuidad se delegaban en
HlsSampleStreamWrapper
con un desplazamiento incorrecto, lo que causaba unIndexOutOfBoundsException
o unIllegalArgumentException
(#1002). - Se corrigió el error por el que las playlists no principales se siguen volviendo a cargar para las transmisiones de LL-HLS (#1240).
- Se corrigió el error por el que la habilitación de CMCD para HLS con segmentos de inicialización generaba
Source Error
yIllegalArgumentException
.
- Se corrigió el error por el que las muestras de EMSG pendientes que esperaban una discontinuidad se delegaban en
- Extensión DASH:
- Extensión Cast:
- Se corrigió el error que convertía el título del álbum de
MediaQueueItem
en el artista del elemento multimedia Media3 (#1255).
- Se corrigió el error que convertía el título del álbum de
- App de demostración:
- Se permite la configuración del modo de repetición con argumentos
Intent
desde la línea de comandos (#1266).
- Se permite la configuración del modo de repetición con argumentos
- Se quitan los símbolos obsoletos:
- Se quitó el método
setContentTypePredicate(Predicate)
deDefaultHttpDataSource
,OkHttpDataSource
yCronetDataSource
. En su lugar, usa el método equivalente en cadaXXXDataSource.Factory
. - Se quitaron los constructores
OkHttpDataSource
yOkHttpDataSourceFactory
. En su lugar, usaOkHttpDataSource.Factory
. - Se quita
PlayerMessage.setHandler(Handler)
. Se usasetLooper(Looper)
en su lugar. - Quitar el campo
Timeline.Window.isLive
. En su lugar, usa el métodoisLive()
. - Se quitaron los constructores
DefaultHttpDataSource
. Se usaDefaultHttpDataSource.Factory
en su lugar. - Se quita
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Se usaDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
en su lugar. - Se quita
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Se usaMediaCodecInfo.canReuseCodec(Format, Format)
en su lugar. - Se quitan los métodos
DrmSessionManager.DUMMY
ygetDummyDrmSessionManager()
. En su lugar, usaDrmSessionManager.DRM_UNSUPPORTED
. - Se quitan
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
yVideoRendererEventListener.onVideoInputFormatChanged(Format)
. En su lugar, usa las sobrecargas que toman unDecoderReuseEvaluation
. - Se quitaron las constantes
RendererSupport.FormatSupport
IntDef yFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
yFORMAT_UNSUPPORTED_TYPE
. En su lugar, usa la IntDef y las constantes equivalentes enandroidx.media3.common.C
(p.ej.,C.FORMAT_HANDLED
).
- Se quitó el método
Versión 1.4.0-alpha01
17 de abril de 2024
Lanzamiento de androidx.media3:media3-*:1.4.0-alpha01
.
La versión 1.4.0-alpha01 contiene estas confirmaciones.
- ExoPlayer:
- Agrega
BasePreloadManager
, que coordina la precarga de varias fuentes según las prioridades definidas por surankingData
. La personalización es posible extendiendo esta clase. AgregaDefaultPreloadManager
, que usaPreloadMediaSource
para precargar muestras de contenido multimedia de las fuentes en la memoria y unrankingData
entero que indica el índice de un elemento en la IU. - Agrega
PlayerId
a la mayoría de los métodos deLoadControl
para permitir que las implementaciones deLoadControl
sean compatibles con varios jugadores. - Se quitan
Buffer.isDecodeOnly()
yC.BUFFER_FLAG_DECODE_ONLY
. No es necesario establecer esta marca, ya que los procesadores y los decodificadores decidirán omitir los búferes en función de la marca de tiempo. Las implementaciones personalizadas deRenderer
deben verificar si el tiempo de búfer es de al menosBaseRenderer.getLastResetPositionUs()
para decidir si se debe mostrar una muestra. Las implementaciones personalizadas deSimpleDecoder
pueden verificarisAtLeastOutputStartTimeUs
si es necesario o marcar otros búferes conDecoderOutputBuffer.shouldBeSkipped
para omitirlos. - Permite que
TargetPreloadStatusControl.getTargetPreloadStatus(T)
muestre un valor nulo para indicar que no se debe precargar unMediaSource
con elrankingData
determinado. - Se agregó
remove(MediaSource)
aBasePreloadManager
.
- Agrega
- Transformador:
- Agrega
audioConversionProcess
yvideoConversionProcess
aExportResult
para indicar cómo se hizo el segmento correspondiente en el archivo de salida. - Se relajaba las verificaciones del nivel H.264 de la optimización de cortes.
- Se agregó compatibilidad para cambiar entre medios de entrada SDR y HDR en una secuencia.
- Agrega compatibilidad con efectos de audio a nivel de composición.
- Se agregó compatibilidad para la transcodificación de imágenes Ultra HDR a videos HDR.
- Soluciona el problema por el que
DefaultAudioMixer
no genera la cantidad correcta de bytes después de restablecerse y volver a usarse.
- Agrega
- Video:
- Soluciona el problema por el que
Listener.onRenderedFirstFrame()
llega demasiado temprano cuando se cambia de plataforma durante la reproducción.
- Soluciona el problema por el que
- DataSource:
- Implementa la compatibilidad para los URI de recursos sin procesar
android.resource://package/id
en los quepackage
es diferente al paquete de la aplicación actual. Esto no se documentó antes para funcionar, pero es una forma más eficiente de acceder a los recursos en otro paquete que por su nombre. - Verifica con cuidado que
url
no sea nulo en los constructores deDataSpec
. Este parámetro ya se anotó como no nulo.
- Implementa la compatibilidad para los URI de recursos sin procesar
- Efecto:
- Se admiten varios cambios de velocidad en el mismo
EditedMediaItem
oComposition
enSpeedChangeEffect
. - Compatibilidad con salidas HLG y PQ a partir de entrada de mapa de bits ultra HDR.
- Se agregó compatibilidad con EGL_GL_COLORSPACE_BT2020_HLG_EXT, que mejora la salida de la superficie de HLG en ExoPlayer.setVideoEffect y la SurfaceView de depuración de Transformer.
- Actualiza la implementación de la matriz de superposición para que sea coherente con la documentación. Para ello, cambia los valores "x" e "y" aplicados en
setOverlayFrameAnchor()
. Si usasOverlaySettings.Builder.setOverlayFrameAnchor()
, gira sus valores de x e y multiplicándolos por-1
.
- Se admiten varios cambios de velocidad en el mismo
- Sesión:
- Cambia el valor predeterminado de
CommandButton.enabled
atrue
y asegúrate de que el valor pueda permanecer como falso para los controladores, incluso si el comando asociado está disponible. - Agrega constantes de íconos para
CommandButton
que se deben usar en lugar de recursos de íconos personalizados. - Se agregó
MediaSessionService.isPlaybackOngoing()
para permitir que las apps consulten si el servicio debe detenerse enonTaskRemoved()
(#1219). - Agrega
MediaSessionService.pauseAllPlayersAndStopSelf()
que permita pausar la reproducción de todas las sesiones y llamar astopSelf
para finalizar el ciclo de vida deMediaSessionService
de manera conveniente. - Anula
MediaSessionService.onTaskRemoved(Intent)
para proporcionar una implementación predeterminada segura que mantenga el servicio en ejecución en primer plano si la reproducción está en curso o, de lo contrario, detiene el servicio.
- Cambia el valor predeterminado de
- Descargas:
- Asegúrate de que
DownloadHelper
no filtre instancias deRenderer
no publicadas, lo que puede provocar que una app falle conIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Asegúrate de que
- Utilidades de prueba:
- Implementa
onInit()
yonRelease()
enFakeRenderer
. - Cambia los métodos
TestPlayerRunHelper.runUntil/playUntil
para que fallen en errores recuperables (p.ej., los informados aAnalyticsListener.onVideoCodecError
). Usa la nueva cadena de métodosTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
para inhabilitar este comportamiento.
- Implementa
- App de demostración:
- Usa
DefaultPreloadManager
en la app de demostración breve.
- Usa
- Se quitan los símbolos obsoletos:
- Se quitó
CronetDataSourceFactory
. Se usaCronetDataSource.Factory
en su lugar. - Se quitaron algunos constructores
DataSpec
. Se usaDataSpec.Builder
en su lugar.
- Se quitó
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 alternativas de otro tipo.
- Agrega
- ExoPlayer:
- Soluciona el problema por el que
PreloadMediaPeriod
no puede retener las transmisiones cuando se vuelve a precargar. - Aplica el
TrackSelectionResult
correspondiente al período de reproducción cuando vuelvas a seleccionar la pista. - Inicia los procesadores habilitados con anticipación solo después de avanzar el período de reproducción al realizar la transición entre elementos multimedia (#1017).
- Se agregó el tipo de datos que se muestra a la regla
-keepclasseswithmembers
de ProGuard paraDefaultVideoFrameProcessor.Factory.Builder.build()
(#1187).
- Soluciona el problema por el que
- Transformador:
- Se agregó una solución alternativa para la excepción que se arroja debido a que
MediaMuxer
no admite marcas de tiempo de presentación negativas antes del nivel de API 30.
- Se agregó una solución alternativa para la excepción que se arroja debido a que
- Selección de pistas:
DefaultTrackSelector
: Se prefieren las pistas de video con una velocidad de fotogramas "razonable" (>=10 FPS) sobre las que tienen una velocidad de fotogramas menor o no establecida. Esto garantiza que el jugador seleccione la pista de video “real” en MP4 extraída de fotos en movimiento que puedan contener dos pistas HEVC, una de las cuales tenga una resolución más alta, pero una cantidad muy pequeña de fotogramas (#1051).
- Extractores:
- Se solucionó el problema por el que no se omitía el relleno cuando se leían fragmentos de tamaño impar de archivos WAV (#1117).
- MP3: Propaga
Format.averageBitrate
a partir de marcos de metadatos, comoXING
yVBRI
. - MPEG-TS: Revierte un cambio dirigido a garantizar que se procese el último fotograma pasando la última unidad de acceso de una transmisión a la cola de muestra (#7909). Esto se debe al cambio que causa problemas nuevos con las transmisiones HLS de solo fotograma (#1150) y las transmisiones HLS de H.262 (#1126).
- Audio:
- Permite la recuperación del procesador inhabilitando la descarga si la pista de audio no se inicializa en el modo de descarga.
- Video:
- Se agregó una solución alternativa para un problema de dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que hace que las transmisiones H265 de 60 FPS se marquen como no compatibles.
- Se agregó una solución alternativa que garantice que el primer fotograma siempre se renderice durante la creación de túneles, incluso si el dispositivo no lo hace automáticamente como requiere la API (#1169). (#966).
- Se corrigió el problema por el que el control de la información de color HDR causaba un comportamiento incorrecto del códec y evita los cambios de formato adaptables para las pistas de video SDR (#1158).
- Texto:
- WebVTT: Evita que las indicaciones consecutivas directamente creen instancias adicionales falsas de
CuesWithTiming
desdeWebvttParser.parse
(#1177).
- WebVTT: Evita que las indicaciones consecutivas directamente creen instancias adicionales falsas de
- DRM:
- Soluciona un problema de
NoSuchMethodError
que puede arrojar el framework deMediaDrm
en lugar deResourceBusyException
oNotProvisionedException
en algunos dispositivos con Android 14 (#1145).
- Soluciona un problema de
- Efecto:
- Se mejoró la asignación de tonos de PQ a SDR con la conversión de espacios de color.
- Sesión:
- IU:
- Como resguardo, se incluye el nombre de idioma de la pista de audio si
Locale
no puede identificar un nombre visible (#988).
- Como resguardo, se incluye el nombre de idioma de la pista de audio si
- Extensión DASH:
- Propaga todos los elementos
Label
del manifiesto enFormat.labels
(#1054).
- Propaga todos los elementos
- Extensión RTSP:
- Se omiten los valores de información de sesión vacíos (i-tags) en el análisis de SDP (#1087).
- Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
- Inhabilita la extensión MIDI como una dependencia local de forma predeterminada, ya que requiere la configuración de un repositorio de Maven adicional. Los usuarios que necesitan este módulo desde 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:
- Implementa la compatibilidad para los URI de recursos sin procesar
android.resource://package/[type/]name
, en los quepackage
es diferente al paquete de la aplicación actual. Esto siempre se documentó para funcionar, pero no se implementó de forma correcta hasta ahora. - Normaliza los tipos de MIME establecidos por el código de la app o leídos del contenido multimedia para que estén en minúsculas.
- Define anuncios con un
MediaItem
completo en lugar de un soloUri
enAdPlaybackState
. - Aumenta la temperatura de
minSdk
a 19 (Android KitKat). Esta opción está alineada con todas las demás bibliotecas de AndroidX y es necesaria para que la actualicemos a las versiones más recientes de nuestras dependencias de AndroidX. - Propaga
artworkUri
yartworkData
enMediaMetadata.Builder.populate(MediaMetadata)
cuando al menos uno de ellos no sea nulo (#964).
- Implementa la compatibilidad para los URI de recursos sin procesar
- ExoPlayer:
- Agrega
PreloadMediaSource
yPreloadMediaPeriod
, que permiten que las apps carguen previamente una fuente multimedia de contenido en una posición de inicio específica antes de la reproducción.PreloadMediaSource
se encarga de preparar la fuente de contenido multimedia de contenido para recibir elTimeline
, preparar y almacenar en caché el período en la posición de inicio determinada, seleccionar pistas y cargar datos multimedia para el período. Las apps controlan el progreso de la precarga implementandoPreloadMediaSource.PreloadControl
y configurando la fuente precargada en el reproductor para la reproducción. - Se agregó
ExoPlayer.setImageOutput
, que permite que las apps configurenImageRenderer.ImageOutput
. DefaultRenderersFactory
ahora proporciona unImageRenderer
al reproductor de forma predeterminada conImageOutput
yImageDecoder.Factory.DEFAULT
nulos.- Emite un 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 contenido multimedia adaptables con
PreloadMediaSource
. - Implementa
HttpEngineDataSource
, unHttpDataSource
mediante la API de HttpEngine. - Evita la subclasificación de
CompositeSequenceableLoader
. Este componente antes se hizo extensible, pero nunca se subclasificó dentro de la biblioteca. Para realizar personalizaciones, se puede unir una instancia con el patrón de decorador y, luego, implementar unCompositeSequenceableLoaderFactory
personalizado. - Se corrigió el problema por el que repetir el mismo tiempo causaba que se borren los metadatos de este elemento (#1007).
- Se cambió el nombre de los métodos
experimentalSetSubtitleParserFactory
enBundledChunkExtractor.Factory
yDefaultHlsExtractorFactory
asetSubtitleParserFactory
, y no permite pasarnull
. Usa los nuevos métodosexperimentalParseSubtitlesDuringExtraction(boolean)
para controlar el comportamiento del análisis. - Se agregó compatibilidad para personalizar el
SubtitleParser.Factory
que se usa durante la extracción. Esto se puede lograr conMediaSource.Factory.setSubtitleParserFactory()
. - Agrega el prefijo de origen a todos los campos
Format.id
generados a partir deMergingMediaSource
. Esto ayuda a identificar qué fuente produjo unFormat
(#883). - Corrige la regex que se usa para validar nombres de claves de datos comunes de clientes de medios (CMCD) personalizados. Para ello, modifícala para verificar solo los guiones (#1028).
- Se detiene la codificación doble de los parámetros de consulta de CMCD (#1075).
- Agrega
- Transformador:
- Se agregó compatibilidad para compactar videos en cámara lenta H.265/HEVC SEF.
- Aumenta la velocidad de transmuxación, especialmente para las ediciones "eliminar video".
- Agrega una API para garantizar que el archivo de salida comience en un fotograma de video. De esta manera, el resultado de las operaciones de corte puede ser más compatible con las implementaciones del reproductor que no muestran el primer fotograma de video hasta la marca de tiempo de presentación (#829).
- Se agregó compatibilidad para optimizar las operaciones de recorte de MP4 de un solo recurso.
- Agrega compatibilidad para garantizar que un fotograma de video tenga la primera marca de tiempo en el archivo de salida. Corrige los archivos de salida que comienzan con marco negro en reproductores basados en iOS (#829).
- Selección de pistas:
- Agrega
DefaultTrackSelector.selectImageTrack
para habilitar la selección de pistas de imágenes. - Agrega
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
para determinar si debes seleccionar una pista de imagen en caso de que estén disponibles una pista de imagen y una de video. El valor predeterminado esfalse
, lo que significa que se prioriza la selección de una pista de video.
- Agrega
- Extractores:
- Se agregan análisis adicionales de AV1C al extractor MP4 para recuperar los valores
ColorInfo.colorSpace
,ColorInfo.colorTransfer
yColorInfo.colorRange
(#692). - MP3: Usa una tasa de bits constante (CBR) para buscar archivos con un encabezado
Info
(el equivalente de CBR del encabezadoXing
). Anteriormente, usamos la tabla de búsqueda del encabezadoInfo
, pero esto da como resultado una búsqueda menos precisa que si la ignoramos y suponemos que el archivo es CBR. - MPEG2-TS: Se agregó compatibilidad con DTS, DTS-LBR y DTS:X Profile2 (#275).
- Se extraen tipos de audio de los descriptores de TS y se los asigna a marcas de función, lo que permite a los usuarios realizar selecciones de pistas de audio mejor informadas (#973).
- Se agregan análisis adicionales de AV1C al extractor MP4 para recuperar los valores
- Audio:
- Video:
- Cambia el constructor
MediaCodecVideoRenderer
que toma un argumentoVideoFrameProcessor.Factory
y reemplázalo por un constructor que tome un argumentoVideoSinkProvider
. Las apps que quieran insertar unVideoFrameProcessor.Factory
personalizado pueden crear una instancia deCompositingVideoSinkProvider
que use elVideoFrameProcessor.Factory
personalizado y pasar el proveedor del receptor de video aMediaCodecVideoRenderer
.
- Cambia el constructor
- Texto:
- Se corrigió la serialización de las señales de mapa de bits para resolver el error
Tried to marshall a Parcel that contained Binder objects
cuando se usaDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: Ignora el valor
rowLock
. La especificación CEA-708-E S-2023 establece que se debe suponer que tantorowLock
comocolumnLock
son verdaderos, independientemente de los valores presentes en la transmisión (la compatibilidad concolumnLock
no se implementa, por lo que se supone efectivamente que siempre es falso).
- Se corrigió la serialización de las señales de mapa de bits para resolver el error
- Imagen:
- Agrega compatibilidad con miniaturas de DASH. Las imágenes de cuadrícula se recortan y se proporcionan miniaturas individuales a
ImageOutput
cerca de sus tiempos de presentación.
- Agrega compatibilidad con miniaturas de DASH. Las imágenes de cuadrícula se recortan y se proporcionan miniaturas individuales a
- DRM:
- Reproducir muestras sin encriptar "borrar cliente potencial" en el contenido de DRM de forma predeterminada y inmediata, incluso si las claves de las muestras encriptadas posteriores aún no están listas. Esto puede generar bloqueos en la reproducción si las claves aún no están listas cuando la posición de reproducción alcanza las muestras encriptadas (pero antes la reproducción no se habría iniciado en absoluto en este punto). Este comportamiento se puede inhabilitar con
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
oDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Reproducir muestras sin encriptar "borrar cliente potencial" en el contenido de DRM de forma predeterminada y inmediata, incluso si las claves de las muestras encriptadas posteriores aún no están listas. Esto puede generar bloqueos en la reproducción si las claves aún no están listas cuando la posición de reproducción alcanza las muestras encriptadas (pero antes la reproducción no se habría iniciado en absoluto en este punto). Este comportamiento se puede inhabilitar con
- Extensión IMA:
- Soluciona el problema por el que no se pueden reproducir los anuncios DASH y HLS sin la extensión de archivo adecuada.
- Sesión:
- Se inhabilita la detección de doble clic en apps para TV (#962).
- Se corrigió el problema por el que no se transmite
MediaItem.RequestMetadata
con extras no nulos entre los controladores multimedia y las sesiones - Agrega un constructor a
MediaLibrarySession.Builder
, que solo toma unContext
en lugar de unMediaLibraryService
.
- Extensión HLS:
- Reduce
HlsMediaPeriod
a visibilidad privada de paquete. No se debe depender directamente de este tipo desde fuera del paquete HLS. - Resolve busca al comienzo de un segmento de manera más eficiente (#1031).
- Reduce
- Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
- 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 esta puede agregar aserciones y acciones adicionales.
- No pauses la reproducción en
- App de demostración:
- Agrega un módulo de demostración de corta duración para demostrar el uso de
PreloadMediaSource
con el caso de uso de contenido de formato corto.
- Agrega un módulo de demostración de corta duración para demostrar el uso de
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 solucionó el problema por el que las búsquedas manuales fuera del rango
LiveConfiguration.min/maxOffset
seguían ajustando el desplazamiento amin/maxOffset
. - Se solucionó 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ó el problema por el que las selecciones de pista después de buscar cero en una transmisión en vivo permitían incorrectamente que la transmisión comenzara en su posición predeterminada (#9347).
- Se corrigió el problema por el que las instancias nuevas de
CmcdData.Factory
recibían valores negativos parabufferedDurationUs
desde fuentes de fragmentos, lo que daba como resultadoIllegalArgumentException
(#888).
- Se solucionó el problema por el que las búsquedas manuales fuera del rango
- Transformador:
- Soluciona un problema en el que el codificador se mostraba en el momento de configuración debido a que se establecía una tasa operativa alta.
- Extractores:
- Marca las pistas HEVC secundarias (que no se pueden reproducir) en 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 de fotogramas clave incorrecta 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).
- Marca las pistas HEVC secundarias (que no se pueden reproducir) en fotos en movimiento JPEG como
- Audio:
- Se corrigió el control de EOS para
SilenceSkippingAudioProcessor
cuando se llamaba varias veces (#712).
- Se corrigió el control de EOS para
- Video:
- Se agregó una solución alternativa para un problema de dispositivo en Galaxy Tab S7 FE, Chromecast con Google TV y Lenovo M10 FHD Plus que hace que las transmisiones AVC de 60 FPS se marquen como no compatibles (#693).
- Metadatos:
- Se corrigió el error por el que
MediaMetadata
solo se propagaba a partir de los comentarios de Vorbis con claves en mayúsculas (#876). - Captura
OutOfMemoryError
cuando se analizan fotogramas ID3 muy grandes, lo que significa que la reproducción puede continuar sin la información de la etiqueta en lugar de que la reproducción falle por completo.
- Se corrigió el error por el que
- DRM:
- Se extiende la solución alternativa para la URL de licencia
https://default.url
falsa de ClearKey a la API nivel 33 y versiones posteriores (antes la solución alternativa solo se aplicaba en la API 33 de forma exacta) (#837). - Se corrigió
ERROR_DRM_SESSION_NOT_OPENED
cuando se cambiaba de contenido encriptado al contenido borrado sin una superficie adjunta al reproductor. El error se debió al uso incorrecto de un decodificador seguro para reproducir el contenido claro.
- Se extiende la solución alternativa para la URL de licencia
- Sesión:
- Coloca las claves y los valores personalizados de
MediaMetadataCompat
enMediaMetadata.extras
yMediaMetadata.extras
enMediaMetadataCompat
(#756, #802). - Se corrigió la transmisión de
notifyChildrenChanged
para controles heredados (#644). - Se corrigió un error por el que configurar 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 terminaba de conectarse cuando se solicitaba la primera actualización de la notificación (#917).
- Coloca las claves y los valores personalizados de
- IU:
- Extensión DASH:
- Se analiza "f800" como un recuento de canales de 5 para Dolby en el manifiesto DASH (#688).
- Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
- Extensión Cast:
- Limpia la creación de un
Timeline
para que no falle la app cuando la carga de contenido multimedia falle en el dispositivo de transmisión (#708).
- Limpia la creación de un
Versión 1.2.0
15 de noviembre de 2023
- Biblioteca común:
- Agrega un parámetro
@Nullable Throwable
a los métodos en la interfaz deLog.Logger
. El parámetromessage
de estos métodos ya no contiene información sobre elThrowable
que se pasa a los métodosLog.{d,i,w,e}()
, por lo que las implementaciones deberán adjuntar esta información de forma manual si lo desean (posiblemente conLogger.appendThrowableString(String, Throwable)
). - Se corrigió el problema de compatibilidad de Kotlin en el que los parámetros de tipo genérico anulables y los tipos de elementos de array anulables no se detectaban como anulables. Algunos ejemplos son los parámetros de métodos
TrackSelectorResult
ySimpleDecoder
(#6792). - Cambia el comportamiento predeterminado de la IU y las notificaciones en
Util.shouldShowPlayButton
para que se muestre un botón de "reproducir" mientras la reproducción se suprime de forma temporal (p.ej., debido a la pérdida transitoria del foco de audio). El comportamiento heredado se puede mantener conPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
oMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Actualiza
androidx.annotation:annotation-experimental
a1.3.1
para corregir el problema https://issuetracker.google.com/251172715. - Mueve
ExoPlayer.setAudioAttributes
a la interfazPlayer
.
- Agrega un parámetro
- ExoPlayer:
- Se corrigieron los problemas de búsqueda en las transmisiones de AC4 causados por no identificar correctamente las muestras de solo decodificación (#11000).
- Se agregó supresión de la reproducción en dispositivos de salida de audio inadecuados (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 supresión de la reproducción se actualizará comoPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
si se intenta reproducir cuando no hay salidas de audio adecuadas disponibles o si se desconectan todas las salidas adecuadas durante la reproducción. El motivo de supresión se quitará cuando se conecte una salida adecuada. - Agrega
MediaSource.canUpdateMediaItem
yMediaSource.updateMediaItem
para aceptar actualizaciones deMediaItem
después de su creación a través dePlayer.replaceMediaItem(s)
. - Se permiten las actualizaciones de
MediaItem
para todas las clasesMediaSource
que proporciona la biblioteca a través dePlayer.replaceMediaItem(s)
(#33, #9978). - Se cambia el nombre de
MimeTypes.TEXT_EXOPLAYER_CUES
aMimeTypes.APPLICATION_MEDIA3_CUES
. - Agrega un
PngExtractor
, que envía y lee un archivo PNG completo enTrackOutput
como una muestra. - Se mejoró el método
SequenceableLoader.continueLoading(long)
en la interfazSequenceableLoader
aSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
.LoadingInfo
contiene parámetros adicionales, incluidosplaybackSpeed
ylastRebufferRealtimeMs
, además delplaybackPositionUs
existente. - Se mejoró el método
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
en la interfazChunkSource
aChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Se agregaron campos adicionales al registro de datos comunes de clientes multimedia (CMCD): inexistencia de búfer (
bs
), fecha límite (dl
), velocidad de reproducción (pr
) e inicio (su
) (#8699). - Agrega profundidad de bits de luma y croma a
ColorInfo
(#491). - Se agregan campos adicionales al registro de datos comunes de clientes multimedia (CMCD): siguiente solicitud de objeto (
nor
) y siguiente solicitud de rango (nrr
) (#8699). - Se agregó funcionalidad para transmitir datos de clientes multimedia comunes (CMCD) mediante parámetros de consulta (#553).
- Se corrigió
ConcurrentModificationException
enExperimentalBandwidthMeter
(#612). - Agrega el parámetro
MediaPeriodId
aCompositeMediaSource.getMediaTimeForChildMediaTime
. - Se admite
ClippingMediaSource
(y otras fuentes con compensaciones de tiempo de período y ventana) enConcatenatingMediaSource2
(#11226). - Cambia
BaseRenderer.onStreamChanged()
para recibir también un argumentoMediaPeriodId
.
- Transformador:
- Analizar los datos de rotación de EXIF para entradas de imágenes
- Se quitó el tipo de anotación
TransformationRequest.HdrMode
y sus constantes asociadas. En su lugar, usaComposition.HdrMode
y sus constantes asociadas. - Simplifica
OverlaySettings
para corregir los problemas de rotación. - Se cambiaron los parámetros
frameRate
ydurationUs
deSampleConsumer.queueInputBitmap
aTimestampIterator
.
- Selección de pistas:
- Se agregó
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
para permitir o rechazar de manera explícita la adaptación no fluida. El valor predeterminado se mantiene en su comportamiento actual detrue
.
- Se agregó
- Extractores:
- MPEG-TS: asegúrate de que el último fotograma esté renderizado pasando la última unidad de acceso de una transmisión a la cola de muestra (#7909).
- Se corrigió un error de ortografía al determinar
rotationDegrees
. Se cambióprojectionPosePitch
aprojectionPoseRoll
(#461). - Quita la suposición de que las instancias
Extractor
se pueden inspeccionar directamente coninstanceof
. Si deseas tener acceso del entorno de ejecución a los detalles de implementación de unExtractor
, primero debes llamar aExtractor.getUnderlyingInstance
. - Se agregó
BmpExtractor
, - Se agregó
WebpExtractor
, - Se agregó
HeifExtractor
, - Agrega compatibilidad con la versión clásica de QuickTime a
Mp4Extractor
.
- Audio:
- Se agregó compatibilidad con PCM de 24 o 32 bits en MP4 y Matroska, y se analiza la codificación PCM para
lpcm
en MP4. - Se agregó compatibilidad para extraer audio Vorbis en MP4.
- Agrega
AudioSink.getFormatOffloadSupport(Format)
, que recupere el nivel de compatibilidad de descarga que el receptor puede proporcionar para el formato a través deDefaultAudioOffloadSupportProvider
. Muestra elAudioOffloadSupport
nuevo que contieneisFormatSupported
,isGaplessSupported
yisSpeedChangeSupported
. - Agrega
AudioSink.setOffloadMode()
a través del cual se configura la configuración de descarga en el receptor de audio. El valor predeterminado esAudioSink.OFFLOAD_MODE_DISABLED
. - La descarga se puede habilitar a través de
setAudioOffloadPreference
enTrackSelectionParameters
. Si se habilita la preferencia, el dispositivo admite la descarga para el formato y la selección de pista es una sola pista de audio, se habilitará la descarga de audio. - Si
audioOffloadModePreference
se establece comoAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
,DefaultTrackSelector
solo seleccionará una pista de audio y únicamente si su formato es compatible con la descarga. Si no se admite ninguna pista de audio en la descarga, no se seleccionará ninguna pista. - Se inhabilitó la compatibilidad sin espacios para la descarga cuando el nivel de API anterior a la API 33 se debía a un problema de posición de reproducción después de la transición de la pista.
- Se quitó el parámetro
enableOffload
de la firma del métodoDefaultRenderersFactory.buildAudioSink
. - Se quitó el método
DefaultAudioSink.Builder.setOffloadMode
. - Quita el valor intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Se agregó compatibilidad con los metadatos sin espacios de Opus durante la reproducción de descarga.
- Se inhabilita la descarga si se produce un error en la primera escritura para permitir la recuperación del procesador (#627).
- Habilita la programación de descarga de forma predeterminada para la reproducción de solo audio descargada.
- Borra
ExoPlayer.experimentalSetOffloadSchedulingEnabled
yAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. - Se cambió el nombre de
onExperimentalSleepingForOffloadChanged
poronSleepingForOffloadChanged
y el deonExperimentalOffloadedPlayback
poronOffloadedPlayback
. - Mueve las interfaces y definiciones relacionadas con el modo de descarga de audio
TrackSelectionParameters
a una claseAudioOffloadPreferences
interna. - Agrega devoluciones de llamada
onAudioTrackInitialized
yonAudioTrackReleased
aAnalyticsListener
,AudioRendererEventListener
yAudioSink.Listener
. - Se corrigió el problema de subdesbordamiento del búfer de audio de DTS Express (#650).
- Se corrigió el error por el que la verificación de capacidades de E-AC3-JOC arrojaba una
IllegalArgumentException
(#677).
- Se agregó compatibilidad con PCM de 24 o 32 bits en MP4 y Matroska, y se analiza la codificación PCM para
- Video:
- Permite que
MediaCodecVideoRenderer
use unVideoFrameProcessor.Factory
personalizado. - Se corrigió el error por el que no se podía renderizar el primer fotograma si la transmisión de audio comienza con marcas de tiempo negativas (#291).
- Permite que
- Texto:
- Se quita
ExoplayerCuesDecoder
. AhoraTextRenderer
controla directamente las pistas de texto consampleMimeType = application/x-media3-cues
sin necesidad de una instancia deSubtitleDecoder
.
- Se quita
- Metadatos:
- Ya no se llamará a
MetadataDecoder.decode
para las muestras de "solo decodificación", ya que la implementación debe mostrar un valor nulo.
- Ya no se llamará a
- Efecto:
- Agrega
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
en cola de entrada de mapa de bits por marca de tiempo. - Cambia
VideoFrameProcessor.registerInputStream()
para que no genere bloqueo. Las apps deben implementarVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Se cambiaron los parámetros
frameRate
ydurationUs
deVideoFrameProcessor.queueInputBitmap
aTimestampIterator
.
- Agrega
- Extensión IMA:
- Se corrigió el error por el que una transmisión en vivo DASH de varios períodos que no es el primer elemento de una playlist puede arrojar una excepción (#571).
- Libera StreamManager antes de llamar a
AdsLoader.destroy()
- Modifica la versión del SDK de IMA a la versión 3.31.0.
- Sesión:
- Establece el comportamiento del servicio en primer plano de las notificaciones como
FOREGROUND_SERVICE_IMMEDIATE
enDefaultMediaNotificationProvider
(#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 multimedia que recibe
MediaSessionService.onStartCommand()
en Media3, en lugar de enrutarlos a la sesión de la plataforma y de nuevo a Media3. Con esto, el controlador de llamadas es siempre el controlador de notificaciones multimedia, y las apps pueden reconocer con facilidad las llamadas provenientes de la notificación de la misma manera en todos los niveles de API admitidos. - Se corrigió el error por el que
MediaController.getCurrentPosition()
no avanzaba cuando se conectaba a unMediaSessionCompat
heredado. - Se agregó
MediaLibrarySession.getSubscribedControllers(mediaId)
para mayor comodidad. - Anula
MediaLibrarySession.Callback.onSubscribe()
para confirmar la disponibilidad del ID superior al que se suscribe el control. Si se realiza correctamente, se acepta la suscripción y se llama anotifyChildrenChanged()
de inmediato para informar al navegador (#561). - Agrega un módulo de demostración de sesión para Automotive OS 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. Si Android Auto es el controlador de cliente que lee de la sesión del framework, no se muestra el botónqueue
de la IU de Android Auto (#339). - Se usa
DataSourceBitmapLoader
de forma predeterminada en lugar deSimpleBitmapLoader
(#271, #327). - Se agregó
MediaSession.Callback.onMediaButtonEvent(Intent)
, que permite que las apps anulen el control de eventos del botón multimedia predeterminado.
- Establece el comportamiento del servicio en primer plano de las notificaciones como
- IU:
- Se agregó una implementación de
Player.Listener
para dispositivos Wear OS que controla la supresión de reproducción debido aPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
iniciando 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á la reproducción automáticamente si se conecta un dispositivo adecuado dentro de un tiempo de espera configurable (el valor predeterminado es de 5 minutos).
- Se agregó una implementación de
- Descargas:
- Declara el tipo de servicio en primer plano de "sincronización de datos" para
DownloadService
para la compatibilidad con Android 14. Cuando usas este servicio, la app también debe agregardataSync
comoforegroundServiceType
en el manifiesto y el permisoFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- Declara el tipo de servicio en primer plano de "sincronización de datos" para
- Extensión HLS:
- Se actualiza la playlist en vivo de HLS con un intervalo calculado desde la hora de inicio de la última carga en lugar de la hora de finalización de la última carga (#663).
- Extensión DASH:
- Permitir varios identificadores del mismo DASH en la URL de la plantilla del segmento
- Se agregó compatibilidad experimental para analizar subtítulos durante la extracción. Esto brinda una mejor compatibilidad para combinar subtítulos superpuestos, lo que incluye resolver parpadeos cuando cambias entre segmentos de subtítulos. Puedes habilitar esto con
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288).
- Extensión RTSP:
- Corrige una condición de carrera que podría provocar
IndexOutOfBoundsException
cuando recurre a TCP o que la reproducción se bloquea en algunas situaciones. - Se verifica el estado en la configuración de RTSP cuando se devuelve el estado de carga de
RtspMediaPeriod
(#577). - Se ignoran los métodos de solicitud Rtsp personalizados en el encabezado público de respuesta de opciones (#613).
- Se usa el valor de tiempo de espera de respuesta de configuración de RTSP en el intervalo de tiempo de envío de solicitudes de opciones de RTSP keep-alive (#662).
- Corrige una condición de carrera que podría provocar
- Extensiones de decodificador (FFmpeg, VP9, AV1, MIDI, etc.):
- Libera el módulo de decodificador de MIDI, que brinda compatibilidad para la reproducción de archivos MIDI estándar usando la biblioteca Jsyn para sintetizar audio.
- Agrega
DecoderOutputBuffer.shouldBeSkipped
para marcar directamente los búferes de salida que no necesitan presentarse. Se prefiere en lugar deC.BUFFER_FLAG_DECODE_ONLY
, que dejará de estar disponible. - Agrega
Decoder.setOutputStartTimeUs
ySimpleDecoder.isAtLeastOutputStartTimeUs
para permitir que los decodificadores descarten muestras de solo decodificación antes de la hora de inicio. Esto se debe preferir aBuffer.isDecodeOnly
, que quedará obsoleto. - Se corrigió el error de publicación del artefacto de decodificador de MIDI en el repositorio de Maven. Se cambió el nombre del artefacto por
media3-exoplayer-midi
(#734).
- Extensión Leanback:
- Se corrigió el error por el que inhabilitar una superficie puede provocar una
ArithmeticException
en el código Leanback (#617).
- Se corrigió el error por el que inhabilitar una superficie puede provocar una
- Utilidades de prueba:
- Haz que
TestExoPlayerBuilder
yFakeClock
sean compatibles con las pruebas de la IU de Espresso y las pruebas de la IU de Compose. Esto corrige un error en el que la reproducción avanza de manera no determinista durante las interacciones de vistas de Espresso o Compose.
- Haz que
- Se quitan los símbolos obsoletos:
- Se quitan
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
yTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. En su lugar, usaComposition.Builder.setHdrMode(int)
y pasaComposition
aTransformer.start(Composition, String)
. - Se quitó el método obsoleto
DownloadNotificationHelper.buildProgressNotification
. En su lugar, usa un método no obsoleto que tome un parámetronotMetRequirements
.
- Se quitan
Versión 1.2.0-rc01
1 de noviembre de 2023
Usa la versión estable 1.2.0.
Versión 1.2.0-beta01
19 de octubre de 2023
Usa la versión estable 1.2.0.
Versión 1.2.0-alpha02
29 de septiembre de 2023
Usa la versión estable 1.2.0.
Versión 1.2.0-alpha01
17 de agosto de 2023
Usa la versión estable 1.2.0.
Versión 1.1.0
Versión 1.1.1
16 de agosto de 2023
- Biblioteca común:
- Se quitó la dependencia
multidex
que se agregó accidentalmente de todos los módulos (#499).
- Se quitó la dependencia
- ExoPlayer:
- Se solucionó el problema en
PlaybackStatsListener
por el que se creabanPlaybackStats
falsos después de borrar la playlist. - Agrega campos adicionales al registro de datos de clientes multimedia 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), capacidad de procesamiento medida (mtp) y tipo de objeto (OT) (#8699).
- Se solucionó el problema en
- Audio:
- Se corrigió un error por el que
Player.getState()
nunca realizó la transición aSTATE_ENDED
cuando se reprodujeron archivos muy cortos (#538).
- Se corrigió un error por el que
- Descarga de audio:
- Antepón las páginas del encabezado del ID de Ogg y del encabezado de comentarios al flujo de bits para la reproducción de Opus descargada de acuerdo con el RFC 7845.
- Video:
- H.265/HEVC: Se corrigió el análisis de la información de la imagen de referencia a corto y largo plazo de SPS.
- Texto:
- CEA-608: Se cambió la lógica de truncamiento de la inserción para que solo tenga en cuenta el texto visible. Anteriormente, se incluían las sangrías y el desplazamiento de tabulación cuando se limita la longitud de la inserción a 32 caracteres (que era técnicamente correcto según la especificación) (#11019).
- Extensión IMA:
- Modifica la versión del SDK de IMA a la 3.30.3.
- Sesión:
- Agrega un diseño personalizado al estado del control y proporciona un método get para acceder a él. Cuando cambia el diseño personalizado, se llama a
MediaController.Listener.onCustomLayoutChanged
. Las apps que quieran enviar diferentes diseños personalizados a diferentes controles de Media3 pueden hacerlo enMediaSession.Callback.onConnect
usando unAcceptedResultBuilder
para asegurarse de que el diseño personalizado esté disponible para el control cuando se complete la conexión. - Se corrigieron casos en los que
MediaLibraryServiceLegacyStub
envió un error a unaResult
que no admitía esto y que producía unaUnsupportedOperationException
(#78). - Corrige la forma en que
PlayerWrapper
crea unVolumeProviderCompat
determinandovolumeControlType
a través de comandos heredados (COMMAND_ADJUST_DEVICE_VOLUME
yCOMMAND_SET_DEVICE_VOLUME
) y comandos nuevos (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
yCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Agrega un diseño personalizado al estado del control y proporciona un método get para acceder a él. Cuando cambia el diseño personalizado, se llama a
Versión 1.1.0
5 de julio de 2023
- Biblioteca común:
- Agrega un motivo de supresión para una ruta de audio inadecuada y reproduce el motivo de la supresión por demasiado tiempo. (#15).
- Agrega comandos al reproductor:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Agrega métodos sobrecargados al reproductor que permitan a los usuarios especificar marcas de volumen:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- Se agregó
Builder
paraDeviceInfo
y dio de baja el constructor existente. - Agrega
DeviceInfo.routingControllerId
para especificar el ID del controlador de enrutamiento para las reproducciones remotas. - Se agregó
Player.replaceMediaItem(s)
como un acceso directo para agregar y quitar elementos en la misma posición (#8046).
- ExoPlayer:
- Permite que ExoPlayer tenga el 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)
ysetDeviceVolume(int, int)
increaseDeviceVolume(int)
yincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
ydecreaseDeviceVolume(int, int)
- Agrega
FilteringMediaSource
, que permite filtrar los tipos de segmentos disponibles de unMediaSource
. - Se agregó compatibilidad para incluir datos comunes de clientes multimedia (CMCD) en las solicitudes salientes de formatos de transmisión adaptables DASH, HLS y SmoothStreaming. Se incorporaron los siguientes campos (
br
,bl
,cid
,rtp
ysid
) (#8699). Estructura de la API y métodos de la API:- El registro de CMCD está inhabilitado de forma predeterminada. Usa
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
para habilitarlo. - Todas las claves están habilitadas de forma predeterminada. Anula
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
para filtrar qué claves se registran. - Anula
CmcdConfiguration.RequestConfig.getCustomData()
para habilitar el registro de claves personalizado.
- El registro de CMCD está inhabilitado de forma predeterminada. Usa
- Se agregó una acción adicional al manifiesto de la demostración principal para facilitar el inicio de la app de demostración con un archivo
*.exolist.json
personalizado (#439). - Agrega
ExoPlayer.setVideoEffects()
para usarEffect
durante la reproducción del video. - Actualiza
SampleQueue
para almacenarsourceId
comolong
en lugar deint
. Esto cambia las firmas de los métodos públicosSampleQueue.sourceId
ySampleQueue.peekSourceId
. - Agrega parámetros a los métodos
shouldStartPlayback
yonTracksSelected
deLoadControl
que permitan asociar estos métodos con elMediaPeriod
relevante. - Para cambiar la firma de
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, agrega un parámetro de cronograma que contenga los períodos con los UID usados como claves en el mapa. Esto es necesario para evitar problemas de simultaneidad en transmisiones en vivo de varios períodos. EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
yBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
dejaron de estar disponibles. En su lugar, se puede llamar a la variante de los métodos sinmediaTimeOffsetUs
. Ten en cuenta que, incluso para las variantes obsoletas, ya no se agrega el desplazamiento astartTimeUs
niendTimeUs
de los objetosMediaLoadData
que envía el despachador.- Cambia el nombre de
ExoTrackSelection.blacklist
porexcludeTrack
y el deisBlacklisted
porisTrackExcluded
. - Se corrigió el comportamiento incoherente entre
ExoPlayer.setMediaItem(s)
yaddMediaItem(s)
cuando se llamaba a una playlist vacía.
- Permite que ExoPlayer tenga el control de los métodos de volumen del dispositivo solo si se habilita de forma explícita. Usa
- Transformador:
- Se quita
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. En su lugar, usaExoPlayerAssetLoader.Factory(MediaSource.Factory)
yTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Se quita
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Se corrigió un error por el que la transformación podía detenerse (lo que provocaba que se agotara el tiempo de espera del combinador) si el final de la transmisión de video por Internet se señalaba en el momento en que un fotograma de entrada estaba pendiente de procesamiento.
- Consulta códecs a través de
MediaCodecList
en lugar de usar utilidadesfindDecoder/EncoderForFormat
para expandir la compatibilidad. - Quita la configuración del marco B en
DefaultEncoderFactory
, ya que no funciona en algunos dispositivos.
- Se quita
- Selección de pistas:
- Agrega
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
, que está inhabilitado de forma predeterminada. Si se habilita,DefaultTrackSelector
activará una nueva selección de pistas cuando cambien las capacidades del procesador.
- Agrega
- Extractores:
- Audio:
- Se corrigió el error por el que algunas reproducciones fallaban cuando la tunelización está habilitada y
AudioProcessors
estaban activos, p.ej., para los cortes sin espacios (#10847). - Encapsula fotogramas Opus en paquetes Ogg en reproducciones directas (descarga).
- Extrapola la posición actual durante la suspensión con una programación de descarga.
- Se agregaron
Renderer.release()
yAudioSink.release()
para liberar los recursos al final del ciclo de vida del jugador. - Escucha los cambios de las capacidades de audio en
DefaultAudioSink
. Agrega un parámetro obligatoriocontext
en el constructor deDefaultAudioSink
, con el queDefaultAudioSink
se registrará como el objeto de escucha deAudioCapabilitiesReceiver
y actualizará su propiedadaudioCapabilities
cuando se le informe un cambio de capacidades. - Propaga los cambios de capacidades de audio a través de un nuevo evento
onAudioCapabilitiesChanged
en la interfazAudioSink.Listener
y una nueva interfazRendererCapabilities.Listener
que activa los eventosonRendererCapabilitiesChanged
. - Se agregó
ChannelMixingAudioProcessor
para aplicar escalamiento o combinación a canales de audio. - Agrega un nuevo valor int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
aDecoderDiscardReasons
para descartar el decodificador de audio cuando se pueda omitir el modo de omisión después de que cambien las capacidades de audio. - Se agregó compatibilidad con la reproducción directa para DTS Express y DTS:X (#335).
- Se corrigió el error por el que algunas reproducciones fallaban cuando la tunelización está habilitada y
- Video:
- Haz que
MediaCodecVideoRenderer
informe unVideoSize
con un ancho y una altura de 0 cuando el procesador está inhabilitado. Se llama aPlayer.Listener.onVideoSizeChanged
según corresponda cuando cambiaPlayer.getVideoSize()
. Con este cambio, el tamaño del video de ExoPlayer conMediaCodecVideoRenderer
tiene un ancho y una altura de 0 cuandoPlayer.getCurrentTracks
no admite video o aún no se determina el tamaño de la pista de video compatible.
- Haz que
- DRM:
- Reduce la visibilidad de varios métodos solo internos en
DefaultDrmSession
a los que no se espera que se llamen desde fuera del paquete DRM:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- Reduce la visibilidad de varios métodos solo internos en
- Muxer:
- Agrega una biblioteca de combinador nueva que se pueda usar para crear un archivo de contenedor MP4.
- Extensión IMA:
- Habilitar transmisiones de DASH en vivo de varios períodos para DAI Ten en cuenta que la implementación actual aún no admite la búsqueda en transmisiones en vivo (#10912).
- Corrige un error por el que se inserta un grupo de anuncios nuevo en las transmisiones en vivo porque la posición calculada del contenido en cronogramas consecutivos varía un poco.
- Sesión:
- Agrega el método auxiliar
MediaSession.getControllerForCurrentRequest
para obtener información sobre el controlador que está llamando al métodoPlayer
. - Se agregó
androidx.media3.session.MediaButtonReceiver
para permitir que las apps implementen la reanudación de la reproducción con eventos de botones de medios enviados, por ejemplo, auriculares Bluetooth (#167). - Agrega la implementación predeterminada a
MediaSession.Callback.onAddMediaItems
para permitir que losMediaItems
solicitados se pasen aPlayer
si tienenLocalConfiguration
(p.ej., URI) (#282). - Agrega los botones de comando "Ir al siguiente" y "Ir al siguiente" en la vista de notificaciones multimedia compacta de forma predeterminada para Android 12 y versiones anteriores (#410).
- Agrega la implementación predeterminada a
MediaSession.Callback.onAddMediaItems
para permitir que losMediaItems
solicitados se pasen aPlayer
si tienenLocalConfiguration
(p.ej., URI) (#282). - Agrega los botones de comando "Ir al siguiente" y "Ir al siguiente" en la vista de notificaciones multimedia compacta de forma predeterminada para Android 12 y versiones anteriores (#410).
- Agrega el método auxiliar
- IU:
- Se agregaron los métodos de utilidad
shouldShowPlayButton
yhandlePlayPauseButtonAction
para escribir elementos de IU personalizados con un botón de reproducción/pausa.
- Se agregaron los métodos de utilidad
- Extensión RTSP:
- Extensión DASH:
- Quita la compensación horaria de contenido multimedia de
MediaLoadData.startTimeMs
yMediaLoadData.endTimeMs
para las transmisiones de DASH de varios períodos. - Se corrigió un error por el que volver a preparar una fuente multimedia en vivo de varios períodos de Dash generaba una
IndexOutOfBoundsException
(#10838).
- Quita la compensación horaria de contenido multimedia de
- Extensión HLS:
- Agrega
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
para establecer un tiempo de espera de modo que el subproceso de carga espere a que se inicialiceTimestampAdjuster
. Si la inicialización no se completa antes del tiempo de espera, se genera unaPlaybackException
para evitar que la reproducción se detenga de forma interminable. De forma predeterminada, el tiempo de espera se establece en cero (#323).
- Agrega
- Utilidades de prueba:
- Verifica la insensibilidad del uso de mayúsculas y minúsculas del esquema de URI en
DataSourceContractTest
.
- Verifica la insensibilidad del uso de mayúsculas y minúsculas del esquema de URI en
- Se quitan los símbolos obsoletos:
- Se quitaron los constructores
DefaultAudioSink
y, en su lugar, usaDefaultAudioSink.Builder
. - Quita
HlsMasterPlaylist
. En su lugar, usaHlsMultivariantPlaylist
. - Se quita
Player.stop(boolean)
. En su lugar, usaPlayer.stop()
yPlayer.clearMediaItems()
(sireset
estrue
). - Se quitaron dos constructores
SimpleCache
obsoletos y usa un constructor no obsoleto que, en su lugar, use unDatabaseProvider
para obtener un mejor rendimiento. - Se quitó el constructor
DefaultBandwidthMeter
. En su lugar, usaDefaultBandwidthMeter.Builder
. - Se quitaron los constructores
DefaultDrmSessionManager
y, en su lugar, usaDefaultDrmSessionManager.Builder
. - Se quitaron dos constructores
HttpDataSource.InvalidResponseCodeException
obsoletos y usa un constructor no obsoleto que acepte campos adicionales(cause
,responseBody
) para mejorar el registro de errores. - Quita
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
yDownloadHelper.forSmoothStreaming
. En su lugar, usaDownloadHelper.forMediaItem
. - Se quitó el constructor
DownloadService
obsoleto y usa un constructor no obsoleto que incluya la opción de proporcionar un parámetrochannelDescriptionResourceId
. - Quita las constantes de cadena obsoletas para los conjuntos de caracteres (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
yUTF16LE_NAME
) y usa los caracteres de Kotlin del paquetekotlin.text
,java.nio.charset.StandardCharsets
ocom.google.common.base.Charsets
. - Se quitó el constructor
WorkManagerScheduler
obsoleto; usa un constructor no obsoleto que incluya la opción de proporcionar un parámetroContext
en su lugar. - Quita los métodos obsoletos
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
ycreateSampleFormat
, que se usaron para crear una instancia de la claseFormat
. En su lugar, usaFormat.Builder
para crear instancias deFormat
. - Quita los métodos obsoletos
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
ycopyWithVideoSize
. En su lugar, usaFormat.buildUpon()
y los métodos set. - Se quitó el
ExoPlayer.retry()
obsoleto; en su lugar, usaprepare()
. - Se quitó el constructor obsoleto
DefaultTrackSelector
de cero argumentos. En su lugar, usaDefaultTrackSelector(Context)
. - Se quitó el constructor
OfflineLicenseHelper
obsoleto; en su lugar, usaOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Se quitó el constructor obsoleto
DownloadManager
. En su lugar, usa el constructor que toma unExecutor
. - Se quitaron los constructores obsoletos
Cue
y, en su lugar, usaCue.Builder
. - Se quitó el constructor
OfflineLicenseHelper
obsoleto; en su lugar, usaOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Se quitaron cuatro métodos
AnalyticsListener
obsoletos:onDecoderEnabled
, usaonAudioEnabled
oonVideoEnabled
en su lugar.onDecoderInitialized
, usaonAudioDecoderInitialized
oonVideoDecoderInitialized
en su lugar.onDecoderInputFormatChanged
, usaonAudioInputFormatChanged
oonVideoInputFormatChanged
en su lugar.onDecoderDisabled
, usaonAudioDisabled
oonVideoDisabled
en su lugar.
- Quita
Player.Listener.onSeekProcessed
yAnalyticsListener.onSeekProcessed
obsoletos; en su lugar, usaonPositionDiscontinuity
conDISCONTINUITY_REASON_SEEK
. - Quita
ExoPlayer.setHandleWakeLock(boolean)
y usasetWakeMode(int)
en su lugar. - Se quitó el
DefaultLoadControl.Builder.createDefaultLoadControl()
obsoleto; en su lugar, usabuild()
. - Se quitó el
MediaItem.PlaybackProperties
obsoleto; en su lugar, usaMediaItem.LocalConfiguration
. El campoMediaItem.playbackProperties
obsoleto ahora es del tipoMediaItem.LocalConfiguration
.
- Se quitaron los constructores
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 incluye los siguientes cambios desde la versión 1.0.1:
- Biblioteca principal:
- Agrega
Buffer.isLastSample()
, que indica siBuffer
contiene la marcaC.BUFFER_FLAG_LAST_SAMPLE
. - Soluciona el problema por el que es posible que no se renderice el último fotograma si la última muestra con fotogramas se quita de la cola sin leer la muestra de "fin de la transmisión". (#11079).
- Agrega
- Extractores:
- Se corrigió el análisis de SPS H.265 en archivos MPEG-TS mediante la reutilización de la lógica de análisis que ya usan los extractores RTSP y MP4 (#303).
- Texto:
- SSA: Se agrega compatibilidad con archivos UTF-16 si comienzan con una marca de orden de bytes (#319).
- Sesión:
- Se corrigió el problema por el que
MediaController
no actualiza sus comandos disponibles cuando se conecta a unMediaSessionCompat
heredado que actualiza sus acciones. - Se corrigió el error que impedía que
MediaLibraryService
mostrara un valor nulo para una llamada desde la IU del sistema aCallback.onGetLibraryRoot
conparams.isRecent == true
en el nivel de API 30 (#355). - Se corrigió la fuga de memoria de
MediaSessionService
oMediaLibraryService
(#346). - Se corrigió un error por el que una actualización combinada de
Timeline
y posición en unMediaSession
podía provocar que unMediaController
arroje unaIllegalStateException
.
- Se corrigió el problema por el que
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 a la posición predeterminada (#11051).
- Se corrigió el error por el que las transmisiones de muestra vacías en el contenido multimedia podían bloquear la reproducción.
- Sesión:
- Se corrigió un error por el que varios elementos de cola idénticos publicados por un
MediaSessionCompat
heredado generaban una excepción enMediaController
(#290). - Agrega el reenvío faltante de
MediaSession.broadcastCustomCommand
alMediaControllerCompat.Callback.onSessionEvent
heredado (#293). - Corrige el error por el que llamar a
MediaSession.setPlayer
no actualiza los comandos disponibles. - Se corrige el problema por el que se ignoran las instancias de
TrackSelectionOverride
enviadas desde unMediaController
si hacen referencia a un grupo conFormat.metadata
(#296). - Se solucionó el problema por el que
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
debe estar disponible para acceder a los metadatos a través delMediaSessionCompat
heredado. - Se corrigió el problema por el que las instancias
MediaSession
de un subproceso en segundo plano causaban fallas cuando se usaban enMediaSessionService
(#318). - Se solucionó el problema por el que la biblioteca declaraba un receptor de botón multimedia sin que la app lo pretendía (#314).
- Se corrigió un error por el que varios elementos de cola idénticos publicados por un
- 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 de RTSP 461 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 hubo 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:
- Descargas:
- Marca la diferencia máxima entre la hora de inicio de dos segmentos que se podrán combinar y configurar en
SegmentDownloader
y subclases (#248).
- Marca la diferencia máxima entre la hora de inicio de dos segmentos que se podrán combinar y configurar en
- Audio:
- Video:
- Asigna el formato HEVC HDR10 a
HEVCProfileMain10HDR10
en lugar deHEVCProfileMain10
. - Se agregó una solución alternativa para un problema de dispositivo en Chromecast con Google TV y Lenovo M10 FHD Plus que provoca que las transmisiones AVC de 60 FPS se marquen como no compatibles (#10898).
- Se solucionaron los problemas de rendimiento de la liberación de fotogramas cuando se reproduce contenido multimedia con una velocidad de fotogramas mucho mayor que la frecuencia de actualización de la pantalla.
- Asigna el formato HEVC HDR10 a
- Transmisión:
- Se corrigió el
STATE_IDLE
transitorio cuando se realiza la transición entre elementos multimedia (#245).
- Se corrigió el
- RTSP:
- Se detecta la IllegalArgumentException que se arroja al analizar los mensajes de respuesta de la descripción de RTSP no válidos (#10971).
- Sesión:
- Se corrigió un error por el que el botón de notificación de reproducción/pausa no se actualizaba con el estado del reproductor (#192).
- Extensión IMA:
- Corrige un error que impedía que se iniciaran las transmisiones de DAI sin anuncios porque no se recibió el primer evento
LOADED
(y, en el caso sin anuncios, el único).
- Corrige un error que impedía que se iniciaran las transmisiones de DAI sin anuncios porque no se recibió el primer evento
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).
- Modifica la lógica de ordenamiento del decodificador del renderizador para mantener las preferencias de
- Extractores:
- Arroja una
ParserException
en lugar de unaNullPointerException
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).
- Arroja una
- 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).
- Usa la tasa de bits de formato de audio comprimido para calcular el tamaño mínimo del búfer de
- Texto:
- Corrige
TextRenderer
pasando un índice no válido (negativo) aSubtitle.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.
- Corrige
- 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 deMediaMetadata.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).
- Corrige el
- Sesión:
- Agrega un
SimpleBasePlayer
abstracto para ayudar a implementar la interfazPlayer
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()
delDefaultMediaNotificationProvider
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 listaMediaItem
, 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).
- Agrega un
- 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 deMediaMetadata.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
aImaServerSideAdInsertionMediaSource.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()
aImaServerSideAdInsertionMediaSource.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.
- Quita el objeto de escucha del reproductor de
- App de demostración:
- 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 soloMediaSource
(#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 aseekToNext
oseekToPrevious
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).
- Se agregó
- 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.
- Se aplicó una
- 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 mismoPriorityTaskManager
(#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).
- Se corrigió el posible bucle infinito en
- Video:
- Prueba el decodificador alternativo para Dolby Vision si la pantalla no lo admite (#9794).
- Audio:
- Usa
SingleThreadExecutor
para liberar instancias deAudioTrack
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
aandroidx.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).
- Usa
- Metadatos:
MetadataRenderer
ahora se puede configurar para procesar metadatos apenas estén disponibles. Crea una instancia conMetadataRenderer(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).
- Se analiza
- IU:
- Usa las anulaciones actuales del reproductor como ajuste predeterminado en
TrackSelectionDialogBuilder
(#10429).
- Usa las anulaciones actuales del reproductor como ajuste predeterminado en
- 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 deDefaultMediaNotificationProvider
. 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étodoDefaultMediaNotificationProvider.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 defile://
(#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:
- 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 identificarCastPlayer
cuando se controla la reproducción con unMediaController
(#142).
- Implementa
- 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.
- Se quita
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
conExoPlayer.setShuffleOrder
, se genere una llamada aPlayer.Listener#onTimelineChanged
conreason=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
enDefaultMediaSourceFactory
, que no funcionaba en algunos casos (#116).
- Asegúrate de que, si cambias
- Extractores:
- 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
enLeanbackAdapter
(10420).
- Escucha los cambios de
- Transmisión:
Versión 1.0.0-beta01
16 de junio de 2022
Lanzamiento de androidx.media3:media3-*:1.0.0-beta01
.
La versión 1.0.0-beta01 contiene estas confirmaciones.
Esto corresponde a 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 conExoPlayer.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
aMediaSource.Factory.setDrmSessionManagerProvider
niMediaSource.Factory.setLoadErrorHandlingPolicy
. Las instancias deDefaultDrmSessionManagerProvider
yDefaultLoadErrorHandlingPolicy
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 elLocalConfiguration
exacto. También se quitóMediaMetadata.mediaUrl
, ya que ahora se incluye enRequestMetadata
. - Se agregó
Player.Command.COMMAND_SET_MEDIA_ITEM
para permitir que los jugadores dejen configurar un solo elemento.
- Habilita la compatibilidad con el diagnóstico de la plataforma de Android a través de
- Selección de pistas:
- Se compactó la clase
TrackSelectionOverrides
enTrackSelectionParameters
y promueveTrackSelectionOverride
a una clase de nivel superior. - Se cambió el nombre de
TracksInfo
porTracks
y el deTracksInfo.TrackGroupInfo
porTracks.Group
. También se cambió el nombre dePlayer.getCurrentTracksInfo
yPlayer.Listener.onTracksInfoChanged
porPlayer.getCurrentTracks
yPlayer.Listener.onTracksChanged
. Esto incluye "anular la baja" del nombre del métodoPlayer.Listener.onTracksChanged
, pero con diferentes tipos de parámetros. - Se cambió
DefaultTrackSelector.buildUponParameters
yDefaultTrackSelector.Parameters.buildUpon
para mostrarDefaultTrackSelector.Parameters.Builder
en lugar deDefaultTrackSelector.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 IUtelevision
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 instanciaDefaultTrackSelector
debe construirse con unContext
.
- Se compactó la clase
- Video:
- Se cambió el nombre de
DummySurface
porPlaceholderSurface
. - Se agregó compatibilidad con AV1 a
MediaCodecVideoRenderer.getCodecMaxInputSize
.
- Se cambió el nombre de
- 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()
deandroid.media.AudioAttributes
a una nueva clase de wrapperAudioAttributesV21
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 canalAudioFormat.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 mostrarCueGroup
en lugar deList<Cue>
. - SSA: Admite la configuración de estilo
OutlineColour
cuandoBorderStyle == 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.
- Se cambió
- Extractores:
- IU:
- Se corrigió la entrega de eventos a los
OnClickListener
configurados enPlayerView
en el caso deuseController=false
(#9605). También se corrigió la entrega de eventos aOnLongClickListener
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 deACTION_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
yTrackSelectionDialogBuilder
para que funcionen con la interfazPlayer
en lugar deExoPlayer
. Esto permite que las vistas se usen con otras implementaciones dePlayer
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).
- Se corrigió la entrega de eventos a los
- 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
aDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
. Las instancias deDefaultCompositeSequenceableLoaderFactory
se pueden pasar de forma explícita si es necesario.
- Se analiza el recuento de canales desde los elementos DTS
- 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
aHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
niHlsMediaSource.Factory.setPlaylistTrackerFactory
. Las instancias deDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
o una referencia aDefaultHlsPlaylistTracker.FACTORY
se pueden pasar de forma explícita si es necesario.
- Transmisión fluida:
- No se permite que se pase
null
aSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
. Las instancias deDefaultCompositeSequenceableLoaderFactory
se pueden pasar de forma explícita si es necesario.
- No se permite que se pase
- 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
porPlaceholderDataSource
. - Se solucionó el control de la interrupción de OkHttp.
- Se cambió el nombre de
- Sesión:
- Se reemplazó
MediaSession.MediaItemFiller
porMediaSession.Callback.onAddMediaItems
para permitir la resolución asíncrona de las solicitudes. - Ahora se admiten métodos
setMediaItems(s)
cuandoMediaController
se conecta a una sesión multimedia heredada. - Se quitaron
MediaController.setMediaUri
yMediaSession.Callback.onSetMediaUri
. La misma funcionalidad se puede lograr conMediaController.setMediaItem
yMediaSession.Callback.onAddMediaItems
. - Ahora se desvían las llamadas heredadas de
MediaController
a fin de reproducir contenido multimedia enMediaSession.Callback.onAddMediaItems
, en lugar deonSetMediaUri
. - Se agregaron
MediaNotification.Provider
yDefaultMediaNotificationProvider
para proporcionar personalización de la notificación. - Se agregaron
BitmapLoader
ySimpleBitmapLoader
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
porMediaSession.Callback
, el deMediaLibrarySession.MediaLibrarySessionCallback
porMediaLibrarySession.Callback
y el deMediaSession.Builder.setSessionCallback
porsetCallback
. - 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).
- Se reemplazó
- 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 actualizó la versión de CMake a
- Se quitan los símbolos obsoletos:
- Se quitó
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Se usaPlayer.Listener.onTracksChanged(Tracks)
en su lugar. - Se quitaron
Player.getCurrentTrackGroups
yPlayer.getCurrentTrackSelections
. UsaPlayer.getCurrentTracks
en su lugar. También puedes seguir usandoExoPlayer.getCurrentTrackGroups
yExoPlayer.getCurrentTrackSelections
, aunque estos métodos permanecen obsoletos. - Se quitaron las constantes
DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
yDEFAULT_TRACK_SELECTOR_PARAMETERS
deDownloadHelper
. UsagetDefaultTrackSelectorParameters(Context)
cuando sea posible y, de lo contrario, usaDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Se quitó el constructor
DefaultTrackSelector(ExoTrackSelection.Factory)
. UsaDefaultTrackSelector(Context, ExoTrackSelection.Factory)
en su lugar. - Se quitó
Transformer.Builder.setContext
. En su lugar, se debe pasar elContext
al constructorTransformer.Builder
.
- Se quitó
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
yMediaItem.SubtitleConfiguration.Builder.setId
para priorizar el campoSubtitleConfiguration
y recurrir al valorFactory
si no está configurado (#10016).
- Se corrige la interacción de
- 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 deDefaultRenderersFactory
que anulenbuildVideoRenderers()
obuildAudioRenderers()
puedan acceder a la fábrica del adaptador de códec y pasarlo a las instanciasMediaCodecRenderer
que crean. - Se propagan los campos de encabezado ICY
name
ygenre
aMediaMetadata.station
yMediaMetadata.genre
respectivamente para que lleguen a la app a través dePlayer.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 deMediaCodec
(#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
aqueuedInputBufferCount
. - Se hace el elemento
SimpleExoPlayer.renderers
privado. Se puede acceder a los procesadores a través deExoPlayer.getRenderer
. - Se actualizaron algunos valores constantes de
AnalyticsListener.EventFlags
para que coincidan con los valores enPlayer.EventFlags
. - Se divide
AnalyticsCollector
en una interfaz y una implementación predeterminada para permitir que R8 lo quite si una app no lo necesita.
- Se agrega el método protegido
- 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
enTrackGroupArray
.TrackGroup
siempre se pueden distinguir si se configuraid
en el constructorTrackGroup
. 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 pasarAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
de manera explícita en lugar denull
. - Se permite la personalización del cálculo del tamaño del búfer de
AudioTrack
mediante la inserción deAudioTrackBufferSizeProvider
enDefaultAudioSink
(#8891). - Vuelve a intentar la creación de
AudioTrack
si el tamaño del búfer solicitado es superior a 1 MB (#9712).
- Extractores:
- Texto:
- Se agrega un campo
MediaItem.SubtitleConfiguration.id
que se propaga al campoFormat.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.
- Se agrega un campo
- DRM:
- Se quita
playbackLooper
deDrmSessionManager.(pre)acquireSession
. Cuando una app usaDrmSessionManager
enMediaSource
personalizado, en su lugar,playbackLooper
debe pasarse aDrmSessionManager.setPlayer
.
- Se quita
- 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:
- 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
comoC.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).
- Se agregan propiedades analizadas, esenciales y adicionales a
- 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).
- Se propaga correctamente
- 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).
- Se proporciona una API de cliente a fin de anular
- 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 asetClearMediaItemsOnStop(false)
en el conector.
- De forma predeterminada,
- Extensión Cast:
- Extensión FFmpeg:
- Causa que
build_ffmpeg.sh
dependa de binutils de LLVM en lugar de los de GNU (#9933).
- Causa que
- 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 deplay-services-cast-framework
no son compatibles con las apps orientadas a Android 12 y fallan conIllegalArgumentException
cuando se creanPendingIntent
(#9528)..
- Se actualiza la extensión Cast para que dependa de
- Se quitan los símbolos obsoletos:
- Se quita
Player.EventListener
. Se usaPlayer.Listener
en su lugar. - Se quitan
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
yMediaSourceFactory#setDrmUserAgent
. Se usaMediaSourceFactory#setDrmSessionManagerProvider
en su lugar. - Se quita
MediaSourceFactory#setStreamKeys
. Se usaMediaItem.Builder#setStreamKeys
en su lugar. - Se quita
MediaSourceFactory#createMediaSource(Uri)
. Se usaMediaSourceFactory#createMediaSource(MediaItem)
en su lugar. - Se quita
setTag
deDashMediaSource
,HlsMediaSource
ySsMediaSource
. Se usaMediaItem.Builder#setTag
en su lugar. - Se quita
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. Se usanMediaItem.Builder#setLiveConfiguration
yMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
para anular el manifiesto, oDashMediaSource#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
yActionFileUpgradeUtil
. Se usa ExoPlayer 2.16.1 o una versión anterior para usarActionFileUpgradeUtil
a fin de combinar archivos de acción heredados enDefaultDownloadIndex
. - Se quita
ProgressiveMediaSource#setExtractorsFactory
. Se usa el constructorProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
en su lugar. - Se quitan
ProgressiveMediaSource.Factory#setTag
yProgressiveMediaSource.Factory#setCustomCacheKey
. Se usanMediaItem.Builder#setTag
yMediaItem.Builder#setCustomCacheKey
en su lugar. - Se quitan los constructores
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
yDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
. Se usan el constructorDefaultRenderersFactory(Context)
,DefaultRenderersFactory#setExtensionRendererMode
yDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
en su lugar. - Se quitan todos los constructores públicos
CronetDataSource
. Se usaCronetDataSource.Factory
en su lugar.
- Se quita
- 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 paquetecom.google.android.exoplayer2.ext.flac
)@FlacExtractor.Flags
(en el paquetecom.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.