Предпросмотр изменений с помощью CompositionPlayer

Библиотека Jetpack Media3 предоставляет API CompositionPlayer, мощную реализацию Player для предварительного просмотра видео в реальном времени. Если ваше приложение позволяет пользователям редактировать видео, например применять эффекты, обрезать или объединять несколько медиаобъектов, CompositionPlayer поможет вам показывать точный предпросмотр результата. Это может быть полезно, если вам не нужно сохранять примененные изменения или если вы хотите убедиться, что они настроены правильно, прежде чем экспортировать видео.

Что такое CompositionPlayer?

CompositionPlayer – это специализированная реализация интерфейса проигрывателя, предназначенная для воспроизведения объектов Composition. Composition определяет, как располагаются входные медиаобъекты, например видеоклипы и аудиодорожки, и какие аудио- и видеоэффекты к ним применяются. Подробнее Composition определении Composition медиаконтента…

Основная цель CompositionPlayer – в реальном времени отобразить Composition со всеми внесенными изменениями, чтобы пользователи могли увидеть, как будет выглядеть отредактированное изображение, прежде чем приступать к экспорту, который может занять много времени и ресурсов. Затем тот же объект Composition можно использовать с экземпляром Transformer для экспорта. Подробнее об этом рассказывается в разделе Экспорт объекта Composition.

CompositionPlayer против ExoPlayer

CompositionPlayer и ExoPlayer – это реализации Player в Media3, но они оптимизированы для разных вариантов использования:

Функция

CompositionPlayer

ExoPlayer

Входной носитель

Принимает один объект Composition, который может состоять из нескольких объектов EditedMediaItem с эффектами для каждого объекта.

Принимает один объект MediaItem или плейлист объектов MediaItem.

Хронология

Хронология и продолжительность основаны на всей композиции.

Временная шкала и продолжительность соответствуют текущему объекту MediaItem.

Эффекты

Эффекты определяются в композиции и могут применяться к отдельному объекту EditedMediaItem или ко всей композиции.

Эффекты задаются для экземпляра ExoPlayer с помощью метода setVideoEffects(). Каждый эффект применяется к каждому элементу плейлиста по отдельности.

По сути, CompositionPlayer наиболее полезен, когда вам нужно обработать сложный Composition медиаконтента и эффектов, как правило, в контексте редактирования. Используйте ExoPlayer для воспроизведения аудио- или видеоконтента общего назначения или для предварительного просмотра изменений в одном объекте с помощью setVideoEffects().

CompositionPlayer для предварительного просмотра

Чтобы добавить CompositionPlayer в приложение, выполните несколько основных действий. Сначала создайте экземпляр CompositionPlayer, используя шаблон Builder, а затем задайте Composition для воспроизведения:

val compositionPlayer = CompositionPlayer.Builder(context).build()
compositionPlayer.setComposition(composition)
compositionPlayer.prepare()
compositionPlayer.play()

Инструкции по созданию Composition приведены в разделе Как создать Composition.

Обратите внимание, что, поскольку CompositionPlayer реализует интерфейс Player, вы можете настроить целевой выход и управлять проигрывателем с помощью стандартных методов Player.

Обработка ошибок

Прикрепите экземпляр Player.Listener к CompositionPlayer, чтобы реагировать на события и ошибки воспроизведения. Функция обратного вызова onPlayerError() также позволяет выявлять проблемы, связанные с компонентами редактирования, такими как Composition или VideoGraph.Factory. Подробнее о событиях проигрывателя…

Важные примечания

При использовании CompositionPlayer учитывайте следующие особенности и ограничения:

  • Хотя CompositionPlayer основан на интерфейсе Player, некоторые его функции отличаются от ExoPlayer, поскольку для воспроизведения он использует Composition. Например, CompositionPlayer поддерживает только режимы повтора REPEAT_MODE_OFF и REPEAT_MODE_ALL.
  • По умолчанию в CompositionPlayer используется SingleInputVideoGraph.Factory, но если в композиции несколько последовательностей с изображениями или видео, при создании экземпляра CompositionPlayer следует использовать setVideoGraphFactory(), чтобы вместо использовался MultipleInputVideoGraph.Factory. Если только в одной последовательности есть изображения или видео, а в остальных – только аудио, достаточно использовать SingleInputVideoGraph.Factory.
  • У всех медиаобъектов в композиции должна быть явно задана продолжительность. Для изображений это делается с помощью тега MediaItem.Builder.setImageDurationMs(), а для аудио- и видеофайлов – с помощью тега EditedMediaItem.Builder.setDurationUs().

Поддерживаются следующие варианты использования:

  • Предварительный просмотр одного объекта.
  • Предварительный просмотр одной последовательности (то есть последовательных медиаобъектов).
  • Предварительный просмотр одной видеопоследовательности и одной аудиопоследовательности (например, фоновой музыки).

В настоящее время активно разрабатываются следующие варианты использования:

  • Предпросмотр нескольких объектов, в том числе макетов "картинка в картинке", "рядом" и "сетка", где используются несколько видеопоследовательностей.
  • Настройка конвейера редактирования с помощью другого графического движка.

Запросы на добавление функций

Если у вас есть предложения или отзывы о CompositionPlayer, создайте запрос на репозитории Media3 на GitHub.