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

В 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()

Ява

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