Sources multimédias

Dans ExoPlayer, chaque contenu 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 de contenu MediaSource 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 qui ont besoin de 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 la mise en 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();

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

Il est également possible d'injecter une implémentation MediaSource.Factory personnalisée, par exemple pour prendre en charge 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 la source multimédia

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 le MediaSource.Factory interne du lecteur 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. Elles 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 couper le contenu multimédia selon une plage d'horodatage spécifique. Si c'est la seule modification, il est préférable d'utiliser MediaItem.ClippingConfiguration.
  • FilteringMediaSource : filtre les pistes disponibles selon les types spécifiés. Par exemple, il n'expose que la piste vidéo d'un fichier contenant à la fois de l'audio et de la vidéo. Si c'est la seule modification, il est préférable d'utiliser les paramètres de sélection des pistes.
  • MergingMediaSource : fusionne plusieurs sources multimédias pour les lire en parallèle. Dans la plupart 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 importés, il est préférable d'utiliser MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2 : fusionne plusieurs sources multimédias pour les lire consécutivement. La structure média visible par l'utilisateur expose un seul Timeline.Window, ce qui signifie qu'il 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, comme Player.addMediaItem.
  • SilenceMediaSource : génère du 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 sur l'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 sur l'insertion d'annonces.