przechodzenie między 2 filmami za pomocą ffmpeg

27

Próbowałem osiągnąć płynne przejście między 2 klipami wideo za pomocą ffmpeg, ale jak dotąd nie udało mi się. Jestem nowy w ffmpeg i polegam głównie na ulepszaniu tego, co mogę znaleźć w dokumentacji i istniejących przykładach online. Z tego, co przeczytałem do tej pory, użycie filtru mieszania lub nakładki powinno pomóc w osiągnięciu tego, czego szukam, ale nie mogę ustalić szczegółów wiersza poleceń, aby to zadziałało.

The Fade i concat filtry są idealne do zejścia wideo 1, fade-in do VIDEO 2 i concat z 2 do 1 zacisku typu przejściami ale ja doceniam pomoc w uzyskaniu polecenia do przechodzenia z filmu wideo 1 do 2 bez pomiędzy tym stanie się czarny . Nigdzie nie mogłem znaleźć przykładów dokładnie tego problemu, może szukam niewłaściwych słów kluczowych ...?

Mówiąc dokładniej, moje filmy to mp4s (wideo h264, brak dźwięku, w razie potrzeby), każdy ma 5 sekund długości i jestem po przejściu z ok. 4,5 s wideo 1 do 0,5 s wideo 2.

Podobnie do tego, co robi ten samouczek przy użyciu MLT i ramek (przykładowe zanikanie w 2:25), ale szukam sposobu, aby to zrobić tylko w ffmpeg bez wywoływania innych progów. http://www.youtube.com/watch?v=3PRZ9L_KLdI

Wszelkie wskazówki lub linia poleceń, aby uzyskać taki efekt, byłyby bardzo mile widziane, dziękuję bardzo!

Mugba
źródło
powiązane superuser.com/questions/223678/... | stackoverflow.com/questions/7565962/...
Ciro Santilli 27 改造 中心 法轮功 六四 事件

Odpowiedzi:

23

Proponuję zrobić w ten sposób:

  • Utwórz czarne tło o takim samym czasie trwania i rozdzielczości, jak powinno być wyjście wideo
  • Dodaj kanał alfa do każdego filmu
  • Dodaj efekt zanikania do alfa w każdym filmie
  • Użyj nakładki na każdy film z czarnym tłem

Tak więc każde polecenie dodawania płynnego przejścia do 2 filmów (5 sekund) powinno brzmieć:

ffmpeg -i 1.mp4 -i 2.mp4 -f lavfi -i color=black -filter_complex \
"[0:v]format=pix_fmts=yuva420p,fade=t=out:st=4:d=1:alpha=1,setpts=PTS-STARTPTS[va0];\
[1:v]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1,setpts=PTS-STARTPTS+4/TB[va1];\
[2:v]scale=960x720,trim=duration=9[over];\
[over][va0]overlay[over1];\
[over1][va1]overlay=format=yuv420[outv]" \
-vcodec libx264 -map [outv] out.mp4

Spowoduje to wyciszenie pierwszego wideo do alfa w 4. sekundzie (st = 4) przez 1 sekundę (d = 1), zanikanie drugiego w 0 sekund (st = 0) przez 1 sekundę (d = 1) i przesunie jego wyświetlanie czas do przodu do 4 sekund (+ 4 / TB). Następnie wycinamy 9 sekund czarnego koloru, skalujemy go do rozmiaru wyjściowego wideo i nakładamy na niego różne rzeczy.

Mam nadzieję, że to pomoże.

ptQa
źródło
Cześć @ptQa, dzięki bardzo efekt crossfade działa jak urok. Mimo tego, co dzieje się w wyjściowym wideo, jest to, że pokazuje tylko lewą górną część oryginalnych filmów, a reszty ramki brakuje. Patrzyłem na rozdzielczość, wejście to 960 x 720, a wyjście to 320 x 240, ale nie przeskalowuje całego wideo, zamiast tego wycina sekcję 320 x 240 w lewym górnym rogu i pokazuje, że na wyjściu wideo, reszta brak wejściowych filmów wideo. Czy jest jakiś dodatek do twojej linii poleceń, który temu zapobiega?
Mugba,
Och, rozumiem, powinieneś także skalować czarny kolor do rozdzielczości, którą chcesz uzyskać. Zobacz zaktualizowaną odpowiedź. Dodałem skalę do filtrowania wykresu.
ptQa
To rozwiązało, dzięki. Wysłałem przykładowy film pokazujący crossfading w przypadku gdy ktoś chce zobaczyć go w akcji, youtu.be/JqorgXAjjTo
Mugba
Taki sam problem; Mam wariant tego nad niektórymi z moich własnych filmów - dzięki. Pytanie: Jak można by to zmodyfikować, aby przenikać również ścieżki dźwiękowe wideo, według tego samego wzoru, co zanikanie wideo?
Jim Miller
1
BTW, myślę, że w przykładowym poleceniu odpowiedzi wystąpił błąd - powinno być -i 1.mp4 -i 2.mp4..., prawda?
Jim Miller
7

Oto jak to zrobiłem:

  • wersja ffmpeg N-77197-gdf2ce13
  • 2 filmy po 4 sekundy.
  • Musisz dołączyć do tego z zanikaniem między nimi.
  • filmy są 25 fps.

1) Dodaj zanikanie (od jasnego do ciemnego) na końcu 1. i zanikanie (od ciemnego do jasnego) na początku drugiego:

ffmpeg -i 1.mp4 -y -vf fade=out:76:24 1f.mp4

ffmpeg -i 2.mp4 -y -vf fade=in:0:25 2f.mp4

76:24 oznacza, że ​​wyciszenie rozpocznie klatkę 76 i zakończy się 24 klatki później = wyciszenie 1s.

0:25 oznacza, że ​​przenikanie rozpocznie klatkę 0, a zakończy 25 klatek później.

2) Scal 2 filmy

Konwertuj wszystko na TS

ffmpeg -i 1f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 1f.ts

ffmpeg -i 2f.mp4 -c copy -bsf:v h264_mp4toannexb -f mpegts 2f.ts

Łączyć

ffmpeg -i "concat:1f.ts|2f.ts" -bsf:a aac_adtstoasc -c copy output.mp4

Dzięki:

http://www.bogotobogo.com/FFMpeg/ffmpeg_fade_in_fade_out_transitions_effects_filters.php

Erwan
źródło
6
To nie jest crossfade.
Gyan
4
Co powiedział @Mulvya. Crossfade zanika jeden klip w tym samym czasie, co drugi. drugi ma stale zmniejszaną przejrzystość.
intuicyjnie
7

ffmpeg-concat jest najłatwiejszym sposobem na osiągnięcie tego, co chcesz i pozwala na użycie kilku seksownych przejść OpenGL, przy czym domyślnie jest to crossfade.

ffmpeg-gl-przejście to niestandardowy filtr ffmpeg, który umożliwia płynne przechodzenie między dwoma strumieniami za pomocą GLSL. Ten filtr jest znacznie łatwiejszy w użyciu i dostosowywaniu niż wymienione tutaj alternatywy.

Ten filtr obsługuje dużą listę typów przejść, przy czym domyślnym jest crossfade.

./ffmpeg -i 0.mp4 -i 1.mp4 -filter_complex "gltransition=duration=4:offset=1.5" out.mp4
fisch2
źródło
4
Czy zastanawiałeś się nad przesłaniem łatki do FFmpeg?
llogan,
1
Na pewno tak, po prostu muszę naprawić kilka drobnych problemów i najpierw przetestować więcej. Dobra decyzja!
fisch2
czy to jest w oficjalnej FFmpeg? Nie mogę tego zlokalizować
kraftydevil