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
:
DashMediaSource
na potrzeby DASH.SsMediaSource
– SmoothStream.HlsMediaSource
dla HLS.ProgressiveMediaSource
dla zwykłych plików multimedialnych.RtspMediaSource
dla RTSP.
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ściMediaItem.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 parametramiadjustPeriodTimeOffsets
iclipDurations
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ć metodyMediaItem.SubtitleConfiguration
.ConcatenatingMediaSource2
: scala wiele źródeł multimediów, aby odtwarzać je w sekwencji. Widoczna dla użytkownika struktura multimediów ujawnia pojedynczy elementTimeline.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 jakPlayer.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.