Przejście między dwoma fragmentami treści wideo jest w FFmpeg dość skomplikowane. Nie ma takiego filtru, jak w przypadku dźwięku.
Jak skutecznie to zrobić?
ffmpeg
video-editing
Mark Gerolimatos
źródło
źródło
[0:a][1:a] acrossfade=d=1 [audio]
do filtra, a następnie-map "[audio]"
do polecenia i zadziałało. Jeśli chcesz, przetestuj i zaktualizuj odpowiedź!Odpowiedzi:
Wersja TL; DR:
W tym przykładzie wykonuje się tylko wideo, zakładając, że oba klipy wideo mają tę samą rozdzielczość, szybkość klatek itp. Spowoduje to 1-sekundowe przenikanie pomiędzy fadeoutclip i fadeinclip. Załóżmy, że wyciszenie trwa 10 sekund. Zauważ, że jest to sformatowane dla jasności: tak naprawdę jest to jeden wiersz kodu.
Pełna wersja:
Oto wyjaśnienie, o co w tym wszystkim chodziło:
Specyfikacja wejściowa ... oczywista
Tworzenie
filter_complex
: zakładając, że już rozumiesz kompleksy filtrów:Najpierw rozbieramy dwa strumienie na dwa kawałki, używając filtru przycinania : zawartość i sekcja przenikania. Wyciszenie jest podzielone na zawartość i sekcję przenikania, podczas gdy wyciszanie jest dzielone na sekcję przenikania i zawartość. Łącznie cztery sekcje.
Zauważ, że ściśle mówiąc, nie musimy rozdzielać przekrojów: MUSIMY po prostu określić czasy zanikania i zanikania dla dwóch klipów wideo. Jednak w ten sposób:
overlay
użytkowania filtraKażda z tych czterech sekcji określa: czas rozpoczęcia (sekundy), czas zakończenia (sekundy) oraz tajemniczy
setpts=PTS-STARTPTS
filtr , który zasadniczo powoduje, że każdy klip wideo rozpoczyna się od 0 sekund. Będzie to miało zasadnicze znaczenie podczas ich ponownego łączenia.Zauważ, że
s=0
specyfikatory są redundantne, asetpts
filtr dlas=0
nich jest również redundantny. Oba są jednak nadmiarowe, aby umożliwić zmianę czasu rozpoczęcia od 0, bez naruszania kompleksu filtrów. Ponadto drugi klip zawartości biegnie do końca, więce=
część (end =) nie jest określona.Następnie określamy przenikanie i zanikanie: Najpierw dodajemy kanał alfa (przezroczystość) do obu sekcji przenikania, określając format pikseli
yuva420p
. Możesz użyć dowolnego formatu, który zapewnia kanał alfa.Następna w tym filtrze subcomplex określamy jedną zgaśnie, a jeden zanikać w. The
alpha=1
oznacza, że sam film nie zostanie wygaszony, tylko ilość przejrzystość „Fade”.st
oznacza początek,d
oznacza czas trwania.Co to jest ?: Do
fifo
filtrów zapewnia, że nie jest bufor przestrzeń dostępną w filtrze złożonym. O dziwo, NIE jest to ustawienie domyślne. Jeśli tego nie zrobisz, crossfade może się nie udać, jeśli wynik powyższego etapu przekroczy filtr nakładki poniżej. Tak, wiem o czym teraz myślisz. To rzeczywiście błąd FFMPEG .Teraz nałóż dwie sekcje przenikania : upewniając się, że dwie sekcje przenikania mają ten sam rozmiar, nie musimy się martwić o dość paskudne opcje, jakie ma filtr nakładki (dlatego je tutaj ignorujemy):
Na koniec, wyrównujemy nasze trzy segmenty za pomocą filtra konkat .
A teraz zamapuj pad wyjściowy jako źródło wideo.
NIE ZAPOMNIJ ustawić formatu piksela NA CO NORMALNIE UŻYWAĆ (zwykle
yuv420p
), ponieważ sekcja przejścia pojawi sięyuv420
na kanale wyjściowym! (ponieważ nie określiliśmy tego, możesz użyć argumentów nakładki) Oczywiście, jeśli CHCESZyuv420
, to nic ci nie jest :-)Następnie można ponownie połączyć audio później (poza zakresem niniejszego pytania i odpowiedzi)
źródło
trim=start=0:end=9
(zamiasttrim=st=0:e=9,
...Filter setpts has an unconnected output
dla skryptu. Zmieniłem już parametry przycinania, aby rozpocząć i zakończyć.