En ExoPlayer, cada elemento multimedia está representado por un MediaItem
. Sin embargo, de forma interna, el reproductor necesita instancias de MediaSource
para reproducir el contenido. El reproductor crea estos elementos a partir de elementos multimedia con un MediaSource.Factory
.
De forma predeterminada, el reproductor usa un DefaultMediaSourceFactory
, que puede crear instancias de las siguientes implementaciones de MediaSource
de contenido:
DashMediaSource
para DASH.SsMediaSource
para SmoothStreaming.HlsMediaSource
para HLS.ProgressiveMediaSource
para archivos multimedia normalesRtspMediaSource
para RTSP.
DefaultMediaSourceFactory
también puede crear fuentes de medios más complejas según las propiedades de los elementos multimedia correspondientes. Esto se describe con más detalle en la página Elementos multimedia.
En el caso de las apps que necesitan configuraciones de fuentes de contenido multimedia que no son compatibles con la configuración predeterminada del reproductor, existen varias opciones de personalización.
Cómo personalizar la creación de fuentes de contenido multimedia
Cuando se compila el reproductor, se puede insertar un MediaSource.Factory
. Por ejemplo,
si una app quiere insertar anuncios y usar un CacheDataSource.Factory
para admitir
caché, se puede configurar una instancia de DefaultMediaSourceFactory
para que coincida
con estos requisitos y se inserte durante la construcción del reproductor:
Kotlin
val mediaSourceFactory: MediaSource.Factory = DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, playerView) val player = ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build()
Java
MediaSource.Factory mediaSourceFactory = new DefaultMediaSourceFactory(context) .setDataSourceFactory(cacheDataSourceFactory) .setLocalAdInsertionComponents(adsLoaderProvider, /* adViewProvider= */ playerView); ExoPlayer player = new ExoPlayer.Builder(context).setMediaSourceFactory(mediaSourceFactory).build();
En el JavaDoc DefaultMediaSourceFactory
, se describen las opciones disponibles con más detalle.
También es posible insertar una implementación MediaSource.Factory
personalizada, por ejemplo, para admitir la creación de un tipo de fuente de medios personalizado. Se llamará a createMediaSource(MediaItem)
de la fábrica para crear una fuente de contenido multimedia para cada elemento multimedia que se agregue a la playlist.
API de playlist basada en fuentes de contenido multimedia
La interfaz ExoPlayer
define métodos de playlist adicionales que aceptan fuentes de contenido multimedia en lugar de elementos multimedia. Esto permite omitir el MediaSource.Factory
interno del reproductor y pasar instancias de fuentes multimedia al reproductor directamente:
Kotlin
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources) // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource) // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)) exoPlayer.prepare() exoPlayer.play()
Java
// Set a list of media sources as initial playlist. exoPlayer.setMediaSources(listOfMediaSources); // Add a single media source. exoPlayer.addMediaSource(anotherMediaSource); // Can be combined with the media item API. exoPlayer.addMediaItem(/* index= */ 3, MediaItem.fromUri(videoUri)); exoPlayer.prepare(); exoPlayer.play();
Composición avanzada de fuentes de contenido multimedia
ExoPlayer proporciona varias implementaciones de MediaSource
para modificar y componer otras instancias de MediaSource
. Son más útiles en los casos en los que se deben combinar varias
personalización y ninguna de las rutas de configuración más simples es
suficiente.
ClippingMediaSource
: Permite recortar contenido multimedia en un intervalo de marca de tiempo especificado. Si esta es la única modificación, es preferible usarMediaItem.ClippingConfiguration
en su lugar.FilteringMediaSource
: Filtra las pistas disponibles a los tipos especificados, por ejemplo, solo exponer la pista de video de un archivo que contiene audio y video. Si esta es la única modificación, es preferible usar parámetros de selección de pistas en su lugar.MergingMediaSource
: Combina varias fuentes de contenido multimedia para que se reproduzcan en paralelo. En casi todos los casos, es recomendable llamar al constructor conadjustPeriodTimeOffsets
yclipDurations
configurados como verdaderos para garantizar que todas las fuentes comiencen y finalicen al mismo tiempo. Si se realiza esta modificación para agregar subtítulos adicionales, es preferible usarMediaItem.SubtitleConfiguration
en su lugar.ConcatenatingMediaSource2
: Combina varias fuentes de contenido multimedia para reproducirlas de forma consecutiva. La estructura multimedia visible para el usuario expone un únicoTimeline.Window
, lo que significa que parece un solo elemento. Si se realiza esta modificación para reproducir varios elementos que no deben parecer uno solo, es preferible usar los métodos de la API de playlist, comoPlayer.addMediaItem
.SilenceMediaSource
: Genera silencio durante un tiempo específico que es útil para completar los vacíos.AdsMediaSource
: Extiende una fuente de medios con capacidades de inserción de anuncios del cliente. Consulta la guía de inserción de anuncios para obtener más detalles.ServerSideAdInsertionMediaSource
: Extiende una fuente de contenido multimedia con capacidades de inserción de anuncios del servidor. Consulta la guía de inserción de anuncios para obtener más detalles.