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 sources multimédias non compatibles avec la configuration par défaut du lecteur, plusieurs options de personnalisation sont disponibles.

Personnaliser la création de sources multimédias

Lors de la création du lecteur, un MediaSource.Factory peut être injecté. Par exemple, si une application souhaite insérer des annonces et utiliser un CacheDataSource.Factory pour prendre en charge le cache, une instance de DefaultMediaSourceFactory peut être configurée pour répondre à ces exigences et injectée lors de la création 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();

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

Vous pouvez également 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 sera appelée pour créer une source multimédia pour chaque élément multimédia ajouté à la playlist.

API de playlist basée sur une source multimédia

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

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 avancée des sources multimédias

ExoPlayer fournit plusieurs implémentations MediaSource pour modifier et composer d'autres instances MediaSource. Ils sont particulièrement utiles lorsque plusieurs personnalisations doivent être combinées et qu'aucun des chemins de configuration plus simples n'est suffisant.

  • ClippingMediaSource: permet de rogner des contenus multimédias selon une plage d'horodatage spécifiée. S'il s'agit de la seule modification, il est préférable d'utiliser MediaItem.ClippingConfiguration à la place.
  • FilteringMediaSource: filtre les pistes disponibles en fonction des types spécifiés, par exemple, en n'exposant que la piste vidéo 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 les paramètres de sélection de piste.
  • MergingMediaSource: fusionne plusieurs sources multimédias pour permettre la lecture en parallèle. Dans la quasi-totalité des cas, il est conseillé d'appeler le constructeur avec adjustPeriodTimeOffsets et clipDurations définis sur "true" pour s'assurer que toutes les sources commencent et se terminent en même temps. Si cette modification est effectuée pour ajouter des sous-titres téléchargés, il est préférable d'utiliser MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: fusionne plusieurs sources multimédias pour les lire de manière consécutive. La structure multimédia visible par l'utilisateur expose un seul 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 Playlist telles que Player.addMediaItem.
  • SilenceMediaSource: génère un silence pendant une durée spécifiée, ce qui est utile pour combler les lacunes.
  • 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.