Библиотека 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.