Пользователи могут захотеть отредактировать несколько медиаобъектов так, чтобы в финальном видео одновременно появлялось несколько медиаобъектов. Например, можно расположить элементы в макете "картинка в картинке", рядом друг с другом или в виде сетки. Вот несколько примеров таких проектов:
Пример реализации этих макетов можно найти в демонстрационном приложении Composition.
Как реализовать правило VideoCompositorSettings
Интерфейс VideoCompositorSettings содержит два метода:
getOutputSize(List<Size> inputSizes), с помощью которого можно указать размер каждого входного файлаEditedMediaItemSequence.getOverlaySettings(int inputId, long presentationTimeUs), где можно указать, как каждая последовательность должна выглядеть в кадре.
Как настроить показ последовательности с помощью OverlaySettings
Реализация getOverlaySettings() должна возвращать экземпляр интерфейса OverlaySettings для каждой последовательности в проекте. Параметр inputId определяет, к какой последовательности будут применяться настройки.
Чтобы создать экземпляр, можно использовать класс StaticOverlaySettings, включенный в Media3. Полный список вариантов конфигурации, включая визуальные изменения, такие как альфа-прозрачность и яркость HDR, изменения положения, такие как точка привязки и положение в кадре, а также преобразования, такие как поворот и масштабирование, можно найти на справочной странице StaticOverlaySettings.Builder.
override fun getOverlaySettings(inputId: Int, presentationTimeUs: Long): OverlaySettings { return when (inputId) { // Position the first sequence in the top-left 0 -> { StaticOverlaySettings.Builder() // Scale the video down to 1/4th the size of the frame .setScale(0.5f, 0.5f) // Anchor the sequence in the middle of frame .setOverlayFrameAnchor(0f, 0f) // Position the video in the top-left section of the frame .setBackgroundFrameAnchor(-0.5f, 0.5f) .build() } // Add more cases for remaining input sequences else -> StaticOverlaySettings.Builder().build() } }
С помощью параметра presentationTimeUs метода getOverlaySettings() можно изменять эти настройки в зависимости от положения видео, как показано в примере с перемещающимся окном "картинка в картинке" выше на этой странице.
override fun getOverlaySettings(inputId: Int, presentationTimeUs: Long): OverlaySettings { return if (inputId == 0) { // Use the first sequence as the overlay val cycleRadians = 2 * PI * (presentationTimeUs.toDouble() / cycleTimeUs) StaticOverlaySettings.Builder() // Scale the overlay down .setScale(0.35f, 0.35f) // Anchor the overlay in the top-middle of the frame .setOverlayFrameAnchor(0f, 1f) // Move the overlay over time .setBackgroundFrameAnchor(sin(cycleRadians).toFloat() * 0.5f, -0.2f) // Rotate the overlay over time .setRotationDegrees(cos(cycleRadians).toFloat() * -10f) .build() } else { // Present the second sequence in the background as normal StaticOverlaySettings.Builder().build() } }
Отзыв
Если у вас есть отзывы или предложения по использованию композиции видео, создайте тему в репозитории Media3 на GitHub.