Origini di contenuti multimediali

In ExoPlayer, ogni elemento multimediale è rappresentato da un MediaItem. Tuttavia, internamente il player ha bisogno di MediaSource istanze per riprodurre i contenuti. Il player li crea dagli elementi multimediali utilizzando un MediaSource.Factory.

Per impostazione predefinita, il player utilizza un DefaultMediaSourceFactory, che può creare istanze delle seguenti implementazioni di MediaSource:

DefaultMediaSourceFactory può anche creare origini media più complesse a seconda delle proprietà degli elementi multimediali corrispondenti. Questo aspetto è descritto in modo più dettagliato nella pagina Elementi multimediali.

Per le app che richiedono configurazioni di origini media non supportate dalla configurazione predefinita del player, sono disponibili diverse opzioni di personalizzazione.

Personalizzazione della creazione di origini media

Durante la creazione del player, è possibile inserire un MediaSource.Factory. Ad esempio, se un'app vuole inserire annunci e utilizzare un CacheDataSource.Factory per supportare la memorizzazione nella cache, un'istanza di DefaultMediaSourceFactory può essere configurata in modo che corrisponda a questi requisiti e inserita durante la creazione 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 JavaDoc 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 media personalizzato. Il metodo createMediaSource(MediaItem) della factory verrà chiamato per creare un'origine media per ogni elemento multimediale aggiunto alla playlist.

API playlist basata sull'origine dei contenuti multimediali

L'interfaccia ExoPlayer definisce metodi di playlist aggiuntivi che accettano origini multimediali anziché elementi multimediali. In questo modo è possibile bypassare l'MediaSource.Factory interno del lettore e passare le istanze dell'origine media direttamente al lettore:

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. Questi sono più utili nei casi in cui devono essere combinate più personalizzazioni e nessuno dei percorsi di configurazione più semplici è sufficiente.

  • ClippingMediaSource: consente di tagliare i contenuti multimediali in un intervallo di timestamp specificato. Se questa è l'unica modifica, è preferibile utilizzare MediaItem.ClippingConfiguration.
  • FilteringMediaSource: filtra le tracce disponibili in base ai tipi specificati, ad esempio mostra solo la traccia video di un file che contiene sia audio che video. Se questa è l'unica modifica, è preferibile utilizzare i parametri di selezione delle tracce.
  • MergingMediaSource: unisce più sorgenti multimediali per la riproduzione in parallelo. In quasi tutti i casi, è consigliabile chiamare il costruttore con adjustPeriodTimeOffsets e clipDurations impostati su true per garantire che tutte le origini inizino e terminino contemporaneamente. Se questa modifica viene apportata per aggiungere sottotitoli caricati lateralmente, è preferibile utilizzare MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: unisce più fonti multimediali per la riproduzione consecutiva. La struttura dei contenuti multimediali visibile all'utente espone un singolo Timeline.Window, il che significa che sembra un singolo elemento. Se questa modifica viene apportata per riprodurre più elementi che non devono sembrare un unico elemento, è preferibile utilizzare i metodi dell'API playlist come Player.addMediaItem.
  • SilenceMediaSource: genera silenzio per una durata specificata, utile per colmare le lacune.
  • AdsMediaSource: estende un'origine media con funzionalità di inserimento di annunci lato client. Per ulteriori dettagli, consulta la guida all'inserimento di annunci.
  • ServerSideAdInsertionMediaSource: Estende una sorgente media con funzionalità di inserimento di annunci lato server. Per ulteriori dettagli, consulta la guida all'inserimento di annunci.