Origini di contenuti multimediali

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:

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 utilizzare MediaItem.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 con adjustPeriodTimeOffsets e clipDurations 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 utilizzare MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: unisce più origini multimediali da riprodurre consecutivamente. 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 eseguita per riprodurre più elementi che non devono apparire come uno solo, è preferibile utilizzare i metodi dell'API playlist come Player.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.