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!


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.


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.