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:
DashMediaSourcew przypadku DASH.SsMediaSourcedla SmoothStreaming.HlsMediaSourcew przypadku HLS.ProgressiveMediaSourcew przypadku zwykłych plików multimedialnych.RtspMediaSourcedla RTSP.
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ć elementuMediaItem.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ściamiadjustPeriodTimeOffsetsiclipDurationsustawionymi 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 elementTimeline.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 jakPlayer.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.