Fuentes de medios

En ExoPlayer, cada elemento multimedia se representa con un MediaItem. Sin embargo, internamente, el reproductor necesita MediaSource instancias para reproducir el contenido. El 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 en las propiedades de los elementos multimedia correspondientes. Esto se describe en más detalle en la Página Elementos multimedia.

Para las apps que necesitan configuraciones de fuentes de contenido multimedia que no son compatibles con configuración predeterminada del reproductor, hay varias opciones para personalización.

Cómo personalizar la creación de fuentes 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 en caché, se puede configurar una instancia de DefaultMediaSourceFactory para que coincida estos requisitos e inyectados 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();

El DefaultMediaSourceFactory JavaDoc describe las opciones disponibles con más detalle.

También es posible insertar una implementación de MediaSource.Factory personalizada para para admitir la creación de un tipo personalizado de fuente multimedia. La fábrica Se llamará a createMediaSource(MediaItem) para crear una fuente de contenido multimedia para cada elemento multimedia que se agregado a la playlist.

API de playlist basada en fuentes multimedia

La interfaz ExoPlayer define los métodos de playlist adicionales que aceptan fuentes multimedia en lugar de elementos multimedia. Esto permite evitar MediaSource.Factory interno del reproductor y pasa instancias de fuentes multimedia al 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 multimedia

ExoPlayer proporciona varias implementaciones de MediaSource para modificar y redactar otras MediaSource instancias. Son muy útiles en los casos en que varios se deben combinar las personalizaciones, y no se usa ninguna suficientes.

  • ClippingMediaSource: Permite recortar contenido multimedia en función de un rango de marca de tiempo especificado. Si esta es la única modificación, es preferible usar MediaItem.ClippingConfiguration en su lugar.
  • FilteringMediaSource: filtra los segmentos disponibles para los tipos especificados por Por ejemplo, solo mostrar la pista de video de un archivo que contiene ambas y video. Si esta es la única modificación, es preferible usar Haz un seguimiento de los parámetros de selección.
  • MergingMediaSource: Combina varias fuentes multimedia para reproducirlas en paralelo. En en casi todos los casos, es recomendable llamar al constructor con adjustPeriodTimeOffsets y clipDurations establecidos como verdadero para garantizar que todos las fuentes empiezan y terminan al mismo tiempo. Si esta modificación se hace para agregar subtítulos transferibles, es preferible usarlos MediaItem.SubtitleConfiguration en su lugar.
  • ConcatenatingMediaSource2: Combina varias fuentes multimedia para reproducirlas. de forma consecutiva. La estructura multimedia visible para el usuario expone Timeline.Window, lo que significa que parece un solo elemento. Si esta La modificación se hace para reproducir varios elementos que no deberían verse como solo hay uno, es preferible usar los métodos de la API de playlist, como Player.addMediaItem en su lugar.
  • SilenceMediaSource: Genera silencio durante una duración especificada que es útil para llenar los vacíos.
  • AdsMediaSource: Extiende una fuente multimedia con la inserción de anuncios del cliente capacidades de integración. Consulte la guía de inserción de anuncios para obtener más información.
  • ServerSideAdInsertionMediaSource: Extiende una fuente multimedia con un anuncio del servidor de inserción y producción. Consulte la guía de inserción de anuncios para obtener más información.