Źródła multimediów

W ExoPlayer każdy element multimediów jest reprezentowany przez MediaItem. Jednak wewnętrznie odtwarzacz potrzebuje MediaSource instancji, aby odtworzyć treści. Odtwarzacz tworzy je z elementów multimedialnych za pomocą MediaSource.Factory.

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

DefaultMediaSourceFactory może też tworzyć bardziej złożone źródła multimediów w zależności od właściwości odpowiednich elementów multimediów. Więcej informacji znajdziesz na stronie z elementami multimedialnymi.

W przypadku aplikacji, które wymagają konfiguracji źródła multimediów, która nie jest obsługiwana przez domyślną konfigurację odtwarzacza, istnieje 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ługi pamięci podręcznej, instancję DefaultMediaSourceFactory można skonfigurować zgodnie z tymi wymaganiami i wstrzyknąć 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, aby na przykład umożliwić tworzenie niestandardowego typu źródła multimediów. Fabryka do polecenia createMediaSource(MediaItem) będzie wywoływana w celu utworzenia źródła multimediów dla każdego elementu multimedialnego, który został 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 zamiast elementów multimedialnych. Umożliwia to ominięcie wewnętrznego obiektu MediaSource.Factory odtwarzacza i przekazanie 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ł multimediów

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

  • 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, na przykład tylko ścieżka wideo z pliku zawierającego zarówno dźwięk, jak i obraz. Jeśli jest to jedyna modyfikacja, lepiej użyć parametrów wyboru ścieżki.
  • MergingMediaSource: scala wiele źródeł multimediów, aby odtwarzać je równolegle. W prawie wszystkich przypadkach najlepiej jest wywoływać konstruktor z wartościami adjustPeriodTimeOffsets i clipDurations 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 załadowanych z poziomu przeglądarki, lepiej użyć elementu MediaItem.SubtitleConfiguration.
  • ConcatenatingMediaSource2: scala wiele źródeł multimediów, aby odtwarzać je kolejno. Struktura multimediów widoczna dla użytkownika zawiera 1 Timeline.Window, co oznacza, że wygląda jak pojedynczy element. Jeśli ta zmiana ma na celu odtworzenie wielu elementów, które nie powinny wyglądać jak jeden, lepiej jest użyć metod interfejsu API playlist, takich jak Player.addMediaItem.
  • SilenceMediaSource: generuje ciszę na 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 dotyczącym wstawiania reklam.
  • ServerSideAdInsertionMediaSource: rozszerza źródło multimediów o możliwości wstawiania reklam po stronie serwera. Szczegółowe informacje znajdziesz w przewodniku dotyczącym wstawiania reklam.