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:
DashMediaSource
pour DASH.SsMediaSource
pour SmoothStreaming.HlsMediaSource
pour HLSProgressiveMediaSource
pour les fichiers multimédias standards.RtspMediaSource
pour RTSP.
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'utiliserMediaItem.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 avecadjustPeriodTimeOffsets
etclipDurations
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'utiliserMediaItem.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 seulTimeline.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 quePlayer.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.