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