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