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

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

Видео с режимом «картинка в картинке»
Медиафайлы расположены в режиме "картинка в картинке".
Видео с сеткой
Медиафайлы расположены в виде сетки 2x2.

Вы можете ознакомиться с примером реализации этих макетов в демонстрационном приложении Composition .

Реализуйте VideoCompositorSettings

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

Настройте отображение последовательности с помощью параметра 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 .