Media3

Bibliotecas de compatibilidad para casos de uso de contenido multimedia.
Actualización más reciente Versión estable Versión potencial Versión beta Versión alfa
9 de marzo de 2022 - - - 1.0.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 {
    val media3_version = "1.0.0-alpha02"

    // 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 RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$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"

    // 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 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"
}

Kotlin

dependencies {
    val media3_version = "1.0.0-alpha02"

    // 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 RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$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")

    // 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 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")
}

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

Versión 1.0.0-alpha03

14 de marzo de 2022

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

Esto corresponde a ExoPlayer versión 2.17.1.

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

Versión 1.0.0-alpha02

2 de marzo de 2022

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

Esto corresponde a ExoPlayer versión 2.17.0.

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

Versión 1.0.0-alpha01

27 de octubre de 2021

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

Funciones nuevas

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

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

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

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