Źródła multimediów

W ExoPlayerze każdy element multimedialny jest reprezentowany przez MediaItem. Wewnętrznie odtwarzacz potrzebuje jednak MediaSource instancji, aby odtworzyć treści. Odtwarzacz tworzy je na podstawie elementów multimedialnych za pomocą MediaSource.Factory.

Domyślnie odtwarzacz używa elementu DefaultMediaSourceFactory, który może tworzyć instancje tych implementacji treści MediaSource:

DefaultMediaSourceFactory może też tworzyć bardziej złożone źródła danych o mediach w zależności od właściwości odpowiednich elementów multimedialnych. Więcej informacji znajdziesz na stronie ze spisem zawartości.

W przypadku aplikacji, które wymagają konfiguracji źródeł multimediów nieobsługiwanych przez domyślną konfigurację odtwarzacza, dostępnych jest kilka opcji dostosowywania.

Dostosowywanie tworzenia źródła multimediów

Podczas tworzenia odtwarzacza można wstrzyknąć MediaSource.Factory. Jeśli na przykład aplikacja chce wstawiać reklamy i używać CacheDataSource.Factory do obsługiCacheDataSource.Factorypamięci podręcznej, można skonfigurować instancję DefaultMediaSourceFactory tak, aby spełniała te wymagania, i wstrzyknąć ją podczas tworzenia odtwarzacza:

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();

Więcej informacji o dostępnych opcjach znajdziesz w DefaultMediaSourceFactoryJavaDoc.

Możesz też wstrzyknąć niestandardową implementację MediaSource.Factory, np. aby obsługiwać tworzenie niestandardowego typu źródła multimediów. FabrykacreateMediaSource(MediaItem) zostanie wywołana w celu utworzenia źródła multimediów dla każdego elementu multimedialnego, który zostanie dodany do playlisty.

Interfejs API playlisty oparty na źródle multimediów

Interfejs ExoPlayer definiuje dodatkowe metody playlisty, które akceptują źródła multimediów zamiast elementów multimedialnych. Umożliwia to pominięcie wewnętrznego MediaSource.Factory odtwarzacza i przekazywanie instancji źródła multimediów bezpośrednio do odtwarzacza:

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();

Zaawansowana kompozycja źródeł multimedialnych

ExoPlayer udostępnia kilka implementacji MediaSource, które umożliwiają modyfikowanie i komponowanie innych instancji MediaSource. Są one najbardziej przydatne w przypadkach, gdy trzeba połączyć kilka dostosowań, a żadna z prostszych ścieżek konfiguracji nie jest wystarczająca.

  • ClippingMediaSource: umożliwia przycięcie multimediów do określonego zakresu sygnatur czasowych. Jeśli jest to jedyna modyfikacja, lepiej użyć elementu MediaItem.ClippingConfiguration.
  • FilteringMediaSource: filtruje dostępne ścieżki według określonych typów, np. udostępnia tylko ścieżkę wideo z pliku, który zawiera zarówno audio, jak i wideo. Jeśli jest to jedyna modyfikacja, lepiej użyć parametrów wyboru ścieżki.
  • MergingMediaSource: łączy wiele źródeł multimediów, aby odtwarzać je równolegle. W prawie wszystkich przypadkach zaleca się wywoływanie konstruktora z wartościami adjustPeriodTimeOffsetsclipDurations ustawionymi na true, aby mieć pewność, że wszystkie źródła zaczynają się i kończą w tym samym czasie. Jeśli ta modyfikacja jest wprowadzana w celu dodania napisów wczytanych z zewnątrz, lepiej użyć MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: łączy wiele źródeł multimediów, aby odtwarzać je kolejno. Widoczna dla użytkownika struktura multimediów udostępnia pojedynczy element Timeline.Window, co oznacza, że wygląda jak pojedynczy element. Jeśli ta modyfikacja jest wprowadzana w celu odtwarzania wielu elementów, które nie powinny wyglądać jak jeden, lepiej użyć metod interfejsu Playlist API, takich jak Player.addMediaItem.
  • SilenceMediaSource: generuje ciszę przez określony czas, co jest przydatne do wypełniania luk.
  • AdsMediaSource: rozszerza źródło multimediów o możliwości wstawiania reklam po stronie klienta. Szczegółowe informacje znajdziesz w przewodniku po wstawianiu reklam.
  • ServerSideAdInsertionMediaSource: Rozszerza źródło multimediów o możliwości wstawiania reklam po stronie serwera. Szczegółowe informacje znajdziesz w przewodniku po wstawianiu reklam.