Медиа-источники

В ExoPlayer каждый медиафайл представлен объектом MediaItem . Однако внутри плеера для воспроизведения контента требуются экземпляры MediaSource . Плеер создает их из медиафайлов с помощью MediaSource.Factory .

По умолчанию плеер использует DefaultMediaSourceFactory , который может создавать экземпляры следующих реализаций MediaSource для контента:

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 : Расширяет возможности источника медиаконтента, добавляя поддержку вставки рекламы на стороне сервера. Подробности см. в руководстве по вставке рекламы .