Sources multimédias

Dans ExoPlayer, chaque élément multimédia est représenté par un MediaItem. Toutefois, en interne, le lecteur a besoin d'instances MediaSource pour lire le contenu. Le lecteur les crée à partir d'éléments multimédias à l'aide d'un MediaSource.Factory.

Par défaut, le lecteur utilise un DefaultMediaSourceFactory, qui peut créer des instances des implémentations MediaSource de contenu suivantes:

DefaultMediaSourceFactory peut également créer des sources multimédias plus complexes en fonction des propriétés des éléments multimédias correspondants. Pour en savoir plus, consultez la page Éléments multimédias.

Pour les applications nécessitant des configurations de source multimédia non compatibles avec la configuration par défaut du lecteur, plusieurs options de personnalisation sont disponibles.

Personnaliser la création de la source multimédia

Lors de la création du lecteur, une MediaSource.Factory peut être injectée. Par exemple, si une application souhaite insérer des annonces et utiliser un CacheDataSource.Factory pour prendre en charge la mise en cache, une instance de DefaultMediaSourceFactory peut être configurée pour répondre à ces exigences et injectée lors de la construction du lecteur:

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();

La documentation JavaDoc DefaultMediaSourceFactory décrit plus en détail les options disponibles.

Il est également possible d'injecter une implémentation MediaSource.Factory personnalisée, par exemple pour permettre la création d'un type de source multimédia personnalisé. La méthode createMediaSource(MediaItem) de la fabrique est appelée pour créer une source multimédia pour chaque élément multimédia ajouté à la playlist.

API Media Source Play playlist

L'interface ExoPlayer définit des méthodes de playlist supplémentaires qui acceptent les sources multimédias plutôt que les éléments multimédias. Cela permet de contourner la MediaSource.Factory interne du lecteur et de lui transmettre directement les instances de sources multimédias:

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();

Composition de la source multimédia avancée

ExoPlayer fournit plusieurs implémentations de MediaSource pour modifier et composer d'autres instances de MediaSource. Ils sont particulièrement utiles lorsqu'il faut combiner plusieurs personnalisations et qu'aucun des chemins de configuration plus simples ne suffit.

  • ClippingMediaSource: permet de rogner le contenu multimédia en fonction d'une plage d'horodatage spécifiée. S'il s'agit de la seule modification, il est préférable d'utiliser MediaItem.ClippingConfiguration.
  • FilteringMediaSource: filtre les pistes disponibles en fonction des types spécifiés, par exemple en exposant simplement la piste vidéo à partir d'un fichier contenant à la fois de l'audio et de la vidéo. S'il s'agit de la seule modification, il est préférable d'utiliser plutôt des paramètres de sélection de suivi.
  • MergingMediaSource: fusionne plusieurs sources multimédias pour les lire en parallèle. Dans la plupart des cas, il est recommandé d'appeler le constructeur avec adjustPeriodTimeOffsets et clipDurations définis sur "true" pour vous assurer que toutes les sources commencent et se terminent en même temps. Si cette modification est effectuée pour ajouter des sous-titres à chargement partiel, il est préférable d'utiliser MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: fusionne plusieurs sources multimédias pour les lire simultanément. La structure multimédia visible par l'utilisateur expose un seul élément Timeline.Window, ce qui signifie qu'elle ressemble à un seul élément. Si cette modification est effectuée pour lire plusieurs éléments qui ne sont pas censés ressembler à un seul, il est préférable d'utiliser les méthodes de l'API des playlists telles que Player.addMediaItem.
  • SilenceMediaSource: génère un silence pendant une durée spécifiée utile pour combler les écarts.
  • AdsMediaSource: étend une source multimédia avec des fonctionnalités d'insertion d'annonces côté client. Pour en savoir plus, consultez le guide d'insertion d'annonces.
  • ServerSideAdInsertionMediaSource: étend une source multimédia avec des fonctionnalités d'insertion d'annonces côté serveur. Pour en savoir plus, consultez le guide d'insertion d'annonces.