Библиотека Media3 Transformer предоставляет набор инструментов для редактирования и обработки медиафайлов. Ключевым компонентом для редактирования нескольких ресурсов является API Composition . Этот API позволяет упорядочивать несколько входных медиафайлов, таких как видеоклипы, изображения и аудиодорожки, в единую, согласованную структуру, которую затем можно обрабатывать, просматривать или экспортировать. Composition можно рассматривать как временную шкалу, содержащую одну или несколько последовательностей медиафайлов. Каждая последовательность (определяемая объектом EditedMediaItemSequence ) содержит отдельные медиафайлы (определяемые как экземпляры EditedMediaItem ). Преобразования и эффекты могут применяться к отдельному EditedMediaItem или ко всей Composition целиком.

Composition — это ваша отправная точка для различных вариантов использования Media3 Transformer, таких как:
- Последовательное объединение аудио-, графических и видеоматериалов.
- Наложение одного видео поверх другого (картинка в картинке).
- Сведение фоновой звуковой дорожки с видеорядом.
- Применение визуальных или звуковых эффектов ко всему смонтированному материалу.
- Обработка сложных сценариев, таких как обработка HDR-видео.
В этом руководстве рассматривается, как определять и создавать объекты Composition , включая ключевые задействованные классы, как создавать базовые и более сложные композиции с одной или несколькими последовательностями, а также как применять эффекты на разных уровнях.
Основные понятия и классы
Для эффективного использования Composition API важно понимать основные классы, участвующие в создании медиакомпозиции:
Effects :
- Назначение: Объект
Effectsпредставляет собой набор аудиопроцессоров и видеоэффектов . - Как это используется: В контексте
CompositionEffectsможно применять к отдельным экземплярамEditedMediaItemдля изменения конкретных клипов или ко всейCompositionв целом (обычно для эффектовPresentation, влияющих на конечный результат, таких как регулировка разрешения экрана или частоты кадров). - Почему это важно:
Effects— это механизм для применения преобразований, фильтров и других методов обработки к вашим медиафайлам как на уровне отдельных элементов, так и на уровне всей композиции. Для получения дополнительной информации см.Transformations.
EditedMediaItem :
- Назначение: Этот класс представляет собой отдельный медиафайл (например, видео, изображение или аудиофайл) и параметры редактирования, которые необходимо к нему применить.
- Как это используется: Объект
EditedMediaItemобъединяетMediaItem(который указывает на фактическое содержимое медиафайла) с объектомEffects. - Почему это важно: Это фундаментальный строительный блок вашей композиции. Он позволяет точно определить, какие медиаматериалы следует включить и как каждый отдельный элемент должен выглядеть и звучать, прежде чем он будет объединен с другими в последовательности.
EditedMediaItemSequence :
- Назначение: Представляет собой линейную последовательность объектов
EditedMediaItem, предназначенных для воспроизведения один за другим. - Как это используется: Объект
EditedMediaItemSequenceсоздается из списка объектовEditedMediaItem. Каждая последовательность вCompositionаналогична дорожке или слою на временной шкале многодорожечного видеомонтажа. Например, одна последовательность может содержать основные видеоклипы, другая, перекрывающаяся во времени, может содержать видеоклипы, которые накладываются на первую, а третья последовательность может содержать только аудиодорожку для фоновой музыки. - Почему это важно:
EditedMediaItemSequenceгруппирует связанные медиафайлы, которые должны следовать друг за другом напрямую. Используя несколько последовательностей, вы можете создавать более сложные композиции, например, накладывать звук или создавать визуальные наложения.
Composition :
- Назначение: Это объект верхнего уровня, представляющий всю временную шкалу обрабатываемых медиафайлов. Он служит контейнером для всех последовательностей медиафайлов, а также любых глобальных настроек или эффектов, применяемых ко всему выходному результату.
- Как это используется:
Compositionсостоит из одного или нескольких объектовEditedMediaItemSequence. Вы также можете применять эффекты ко всей композиции и устанавливать глобальные параметры, такие как режим HDR, непосредственно вComposition. ЕслиCompositionсодержит несколько объектовEditedMediaItemSequence, эти последовательности могут воспроизводиться последовательно или перекрываться во времени, что позволяет создавать наложенные друг на друга макеты, такие как «картинка в картинке», или переходы от одной последовательности к другой. - Почему это важно:
Compositionопределяет общую структуру обрабатываемого входного медиафайла и является распространенным объектом, который можно использовать как для предварительного просмотра изменений с помощьюCompositionPlayer, так и для экспорта выходного видео с внесенными изменениями с помощьюTransformer.
Создать и экспортировать Composition
Вот пример создания видеофайла, состоящего из двух отредактированных видеоклипов, на которые наложена звуковая дорожка, и его экспорта:
Котлин
val video1 = EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build() val video2 = EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build() val videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(listOf(video1, video2)) val backgroundAudio = EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build() val backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(listOf(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build() val composition = Composition.Builder(videoSequence, backgroundAudioSequence).build() transformer.start(composition, filePath)
Java
EditedMediaItem video1 = new EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build(); EditedMediaItem video2 = new EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build(); EditedMediaItemSequence videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(ImmutableList.of(video1, video2)); EditedMediaItem backgroundAudio = new EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build(); EditedMediaItemSequence backgroundAudioSequence = EditedMediaItemSequence.withAudioFrom(ImmutableList.of(backgroundAudio)) .buildUpon() .setIsLooping(true) // Loop audio track through duration of videoSequence .build(); Composition composition = new Composition.Builder(videoSequence, backgroundAudioSequence).build(); transformer.start(composition, filePath);
Примеры поддерживаемых вариантов использования
Это неполный список вариантов использования, которые API Transformer поддерживает с помощью Composition :
- Последовательное объединение аудио-, графических и видеоматериалов.
- Добавление фонового звука к видеофайлу.
- Добавление эффектов к композиции.
- Преобразование входного сигнала HDR в SDR с помощью тонального отображения для получения выходного сигнала SDR с лучшим визуальным качеством.
Текущие ограничения
Последовательности внутри композиции должны соответствовать условиям, изложенным в Transformer.start() . Кроме того, следующие операции пока не поддерживаются при работе с композициями:
- Плавный переход между видео- и аудиодорожками
Запросы на добавление функций
Если у вас есть какие-либо пожелания по улучшению API Transformer, создайте заявку в репозитории Media3 на GitHub .