В ExoPlayer каждый медиаконтент представлен объектом MediaItem. Однако для воспроизведения контента проигрывателю требуется MediaSource экземпляров. Плеер создает их из медиаконтента с помощью MediaSource.Factory.
По умолчанию в проигрывателе используется DefaultMediaSourceFactory, который может создавать экземпляры следующих реализаций контента MediaSource:
DashMediaSourceдля DASH.SsMediaSourceдля SmoothStreaming.HlsMediaSourceдля HLS.ProgressiveMediaSourceдля обычных медиафайлов.RtspMediaSourceдля RTSP.
DefaultMediaSourceFactory также может создавать более сложные источники медиаконтента в зависимости от свойств соответствующих медиаобъектов. Подробнее об этом рассказывается на странице "Медиаобъекты".
Если приложению требуется настроить источник медиаконтента, который не поддерживается конфигурацией проигрывателя по умолчанию, можно воспользоваться несколькими вариантами настройки.
Как настроить создание источников медиаконтента
При создании проигрывателя можно внедрить MediaSource.Factory. Например, если приложению нужно вставлять объявления и использовать CacheDataSource.Factory для поддержки кеширования, экземпляр DefaultMediaSourceFactory можно настроить в соответствии с этими требованиями и внедрить во время создания проигрывателя:
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();
Дополнительную информацию о доступных вариантах можно найти в DefaultMediaSourceFactory JavaDoc.
Также можно внедрить собственную реализацию MediaSource.Factory, например для поддержки создания специального типа источника медиаконтента. Для каждого медиаконтента, добавленного в плейлист, будет вызван метод createMediaSource(MediaItem) фабрики, чтобы создать источник медиаконтента.
API плейлистов на основе источников медиаконтента
Интерфейс ExoPlayer определяет дополнительные методы плейлистов, которые принимают источники медиаконтента, а не медиаобъекты. Это позволяет обойти внутренний MediaSource.Factory проигрывателя и передавать экземпляры источника медиаконтента непосредственно проигрывателю:
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();
Расширенные настройки источников медиаконтента
ExoPlayer предоставляет несколько реализаций MediaSource для изменения и создания других экземпляров MediaSource. Они наиболее полезны, когда нужно объединить несколько настроек и ни один из более простых способов не подходит.
ClippingMediaSource: позволяет вырезать фрагмент медиаконтента в заданном диапазоне времени. Если это единственное изменение, лучше использоватьMediaItem.ClippingConfiguration.FilteringMediaSource: фильтрует доступные дорожки по указанным типам, например показывает только видеодорожку из файла, в котором есть и аудио, и видео. Если это единственное изменение, лучше использовать параметры выбора дорожек.MergingMediaSource– объединяет несколько источников медиаконтента для параллельного воспроизведения. В большинстве случаев рекомендуется вызывать конструктор со значениями true для параметровadjustPeriodTimeOffsetsиclipDurations, чтобы все источники начинали и заканчивали воспроизведение одновременно. Если вы хотите добавить субтитры, загруженные из внешнего источника, лучше использоватьMediaItem.SubtitleConfiguration.ConcatenatingMediaSource2: объединяет несколько источников медиаконтента для последовательного воспроизведения. В структуре медиаконтента, видимой пользователю, представлен один объектTimeline.Window, то есть контент выглядит как один элемент. Если вы хотите воспроизвести несколько объектов, которые не должны выглядеть как один, лучше использовать методы API списков воспроизведения, напримерPlayer.addMediaItem.SilenceMediaSource– генерирует тишину заданной продолжительности, которая может быть полезна для заполнения пробелов.AdsMediaSource: расширяет источник медиаконтента, добавляя возможность вставки объявлений на стороне клиента. Подробную информацию можно найти в руководстве по вставке рекламы.ServerSideAdInsertionMediaSource: расширяет источник медиаконтента, добавляя возможность вставки объявлений на стороне сервера. Подробную информацию можно найти в руководстве по вставке рекламы.