Definiowanie układów za pomocą niestandardowego obiektu VideoCompositorSettings

Użytkownicy mogą chcieć edytować kilka zasobów multimedialnych jednocześnie, tak aby w gotowym filmie wyświetlało się więcej niż 1 element multimedialny. Obejmuje to rozmieszczanie elementów w układach takich jak obraz w obrazie, obok siebie lub w siatce. Oto kilka przykładów takich projektów:

Film z układem obraz w obrazie
Elementy multimedialne ułożone w układzie obraz w obrazie.
Film w układzie siatki
Elementy multimedialne ułożone w siatce 2x2.

Implementację tych układów możesz sprawdzić w aplikacji w wersji demonstracyjnej Composition.

Implementowanie VideoCompositorSettings

Interfejs VideoCompositorSettings zawiera 2 metody:

Konfigurowanie prezentacji sekwencji za pomocą OverlaySettings

Implementacja getOverlaySettings() powinna zwracać instancję interfejsu OverlaySettings dla każdej sekwencji w projekcie. Parametr inputId określa, do której sekwencji zostaną zastosowane ustawienia. Aby utworzyć instancję, możesz użyć klasy StaticOverlaySettings zawartej w Media3. Pełną listę opcji konfiguracyjnych, w tym modyfikacje wizualne, takie jak przezroczystość alfa i luminancja HDR, modyfikacje położenia, takie jak punkt zakotwiczenia i położenie w klatce, oraz transformacje, takie jak obrót i skala, znajdziesz na stronie referencyjnej 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()
  }
}

Za pomocą parametru presentationTimeUs metody getOverlaySettings() możesz modyfikować te ustawienia na podstawie pozycji filmu, jak pokazano w przykładzie ruchomego obrazu w obrazie na tej stronie.

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()
  }
}

Prześlij opinię

Jeśli masz jakieś opinie lub propozycje nowych funkcji dotyczące przypadków użycia kompozycji wideo, zgłoś problem w repozytorium Media3 na GitHub.