Wyświetlanie podglądu zmian za pomocą narzędzia CompositionPlayer

Biblioteka Jetpack Media3 udostępnia interfejs API CompositionPlayer, czyli zaawansowaną implementację Player, która umożliwia wyświetlanie podglądu zmian w filmie w czasie rzeczywistym. Jeśli Twoja aplikacja umożliwia użytkownikom edytowanie filmów, np. stosowanie efektów, przycinanie lub łączenie wielu wejściowych elementów multimedialnych, CompositionPlayer pomoże Ci wyświetlić dokładny podgląd danych wyjściowych. Może to być przydatne w przypadkach, gdy nie musisz zapisywać zastosowanych zmian lub gdy chcesz sprawdzić, czy zmiany są skonfigurowane zgodnie z oczekiwaniami, zanim zatwierdzisz je w ostatecznej wersji filmu do wyeksportowania.

Co to jest CompositionPlayer?

CompositionPlayer to specjalistyczna implementacja interfejsu Player, która jest przeznaczona do odtwarzania obiektów Composition. Composition określa, jak mają być ułożone wejściowe zasoby multimedialne, takie jak klipy wideo i ścieżki audio, oraz jakie efekty audio i wideo mają być do nich stosowane. Więcej informacji o interfejsie API Composition znajdziesz w artykule Definiowanie Composition elementów multimedialnych.

Głównym celem CompositionPlayer jest renderowanie tej Composition, w czasie rzeczywistym, wraz ze wszystkimi określonymi zmianami, dzięki czemu użytkownicy mogą dokładnie zobaczyć, jak będą wyglądać ich zmiany, zanim zdecydują się na potencjalnie czasochłonny i wymagający dużych zasobów proces eksportu. Ten sam obiekt Composition można następnie użyć z instancją Transformer do eksportu. Więcej informacji znajdziesz w artykule Eksportowanie Composition.

CompositionPlayer a ExoPlayer

Zarówno CompositionPlayer jak i ExoPlayer to implementacje Player w Media3, ale są one zoptymalizowane pod kątem różnych przypadków użycia:

Funkcja

CompositionPlayer

ExoPlayer

Multimedia wejściowe

Przyjmuje pojedynczy obiekt Composition, który może składać się z wielu EditedMediaItem instancji z efektami dla poszczególnych elementów.

Przyjmuje pojedynczy element MediaItem lub playlistę instancji MediaItem.

Oś czasu

Oś czasu i czas trwania są oparte na całej kompozycji.

Oś czasu i czas trwania odpowiadają aktualnie odtwarzanemu elementowi MediaItem.

Efekty

Efekty są zdefiniowane w kompozycji i można je zastosować do pojedynczego elementu EditedMediaItem lub do całej kompozycji.

Efekty są ustawiane w samej instancji ExoPlayer za pomocą setVideoEffects(), a każdy efekt jest stosowany indywidualnie do każdego elementu na playliście.

Zasadniczo CompositionPlayer jest najbardziej przydatny, gdy trzeba renderować a złożony Composition multimediów i efektów, zwykle w kontekście edycji. Używaj ExoPlayer do ogólnego odtwarzania treści audio lub wideo albo do wyświetlania podglądu zmian w pojedynczym zasobie za pomocą setVideoEffects().

CompositionPlayer do podglądu

Integracja CompositionPlayer z aplikacją obejmuje kilka kluczowych kroków. Najpierw, użyj wzorca Builder, aby utworzyć instancję CompositionPlayer, a następnie ustaw Composition do odtworzenia:

val compositionPlayer = CompositionPlayer.Builder(context).build()
compositionPlayer.setComposition(composition)
compositionPlayer.prepare()
compositionPlayer.play()

Wskazówki dotyczące tworzenia Composition znajdziesz w sekcji Tworzenie Composition.

Pamiętaj, że ponieważ CompositionPlayer implementuje interfejs Player, możesz następnie ustawić docelowe dane wyjściowe i sterować odtwarzaczem za pomocą standardowych metod Player.

Obsługa błędów

Dołącz instancję Player.Listener do CompositionPlayer, aby reagować na zdarzenia i błędy odtwarzania. Wywołanie zwrotne onPlayerError() będzie też zgłaszać problemy pochodzące z komponentów specyficznych dla edycji, takich jak Composition czy VideoGraph.Factory. Więcej informacji znajdziesz w dokumentacji Zdarzenia odtwarzacza.

Istotne kwestie

Niektóre funkcje i ograniczenia, o których należy pamiętać podczas korzystania z CompositionPlayer:

  • Chociaż CompositionPlayer jest oparty na interfejsie Player, niektóre jego zachowania różnią się od ExoPlayer, ponieważ do odtwarzania używa Composition. Na przykład CompositionPlayer obsługuje tylko ustawienie trybu powtarzania na REPEAT_MODE_OFF lub REPEAT_MODE_ALL.
  • Domyślnie CompositionPlayer używa SingleInputVideoGraph.Factory, ale jeśli Twoja kompozycja zawiera więcej niż 1 sekwencję z elementami obrazu lub filmu, podczas tworzenia instancji CompositionPlayer użyj setVideoGraphFactory(), aby zamiast tego użyć MultipleInputVideoGraph.Factory. SingleInputVideoGraph.Factory wystarczy, jeśli tylko 1 sekwencja zawiera elementy obrazu lub filmu, a pozostałe są tylko audio.
  • Wszystkie elementy multimedialne w kompozycji powinny mieć wyraźnie ustawiony czas trwania, za pomocą MediaItem.Builder.setImageDurationMs() w przypadku obrazów lub EditedMediaItem.Builder.setDurationUs() w przypadku dźwięku lub filmów.

Obsługiwane są te przypadki użycia:

  • Podgląd pojedynczego zasobu.
  • Podgląd pojedynczej sekwencji (czyli sekwencyjnych elementów multimedialnych).
  • Podgląd pojedynczej sekwencji wideo + pojedynczej sekwencji audio (np. dźwięku w tle).

Te przypadki użycia są w trakcie aktywnego rozwoju:

  • Podgląd wielu zasobów, w tym układów takich jak obraz w obrazie, obok siebie i siatka, w których występuje wiele sekwencji wideo.
  • Dostosowywanie potoku edycji za pomocą innego silnika graficznego.

Prośby o dodanie funkcji

Jeśli masz jakieś prośby o dodanie funkcji lub opinie dotyczące CompositionPlayer, zgłoś problem w repozytorium Media3 na GitHubie.