Fuentes de medios

En ExoPlayer, cada elemento multimedia se representa con un MediaItem. Sin embargo, de forma interna, el reproductor necesita instancias de MediaSource para reproducir el contenido. El reproductor los crea 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:

DefaultMediaSourceFactory también puede crear fuentes de contenido multimedia más complejas según las propiedades de los elementos multimedia correspondientes. Esto se describe con más detalle en la página de 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 el almacenamiento en 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 de DefaultMediaSourceFactory, se describen las opciones disponibles con más detalle.

También es posible insertar una implementación personalizada de MediaSource.Factory, por ejemplo, para admitir la creación de un tipo de fuente de contenido multimedia personalizado. Se llamará al método 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 lista de reproducción 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 de contenido multimedia directamente al reproductor:

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. Estas son más útiles en los casos en que se deben combinar varias personalizaciones y ninguna de las rutas de configuración más simples es suficiente.

  • ClippingMediaSource: Permite recortar contenido multimedia en un rango de marcas de tiempo especificado. Si esta es la única modificación, es preferible usar MediaItem.ClippingConfiguration en su lugar.
  • FilteringMediaSource: Filtra las pistas disponibles según los tipos especificados, por ejemplo, solo expone la pista de video de un archivo que contiene audio y video. Si esta es la única modificación, es preferible usar los parámetros de selección de pistas.
  • MergingMediaSource: Combina varias fuentes de contenido multimedia para reproducirlas en paralelo. En casi todos los casos, se recomienda llamar al constructor con adjustPeriodTimeOffsets y clipDurations establecidos en verdadero para garantizar que todas las fuentes comiencen y finalicen al mismo tiempo. Si se realiza esta modificación para agregar subtítulos de instalación de prueba, es preferible usar MediaItem.SubtitleConfiguration en su lugar.
  • ConcatenatingMediaSource2: Combina varias fuentes de contenido multimedia para reproducirlas de forma consecutiva. La estructura de contenido multimedia visible para el usuario expone un solo Timeline.Window, lo que significa que se ve como un solo elemento. Si se realiza esta modificación para reproducir varios elementos que no se supone que se vean como uno solo, es preferible usar los métodos de la API de lista de reproducción, como Player.addMediaItem.
  • SilenceMediaSource: Genera silencio durante un período específico, lo que es útil para llenar espacios vacíos.
  • AdsMediaSource: Extiende una fuente de contenido multimedia con funciones 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.