Określanie kompozycji elementów multimedialnych

Biblioteka Media3 Transformer zawiera pakiet narzędzi do edytowania i manipulowania multimediami. Głównym komponentem do edycji wielu zasobów jest interfejs Composition API. Ten interfejs API umożliwia łączenie wielu wejściowych elementów multimedialnych, takich jak klipy wideo, obrazy i ścieżki audio, w jedną spójną strukturę, którą można następnie przetwarzać, wyświetlać w podglądzie lub eksportować. Composition można traktować jako oś czasu, która zawiera co najmniej jedną sekwencję multimediów. Każda sekwencja (zdefiniowana przez EditedMediaItemSequence) zawiera poszczególne elementy multimedialne (zdefiniowane jako instancje EditedMediaItem). Transformacje i efekty można stosować do poszczególnych elementów EditedMediaItem, lub do całej Composition.

Struktura obiektu Composition
Struktura obiektu Composition

Composition to punkt wejścia dla różnych przypadków użycia w Media3 Transformer, takich jak:

  • sekwencyjne łączenie komponentów audio, obrazów i wideo;
  • nakładanie filmu na inny film (obraz w obrazie);
  • miksowanie ścieżki audio tła z sekwencją wideo;
  • stosowanie efektów wizualnych lub dźwiękowych do całego edytowanego materiału;
  • obsługa złożonych scenariuszy, takich jak przetwarzanie filmów HDR.

W tym przewodniku dowiesz się, jak definiować i tworzyć obiekty Composition, w tym kluczowe klasy, jak tworzyć proste i bardziej złożone kompozycje z jedną lub kilkoma sekwencjami oraz jak stosować efekty na różnych poziomach.

Kluczowe pojęcia i klasy

Aby skutecznie korzystać z interfejsu API Composition, musisz poznać główne klasy używane do tworzenia kompozycji multimedialnej:

Effects:

  • Cel: obiekt Effects to zbiór procesorów audio i efektów wideo.
  • Sposób użycia: w kontekście Composition obiekt Effects można ustawić w poszczególnych instancjach EditedMediaItem, aby modyfikować konkretne klipy, lub w całej Composition (zwykle w przypadku efektów Presentation, które wpływają na ostateczny wynik, np. dostosowanie rozdzielczości wyświetlania lub liczby klatek na sekundę).
  • Dlaczego jest ważny: Effects to mechanizm stosowania transformacji, filtrów i innych procesów do multimediów zarówno na poziomie poszczególnych elementów, jak i na poziomie całej kompozycji. Więcej informacji znajdziesz w sekcji zobacz Transformations.

EditedMediaItem:

  • Cel: Ta klasa reprezentuje pojedynczy element multimedialny (np. plik wideo, obraz lub plik audio) oraz zmiany, które mają zostać w nim zastosowane.
  • Sposób użycia: EditedMediaItem grupuje MediaItem (który wskazuje rzeczywistą treść multimedialną) z obiektem Effects.
  • Dlaczego jest ważny: jest to podstawowy element składowy twojej kompozycji. Umożliwia dokładne określenie, które multimedia mają zostać uwzględnione, oraz jak każdy element ma wyglądać i brzmieć, zanim zostanie połączony z innymi w sekwencji.

EditedMediaItemSequence:

  • Cel: reprezentuje liniową sekwencję obiektów EditedMediaItem, które mają być odtwarzane jeden po drugim.
  • Sposób użycia: Obiekt EditedMediaItemSequence jest tworzony na podstawie listy obiektów EditedMediaItem. Każda sekwencja w Composition jest podobna do ścieżki lub warstwy na osi czasu edycji wideo z wieloma ścieżkami. Na przykład jedna sekwencja może zawierać główne klipy wideo, a inna, nakładająca się w czasie, może zawierać klipy wideo, które mają być nakładane na pierwszą. Kolejna sekwencja może zawierać tylko ścieżkę audio z muzyką w tle.
  • Dlaczego jest ważny: EditedMediaItemSequence grupuje powiązane elementy multimedialne , które powinny następować bezpośrednio po sobie. Używając wielu sekwencji, możesz tworzyć bardziej złożone aranżacje, np. nakładać na siebie dźwięk lub tworzyć nakładki wizualne.

Composition:

  • Cel: jest to obiekt najwyższego poziomu, który reprezentuje całą oś czasu multimediów do przetworzenia. Działa jako kontener dla wszystkich sekwencji multimedialnych oraz wszelkich ustawień globalnych lub efektów, które mają zastosowanie do całego wyniku.
  • Sposób użycia: Composition składa się z co najmniej 1 obiektu EditedMediaItemSequence. Możesz też stosować efekty w całej kompozycji i ustawiać konfiguracje globalne, takie jak tryb HDR, bezpośrednio w Composition. Jeśli Composition zawiera wiele obiektów EditedMediaItemSequence, można je ułożyć tak, aby odtwarzały się sekwencyjnie lub nakładały się w czasie, co umożliwia tworzenie nakładanych układów, takich jak obraz w obrazie, lub przejść z jednej sekwencji do drugiej.
  • Dlaczego jest ważny: A Composition określa ogólną strukturę multimediów wejściowych do przetworzenia i jest wspólnym obiektem, którego możesz używać zarówno do wyświetlania podglądu zmian za pomocą CompositionPlayer, jak i do eksportowania filmu wyjściowego ze zmianami zastosowanymi za pomocą Transformer.

Tworzenie i eksportowanie Composition

Oto przykład tworzenia komponentu wideo, który składa się z 2 edytowanych klipów wideo, na które nałożona jest ścieżka audio, oraz eksportowania go:

Kotlin

val video1 = EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build()

val video2 = EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build()

val videoSequence = EditedMediaItemSequence.withAudioAndVideoFrom(listOf(video1, video2))

val backgroundAudio = EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build()

val backgroundAudioSequence =
  EditedMediaItemSequence.withAudioFrom(listOf(backgroundAudio))
    .buildUpon()
    .setIsLooping(true) // Loop audio track through duration of videoSequence
    .build()

val composition = Composition.Builder(videoSequence, backgroundAudioSequence).build()

transformer.start(composition, filePath)

Java

EditedMediaItem video1 = new EditedMediaItem.Builder(MediaItem.fromUri(video1Uri)).build();

EditedMediaItem video2 = new EditedMediaItem.Builder(MediaItem.fromUri(video2Uri)).build();

EditedMediaItemSequence videoSequence =
    EditedMediaItemSequence.withAudioAndVideoFrom(ImmutableList.of(video1, video2));

EditedMediaItem backgroundAudio =
    new EditedMediaItem.Builder(MediaItem.fromUri(audioUri)).build();

EditedMediaItemSequence backgroundAudioSequence =
    EditedMediaItemSequence.withAudioFrom(ImmutableList.of(backgroundAudio))
        .buildUpon()
        .setIsLooping(true) // Loop audio track through duration of videoSequence
        .build();

Composition composition =
    new Composition.Builder(videoSequence, backgroundAudioSequence).build();

transformer.start(composition, filePath);

Przykłady obsługiwanych przypadków użycia

Oto niepełna lista przypadków użycia, które są obsługiwane przez interfejs Transformer API za pomocą Composition:

  • sekwencyjne łączenie komponentów audio, obrazów i wideo;
  • dodawanie dźwięku w tle do komponentu wideo;
  • dodawanie efektów do kompozycji;
  • mapowanie tonów z wejścia HDR na SDR w celu uzyskania lepszej jakości obrazu w wyjściu SDR.

Aktualne ograniczenia

Sekwencje w kompozycji muszą spełniać warunki określone w Transformer.start(). Ponadto podczas pracy z kompozycjami nie są jeszcze obsługiwane te operacje:

  • przenikanie ścieżek audio lub wideo.

Prośby o dodanie funkcji

Jeśli masz prośby o dodanie funkcji do interfejsów Transformer API, zgłoś problem w repozytorium Media3 na GitHubie.