2010-05-13 17:58:09 +0000 2010-05-13 17:58:09 +0000
89
89

Jak stworzyć wideo z obrazów używając FFmpeg?

Czy możliwe jest użycie ffmpeg do stworzenia filmu z zestawu sekwencji, gdzie liczba nie zaczyna się od zera?

Na przykład, mam kilka obrazów [test_100.jpg, test_101.jpg, test_102.jpg, …, test_200.jpg], i chcę je przekonwertować na wideo. Próbowałem następującej komendy, ale nie zadziałała (wydaje się, że liczba powinna zaczynać się od zera):

ffmpeg -i test_%d.jpg -vcodec mpeg4 test.avi

Jakieś porady?

Odpowiedzi (10)

84
84
84
2012-08-28 13:19:14 +0000

Nie ma potrzeby zmiany nazw plików, jeśli używamy przełącznika -start_number w następujący sposób:

ffmpeg -start_number n -i test_%d.jpg -vcodec mpeg4 test.avi

gdzie n jest początkiem sekwencji zdjęć.

Uwaga, to będzie działać tak długo, jak długo sekwencja jest nieprzerwana po rozpoczęciu. Jeśli są luki i chcesz, aby wszystkie zdjęcia były uwzględnione, to może być konieczna zmiana numeracji, aby wypełnić te luki.

Istnieje kilka innych przełączników, które mogą okazać się przydatne.

Używam poniższego one-linera, aby uzyskać wolniejszą częstotliwość odświeżania i skompresować obrazy, aby uzyskać mniejsze wideo wynikowe:

ffmpeg.exe -f image2 -framerate 25 -pattern_type sequence -start_number 1234 -r 3 -i Imgp%04d.jpg -s 720x480 test.avi

Opcja -r 3 ustawia framerate wynikowego wideo na 3 klatki na sekundę, dzięki czemu mogę oglądać każdy nieruchomy obraz przez krótki czas. Opcja -s przeskalowuje zdjęcia do żądanej rozdzielczości, aby zarządzać rozmiarem wynikowego filmu.

(W powłoce Windows zamień -i Imgp%04d.jpg na -i "Imgp%%04d.jpg". Uznanie dla Mike'a Fitzpatricka https://superuser.com/a/344178/153054 )

17
17
17
2010-07-18 17:02:21 +0000

Przykładowy skrypt można znaleźć w dokumentacji ffmpeg :

*3.2 Jak zakodować pojedyncze obrazki do filmów? *

Jeśli masz dużą liczbę obrazków do zmiany nazwy, możesz użyć poniższego polecenia, aby odciążyć użytkownika. Polecenie to, używając składni powłoki bourne'a, symbolicznie łączy wszystkie pliki w bieżącym katalogu pasujące do jpg z img001.jpg',img002.jpg’ i tak dalej.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done

Następnie uruchom:

ffmpeg -f image2 -i /tmp/img%03d.jpg /tmp/a.mpg
```.
14
14
14
2014-07-13 07:11:20 +0000

From ffmpeg’s docs:

Using a glob pattern

ffmpeg also supports bash-style globbing (\ reprezentuje dowolną liczbę dowolnych znaków).

Jest to przydatne, jeśli obrazy są sekwencyjne, ale niekoniecznie w kolejności numerycznej, jak w poprzednich przykładach.

ffmpeg -r 1 -pattern_type glob -i 'test_*.jpg' -c:v libx264 out.mp4

Tak więc, o ile twoje pliki są posortowane, użycie przełącznika -pattern_type glob powinno zadziałać.

11
11
11
2010-05-13 18:15:35 +0000

Z tego co wiem, nie możesz rozpocząć sekwencji w losowych liczbach (nie pamiętam, czy powinieneś zacząć od 0 czy 1), plus, nie może mieć przerw, jeśli tak się stanie, ffmpeg założy, że sekwencja się skończyła i przestanie dodawać kolejne obrazy.

Również, jak stwierdzono w komentarzach do mojej odpowiedzi, pamiętaj, że musisz określić szerokość swojego indeksu. Na przykład:

image%03d.jpg

A jeśli używasz typu indeksu %03d, musisz wyścielić swoje nazwy plików z 0, jak :

image001.jpg image002.jpg image003.jpg

itd.

5
5
5
2010-05-13 18:23:37 +0000

Zgadzam się z Francisco, ale jako obejście mógłbyś po prostu napisać szybki skrypt do przenoszenia lub tworzenia dowiązań symbolicznych do plików z numerami sekwencji, których potrzebuje ffmpeg. Skrypt mógłby następnie wywołać ffmpeg, a następnie usunąć linki lub przenieść pliki z powrotem do ich oryginalnych lokalizacji.

2
2
2
2016-08-03 23:44:55 +0000

Wiem, że to stare pytanie, ale natknąłem się na nie w Google podczas szukania tej samej odpowiedzi. Żadna z odpowiedzi tutaj nie usatysfakcjonowała mnie całkowicie, więc zrobiłem więcej poszukiwań i czytania, a to jest komenda, którą wymyśliłem dla mojego własnego problemu.

cat {0032..1501}*.png | ffmpeg -f image2pipe -framerate 5 -i - -s 720x480 test2.avi

Powodem, dla którego użyłbym takiej komendy jest…

  1. Cat i -f image2pipe dają ci dokładniejszą kontrolę nad tym jakich obrazów używasz. Na przykład pozwala ci używać funkcji basha, takich jak rozwijanie nawiasów i innych poleceń, takich jak grep, aby dostroić swoje wyniki, jeśli chcesz.
  2. Mniej przełączników do zapamiętania.
  3. Polecam NIE używać -r, i po prostu użyć -framerate zamiast tego. Z mojego doświadczenia -r ma tendencję do częstszego zrzucania klatek.
  4. Mniej skomplikowane, nie ma niepotrzebnych przełączników w użyciu i będzie działać tak jak jest. Możesz dodać więcej złożoności (na przykład, określając koder) i dostroić do swoich potrzeb.
0
0
0
2019-08-22 09:59:39 +0000

-pattern_type glob konkretne przykłady z dźwiękiem

Opcja ta została wspomniana na: https://superuser.com/a/782520/128124 , ale oto kilka konkretnych przykładów jej wykorzystania, w tym dodania dźwięku do wyjściowego wideo.

Pokaz slajdów z jednym obrazem na sekundę

ffmpeg -framerate 1 -pattern_type glob -i '*.png' \
  -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Dodaj do niego muzykę, odcinając dźwięk po zakończeniu obrazów:

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Oto dwa dema na YouTube:

Bądź hipisem i użyj nieobciążonego patentem Theora formatu wideo :

ffmpeg -framerate 1 -pattern_type glob -i '*.png' -i audio.ogg \
  -c:a copy -shortest -c:v libtheora -r 30 -pix_fmt yuv420p out.ogg

Twoje zdjęcia powinny być oczywiście posortowane alfabetycznie, zazwyczaj jako:

0001-first-thing.jpg
0002-second-thing.jpg
0003-and-third.jpg

i tak dalej.

Zobacz także: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Normalna prędkość wideo z jednym obrazem na klatkę przy 30 FPS

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -c:v libx264 -pix_fmt yuv420p out.mp4

Oto jak to wygląda:

GIF wygenerowany z: https://askubuntu.com/questions/648603/how-to-create-an-animated-gif-from-mp4-video-via-command-line/837574#837574

Dodaj do niego trochę dźwięku:

ffmpeg -framerate 30 -pattern_type glob -i '*.png' \
  -i audio.ogg -c:a copy -shortest -c:v libx264 -pix_fmt yuv420p out.mp4

Wynik: https://www.youtube.com/watch?v=HG7c7lldhM4

Konwertowanie jednego pliku muzycznego na wideo z ustalonym obrazem do przesłania na YouTube

Odpowiedź na: How to convert MP3 to Youtube-allowed video format? ](https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572)

Obtain some synthetic test input images

To są obrazy testowe, których używałem w tej odpowiedzi:

wget -O opengl-rotating-triangle.zip https://github.com/cirosantilli/media/blob/master/opengl-rotating-triangle.zip?raw=true
unzip opengl-rotating-triangle.zip
cd opengl-rotating-triangle
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg

Obrazy wygenerowane za pomocą: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Fajnie jest zaobserwować jak bardzo wideo kompresuje sekwencję obrazów o wiele lepiej niż ZIP, ponieważ jest w stanie kompresować w poprzek klatek za pomocą wyspecjalizowanych algorytmów:

  • opengl-rotating-triangle.mp4: 340K
  • opengl-rotating-triangle.zip: 7.3M

Opcje CLI

Zauważ jednak, że pomimo nazwy, -glob nie jest to tak ogólne jak shellowe wzorce Glob, np: -i '*' nie udaje się: https://trac.ffmpeg.org/ticket/3620 (najwyraźniej dlatego, że typ pliku jest wywnioskowany z rozszerzenia).

-r 30 sprawia, że wideo -framerate 1 ma 30 FPS, aby pokonać błędy w odtwarzaczach takich jak VLC dla niskich framerate'ów: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 Dlatego powtarza każdą klatkę 30 razy, aby zachować pożądany efekt 1 obrazu na sekundę.

Następne kroki

Będziesz także chciał:

TODO: naucz się ciąć i konkatenować wiele plików audio do wideo z linii poleceń:

Testowane na

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografia

0
0
0
2017-10-30 18:28:51 +0000

W moim przypadku było to trochę trudniejsze z powodu numerów w plikach. Oto jak wyglądają moje obrazki:

$ ls | head -5
2014_aq_unprocessed 001.jpg
2014_aq_unprocessed 002.jpg
2014_aq_unprocessed 003.jpg
2014_aq_unprocessed 004.jpg
2014_aq_unprocessed 005.jpg

a oto komenda, której użyłem:

ffmpeg -i 2014_aq_unprocessed\ %3d.jpg -vcodec mpeg4 test.avi
0
0
0
2016-01-29 12:05:41 +0000

Z dokumentacji , wygląda na to, że można po prostu użyć

For example, for creating a video from filenames matching the glob pattern foo-*.jpeg:

ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

Jako uwaga, aby poprawić wpływ na jakość, tempo/fps może być ważne (np. najpierw określając bardzo niski / wysoki frame rate, a następnie przejść z drugiego filtra, który sprawi, że wideo slow motion do normalnego)?

0
0
0
2016-01-14 23:22:34 +0000

Możesz to zrobić za pomocą convert -morph :

convert *.jpg -delay 10 -morph 10 %05d.jpg

Jeśli chcesz użyć ffmpeg, ja użyłem

ffmpeg -pattern_type glob -i '*.jpg' -vf "setpts=10*PTS" movie.mp4

gdzie 10*PTS mówi ffmpegowi, żeby zwolnił 10 razy. Możesz również użyć ułamków, aby przyspieszyć.