Пользователи могут захотеть смонтировать несколько медиафайлов таким образом, чтобы в итоговом видео одновременно отображалось более одного элемента. Это включает в себя размещение элементов в таких форматах, как «картинка в картинке», «рядом» или «сетка». Вот несколько примеров таких проектов:


Вы можете ознакомиться с примером реализации этих макетов в демонстрационном приложении Composition .
Реализуйте VideoCompositorSettings
Интерфейс VideoCompositorSettings содержит 2 метода:
-
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 .