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
:
DashMediaSource
dla DASH.SsMediaSource
dla SmoothStreaming.HlsMediaSource
dla HLS.ProgressiveMediaSource
w przypadku zwykłych plików multimedialnych.RtspMediaSource
dla RTSP.
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 DefaultMediaSourceFactory
JavaDoc.
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ć elementuMediaItem.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ściamiadjustPeriodTimeOffsets
iclipDurations
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ć elementuMediaItem.SubtitleConfiguration
.ConcatenatingMediaSource2
: scala wiele źródeł multimediów, aby odtwarzać je kolejno. Struktura multimediów widoczna dla użytkownika zawiera 1Timeline.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 jakPlayer.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.