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ż
CompositionPlayerjest oparty na interfejsiePlayer, niektóre jego zachowania różnią się odExoPlayer, ponieważ do odtwarzania używaComposition. Na przykładCompositionPlayerobsługuje tylko ustawienie trybu powtarzania naREPEAT_MODE_OFFlubREPEAT_MODE_ALL. - Domyślnie
CompositionPlayerużywaSingleInputVideoGraph.Factory, ale jeśli Twoja kompozycja zawiera więcej niż 1 sekwencję z elementami obrazu lub filmu, podczas tworzenia instancjiCompositionPlayerużyjsetVideoGraphFactory(), aby zamiast tego użyćMultipleInputVideoGraph.Factory.SingleInputVideoGraph.Factorywystarczy, 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 lubEditedMediaItem.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.