В 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()
Ява
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()
Ява
// 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
: расширяет источник мультимедиа возможностями вставки рекламы на стороне сервера. Подробную информацию можно найти в руководстве по вставке объявлений .