Źródła multimediów

W programie ExoPlayer każdy element multimedialny jest reprezentowany przez parametr MediaItem. Jednak wewnętrznie odtwarzacz potrzebuje MediaSource wystąpień do odtwarzania treści. Odtwarzacz tworzy je z elementów multimedialnych za pomocą MediaSource.Factory.

Domyślnie odtwarzacz używa interfejsu DefaultMediaSourceFactory, który może tworzyć wystąpienia tych implementacji treści MediaSource:

DefaultMediaSourceFactory może też tworzyć bardziej złożone źródła mediów w zależności od właściwości odpowiednich elementów multimedialnych. Szczegółowo opisujemy to na stronie Elementy multimedialne.

W przypadku aplikacji wymagających konfiguracji źródeł multimediów, które nie są obsługiwane przez domyślną konfigurację odtwarzacza, masz do wyboru kilka opcji dostosowywania.

Dostosowywanie tworzenia źródła multimediów

Podczas tworzenia odtwarzacza można wstawić MediaSource.Factory. Jeśli na przykład aplikacja chce wstawiać reklamy i używać elementu CacheDataSource.Factory do obsługi pamięci podręcznej, można skonfigurować wystąpienie DefaultMediaSourceFactory tak, by spełniało te wymagania, i dodać go podczas konstruowania 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();

Dostępne opcje jest szczegółowo opisane w DefaultMediaSourceFactory JavaDoc.

Możesz też wstrzyknąć niestandardową implementację MediaSource.Factory, np. aby obsługiwać tworzenie niestandardowego typu źródła multimediów. Będzie wywoływana funkcja createMediaSource(MediaItem) fabryki 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 playlist, które akceptują źródła multimediów, a nie elementy multimedialne. Pozwala to ominąć wewnętrzny obiekt MediaSource.Factory odtwarzacza i przekazać wystąpienia źródła multimediów bezpośrednio do niego:

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

Zaawansowane kompozycje źródła multimediów

ExoPlayer udostępnia wiele implementacji MediaSource do modyfikowania i tworzenia innych instancji MediaSource. Są one najbardziej przydatne w sytuacjach, gdy trzeba połączyć wiele dostosowań i żadna z prostszych ścieżek konfiguracji nie jest odpowiednia.

  • ClippingMediaSource: umożliwia przycinanie multimediów do określonego zakresu sygnatury czasowej. Jeśli to jedyna modyfikacja, zamiast niej zalecamy użycie właściwości MediaItem.ClippingConfiguration.
  • FilteringMediaSource: filtruje dostępne ścieżki według określonych typów, np. ujawniając ścieżkę wideo z pliku zawierającego zarówno dźwięk, jak i obraz. Jeśli to jedyna modyfikacja, zalecamy użycie parametrów wyboru ścieżki.
  • MergingMediaSource: scala wiele źródeł multimediów, by odtwarzać treści równolegle. W prawie wszystkich przypadkach zalecane jest wywoływanie konstruktora z parametrami adjustPeriodTimeOffsets i clipDurations ustawionymi na wartość true (prawda), aby wszystkie źródła zaczynały się i kończyły w tym samym czasie. Jeśli w ten sposób dodasz napisy ładowane z poziomu strony, lepiej użyć metody MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: scala wiele źródeł multimediów, aby odtwarzać je w sekwencji. Widoczna dla użytkownika struktura multimediów ujawnia pojedynczy element Timeline.Window, co oznacza, że wygląda jak pojedynczy element. Jeśli ta zmiana ma na celu odtwarzanie wielu elementów, które nie powinny wyglądać jak 1 element, lepiej będzie korzystać z metod playlist API, takich jak Player.addMediaItem.
  • SilenceMediaSource: generuje czas ciszy przez określony czas, który jest przydatna 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 wstawiania reklam.
  • ServerSideAdInsertionMediaSource: rozszerza źródło multimediów o możliwości wstawiania reklam po stronie serwera. Szczegółowe informacje znajdziesz w przewodniku wstawiania reklam.