Как задавать макеты с помощью пользовательских настроек VideoCompositorSettings

Пользователи могут захотеть отредактировать несколько медиаобъектов так, чтобы в финальном видео одновременно появлялось несколько медиаобъектов. Например, можно расположить элементы в макете "картинка в картинке", рядом друг с другом или в виде сетки. Вот несколько примеров таких проектов:

Видео с макетом "картинка в картинке"
Мультимедийные объекты, расположенные в режиме "картинка в картинке".
Видео с сеткой
Медиаконтент, расположенный в сетке 2 x 2.

Пример реализации этих макетов можно найти в демонстрационном приложении Composition.

Как реализовать правило VideoCompositorSettings

Интерфейс VideoCompositorSettings содержит два метода:

Как настроить показ последовательности с помощью 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.