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:
Implementację tych układów możesz sprawdzić w aplikacji w wersji demonstracyjnej Composition.
Implementowanie VideoCompositorSettings
Interfejs VideoCompositorSettings zawiera 2 metody:
getOutputSize(List<Size> inputSizes), której możesz użyć do określenia rozmiaru każdej sekwencjiEditedMediaItemSequencegetOverlaySettings(int inputId, long presentationTimeUs), w której możesz określić, jak każda sekwencja ma się wyświetlać w klatce
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.