В 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();
Дополнительную информацию о доступных вариантах можно найти в документации по JavaDoc для DefaultMediaSourceFactory.
Вы также можете внедрить собственную реализацию 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– объединяет несколько источников медиаконтента для параллельного воспроизведения. Почти во всех случаях рекомендуется вызывать конструктор с параметрамиadjustPeriodTimeOffsetsиclipDurations, заданными как true, чтобы все источники начинались и заканчивались одновременно. Если вы хотите добавить субтитры, лучше использовать параметрMediaItem.SubtitleConfiguration.ConcatenatingMediaSource2: объединяет несколько источников медиаконтента для последовательного воспроизведения. Пользователь видит только один элементTimeline.Window. Если вы хотите воспроизвести несколько элементов, которые не должны выглядеть как один, лучше использовать методы API плейлистов, напримерPlayer.addMediaItem.SilenceMediaSource– генерирует тишину заданной длительности, что позволяет заполнить пробелы.AdsMediaSource– расширяет источник медиаконтента возможностями вставки объявлений на стороне клиента. Подробную информацию вы найдете в руководстве по вставке объявлений.ServerSideAdInsertionMediaSource: расширяет источник медиаконтента, добавляя возможности вставки объявлений на стороне сервера. Подробную информацию вы найдете в руководстве по вставке объявлений.