In ExoPlayer, ogni contenuto multimediale è rappresentato da un MediaItem
. Tuttavia, internamente il player ha bisogno di MediaSource
istanze per riprodurre i contenuti. Il
lettore li crea da elementi multimediali utilizzando un MediaSource.Factory
.
Per impostazione predefinita, il player utilizza un DefaultMediaSourceFactory
, che può creare
istanze delle seguenti implementazioni di MediaSource
dei contenuti:
DashMediaSource
per DASH.SsMediaSource
per SmoothStreaming.HlsMediaSource
per HLS.ProgressiveMediaSource
per i file multimediali normali.RtspMediaSource
per RTSP.
DefaultMediaSourceFactory
può anche creare origini media più complesse a seconda delle proprietà degli elementi multimediali corrispondenti. Questa operazione è descritta in modo più dettagliato nella pagina Elementi multimediali.
Per le app che richiedono configurazioni delle origini multimediali non supportate dalla configurazione predefinita del player, sono disponibili diverse opzioni di personalizzazione.
Personalizzazione della creazione di fonti multimediali
Durante la creazione del player, è possibile iniettare un MediaSource.Factory
. Ad esempio, se un'app vuole inserire annunci e utilizzare un CacheDataSource.Factory
per supportare la memorizzazione nella cache, è possibile configurare un'istanza di DefaultMediaSourceFactory
in modo che soddisfi questi requisiti e iniettarla durante la costruzione del player:
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 DefaultMediaSourceFactory
documentazione Java descrive le opzioni disponibili in modo più dettagliato.
È anche possibile inserire un'implementazione MediaSource.Factory
personalizzata, ad esempio per supportare la creazione di un tipo di origine multimediale personalizzato. Verrà chiamato il metodo createMediaSource(MediaItem)
della fabbrica per creare un'origine media per ogni elemento media che viene aggiunto alla playlist.
API di playlist basata su origini multimediali
L'interfaccia di ExoPlayer
definisce metodi aggiuntivi per le playlist che accettano fonti multimediali anziché elementi multimediali. In questo modo è possibile bypassare il MediaSource.Factory
interno del player e passare direttamente le istanze dell'origine media al player:
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();
Composizione avanzata delle origini media
ExoPlayer fornisce più implementazioni di MediaSource
per modificare e comporre altre istanze di MediaSource
. Sono particolarmente utili nei casi in cui è necessario combinare più personalizzazioni e nessuno dei percorsi di configurazione più semplici è sufficiente.
ClippingMediaSource
: consente di tagliare i contenuti multimediali in base a un intervallo di timestamp specificato. Se questa è l'unica modifica, è preferibile utilizzareMediaItem.ClippingConfiguration
.FilteringMediaSource
: filtra le tracce disponibili in base ai tipi specificati, ad esempio, mostrando solo la traccia video di un file che contiene sia audio che video. Se questa è l'unica modifica, è preferibile utilizzare i parametri di selezione dei canali.MergingMediaSource
: unisce più origini multimediali per riprodurle in parallelo. In quasi tutti i casi, è consigliabile chiamare il costruttore conadjustPeriodTimeOffsets
eclipDurations
impostati su true per assicurarti che tutte le sorgenti inizino e finiscano contemporaneamente. Se questa modifica viene eseguita per aggiungere sottotitoli caricati a lato, è preferibile utilizzareMediaItem.SubtitleConfiguration
.ConcatenatingMediaSource2
: unisce più origini multimediali da riprodurre consecutivamente. La struttura dei contenuti multimediali visibile all'utente espone un singoloTimeline.Window
, il che significa che sembra un singolo elemento. Se questa modifica viene eseguita per riprodurre più elementi che non devono apparire come uno solo, è preferibile utilizzare i metodi dell'API playlist comePlayer.addMediaItem
.SilenceMediaSource
: genera silenzio per una durata specificata, utile per colmare le lacune.AdsMediaSource
: espande un'origine media con funzionalità di inserimento di annunci lato client. Per maggiori dettagli, consulta la guida all'inserimento degli annunci.ServerSideAdInsertionMediaSource
: estende un'origine multimediale con funzionalità di inserimento di annunci lato server. Per ulteriori dettagli, consulta la guida all'inserimento degli annunci.