Jak stworzyć wideo z obrazów za pomocą FFmpeg?

163
ffmpeg -r 1/5 -start_number 2 -i img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4

Ta linia działała dobrze, ale chcę utworzyć plik wideo z obrazów w innym folderze. Nazwy obrazów w moim folderze to:

img001.jpg
img002.jpg
img003.jpg
...

Jak mogę wprowadzić pliki obrazów z innego folderu? Przykład:C:\mypics

Wypróbowałem to polecenie, ale ffmpegwygenerowałem wideo tylko z pierwszym obrazem (img001.jpg).

ffmpeg -r 1/5 -start_number 0 -i C:\myimages\img%03d.png -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
user3877422
źródło

Odpowiedzi:

167

Zobacz Tworzenie pokazu slajdów wideo z obrazów - FFmpeg

Jeśli wideo nie wyświetla poprawnie klatek Jeśli napotkasz problemy, takie jak pominięcie pierwszego obrazu lub wyświetlenie go tylko dla jednej klatki, użyj filtru wideo fps zamiast -r dla wyjściowej szybkości klatek

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4

Alternatywnie filtr wideo formatu można dodać do łańcucha filtrów, aby zastąpić -pix_fmt yuv420p, na przykład „fps = 25, format = yuv420p” . Zaletą tej metody jest to, że możesz kontrolować, który filtr jest używany jako pierwszy

ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf "fps=25,format=yuv420p" out.mp4

Testowałem poniższe parametry, u mnie zadziałało

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -vf "fps=25,format=yuv420p" e:\out.mp4

poniższe parametry również działały, ale zawsze pomija pierwszy obraz

"e:\ffmpeg\ffmpeg.exe" -r 1/5 -start_number 0 -i "E:\images\01\padlock%3d.png" -c:v libx264 -r 30 -pix_fmt yuv420p e:\out.mp4

tworzenie wideo z obrazów umieszczonych w różnych folderach

Najpierw dodaj ścieżki obrazów do imagepaths.txt, jak poniżej.

# this is a comment details https://trac.ffmpeg.org/wiki/Concatenate

file 'E:\images\png\images__%3d.jpg'
file 'E:\images\jpg\images__%3d.jpg'

Przykładowe użycie w następujący sposób;

"h:\ffmpeg\ffmpeg.exe" -y -r 1/5 -f concat -safe 0 -i "E:\images\imagepaths.txt" -c:v libx264 -vf "fps=25,format=yuv420p" "e:\out.mp4"

Parametr -safe 0 zapobiega błędnej nazwie pliku

Powiązane linki

FFmpeg tworzy wideo z obrazów umieszczonych w różnych folderach

FFMPEG Pośredni przewodnik / sekwencja obrazów

Concatenate - FFmpeg

chan
źródło
„Jeśli Twój film wideo nie wyświetla poprawnie klatek Jeśli napotkasz problemy, takie jak pominięcie pierwszego obrazu lub wyświetlenie go tylko dla jednej klatki, użyj filtru wideo fps” Przepraszamy, ale czy mógłbyś wyjaśnić, co masz na myśli przez „fps filtr wideo "dokładnie?
arnuschky
3
O ile wiem, parametr -r to zmienna liczba klatek na sekundę, oznacza to, że FFMPEG może upuszczać lub powielać klatki, aby osiągnąć żądaną wyjściową liczbę klatek na sekundę. Użycie filtra fps „-vf fps = wartość” wymusza na FFMPEG uzyskanie stałej liczby klatek na sekundę. Zobacz: Tworzenie pokazu slajdów wideo z obrazów - FFmpeg , i to Jaka jest (techniczna) różnica między -r a filtrem fps? . Dlatego użycie parametru -r czasami powoduje pominięcie pierwszego obrazu ..
khan
Pierwsze polecenie na tej liście ffmpeg -r 1/5 -i img%03d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4wydawało się działać, ale ostatecznie spowodowało, że wideo było nieczytelne dla żadnego gracza (na Ubuntu). VNC powiedział: „Nie znaleziono atomu moov”. Próba naprawienia tego problemu qt-faststartspowodowała błąd „ostatni atom w pliku nie był atomem
moov
149

-pattern_type glob

Ta świetna opcja w wielu przypadkach ułatwia wybieranie obrazów.

Pokaz slajdów wideo 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 tego trochę muzyki, odetnij, gdy przypuszczalnie dłuższy dźwięk, gdy kończą się obrazy:

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 dwie wersje demonstracyjne w YouTube:

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

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 obrazy powinny być oczywiście posortowane alfabetycznie, zazwyczaj jako:

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

i tak dalej.

Chciałbym również najpierw upewnić się, że wszystkie używane obrazy mają ten sam współczynnik proporcji, być może wcześniej przycinając je za pomocą imagemagicklub nomacs , aby ffmpeg nie musiał podejmować trudnych decyzji. W szczególności szerokość musi być podzielna przez 2, w przeciwnym razie konwersja nie powiedzie się z: „szerokość niepodzielna przez 2”.

Wideo z normalną prędkością 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 za pomocą: /ubuntu/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

Oto media testowe, których użyłem: a

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 generowane za pomocą: Jak używać GLUT / OpenGL do renderowania do pliku?

Fajnie jest obserwować, jak bardzo wideo kompresuje sekwencję obrazów znacznie lepiej niż ZIP, ponieważ jest w stanie kompresować między klatkami za pomocą wyspecjalizowanych algorytmów:

  • opengl-rotating-triangle.mp4: 340 tys
  • opengl-rotating-triangle.zip: 7,3 mln

Konwertuj jeden plik muzyczny na wideo ze stałym obrazem do przesłania do YouTube

Odpowiedział na: /superuser/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Pełna realistyczna konfiguracja studium przypadku pokazu slajdów krok po kroku

Tworzenie pokazów slajdów to trochę więcej niż uruchamianie pojedynczego polecenia ffmpeg, więc oto bardziej interesujący, szczegółowy przykład inspirowany tą osią czasu .

Pobierz nośnik wejściowy:

mkdir -p orig
cd orig
wget -O 1.png https://upload.wikimedia.org/wikipedia/commons/2/22/Australopithecus_afarensis.png
wget -O 2.jpg https://upload.wikimedia.org/wikipedia/commons/6/61/Homo_habilis-2.JPG
wget -O 3.jpg https://upload.wikimedia.org/wikipedia/commons/c/cb/Homo_erectus_new.JPG
wget -O 4.png https://upload.wikimedia.org/wikipedia/commons/1/1f/Homo_heidelbergensis_-_forensic_facial_reconstruction-crop.png
wget -O 5.jpg https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Sabaa_Nissan_Militiaman.jpg/450px-Sabaa_Nissan_Militiaman.jpg
wget -O audio.ogg https://upload.wikimedia.org/wikipedia/commons/7/74/Alnitaque_%26_Moon_Shot_-_EURO_%28Extended_Mix%29.ogg
cd ..

# Convert all to PNG for consistency.
# /unix/29869/converting-multiple-image-files-from-jpeg-to-pdf-format
# Hardlink the ones that are already PNG.
mkdir -p png
mogrify -format png -path png orig/*.jpg
ln -P orig/*.png png

Teraz przyjrzymy się wszystkim rozmiarom obrazu, aby zdecydować o ostatecznym współczynniku proporcji:

identify png/*

które wyjścia:

png/1.png PNG 557x495 557x495+0+0 8-bit sRGB 653KB 0.000u 0:00.000
png/2.png PNG 664x800 664x800+0+0 8-bit sRGB 853KB 0.000u 0:00.000
png/3.png PNG 544x680 544x680+0+0 8-bit sRGB 442KB 0.000u 0:00.000
png/4.png PNG 207x238 207x238+0+0 8-bit sRGB 76.8KB 0.000u 0:00.000
png/5.png PNG 450x600 450x600+0+0 8-bit sRGB 627KB 0.000u 0:00.000

więc klasyczny współczynnik proporcji 480p (640x480 == 4/3) wydaje się odpowiedni.

Wykonaj jedną konwersję z minimalną zmianą rozmiaru, aby uzyskać równe szerokości (TODO automatyzuje dowolną szerokość, tutaj po prostu ręcznie spojrzałem na identifywynik i zmniejszono szerokość i wysokość o jeden):

mkdir -p raw
convert png/1.png -resize 556x494 raw/1.png
ln -P png/2.png png/3.png png/4.png png/5.png raw
ffmpeg -framerate 1 -pattern_type glob -i 'raw/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p raw.mp4

Daje to okropną wydajność, ponieważ jak widać z:

ffprobe raw.mp4

ffmpeg po prostu przyjmuje rozmiar pierwszego obrazu, 556x494, a następnie konwertuje wszystkie pozostałe do tego dokładnego rozmiaru, łamiąc ich proporcje.

Teraz automatycznie przekonwertujmy obrazy na docelowy współczynnik proporcji 480p, przycinając zgodnie z ImageMagick: jak minimalnie przyciąć obraz do określonego współczynnika proporcji?

mkdir -p auto
mogrify -path auto -geometry 640x480^ -gravity center -crop 640x480+0+0 png/*.png
ffmpeg -framerate 1 -pattern_type glob -i 'auto/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p auto.mp4

Więc teraz współczynnik proporcji jest dobry, ale nieuchronnie trzeba było wykonać pewne kadrowanie, które wycina interesujące części obrazów.

Inną opcją jest wypełnienie czarnym tłem, aby uzyskać ten sam współczynnik proporcji, jak pokazano na: Zmień rozmiar, aby zmieścić się w ramce i ustawić tło na czarne w „pustej” części

mkdir -p black
ffmpeg -framerate 1 -pattern_type glob -i 'black/*.png' -i orig/audio.ogg -c:v libx264 -c:a copy -shortest -r 30 -pix_fmt yuv420p black.mp4

Ogólnie rzecz biorąc, najlepiej byłoby wybrać obrazy o takich samych lub podobnych proporcjach, aby uniknąć tych problemów w pierwszej kolejności.

Informacje o opcjach CLI

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

-r 30sprawia, że -framerate 1wideo ma 30 klatek na sekundę, aby przezwyciężyć błędy w odtwarzaczach, takich jak VLC, przy niskiej liczbie klatek na sekundę: VLC zawiesza się przy niskim 1 kl./s wideo utworzonym z obrazów za pomocą ffmpeg Dlatego powtarza każdą klatkę 30 razy, aby zachować pożądany efekt 1 obrazu na sekundę.

Następne kroki

Będziesz także chciał:

DO ZROBIENIA: naucz się wycinać i łączyć wiele plików audio w wideo bez plików pośrednich, jestem prawie pewien, że jest to możliwe:

Testowany

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografia

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło
Jeśli używasz języka Python i subprocess.call do uruchomienia ffmpeg, nie powinieneś używać apostrofów 'w nazwach plików wejściowych i wyjściowych. W przeciwnym razie nie znajdzie plików.
RunOrVeith
Byłoby to dla mnie świetne, ale moja kompilacja z pakietu npm ffmpeg-staticnie implementuje glob. ( Pattern type 'glob' was selected but globbing is not supported by this libavformat build)
Sebi
-pix_fmtspowodował Trailing options were found on the commandline.błąd
Anthony Kong
@AnthonyKong Nie mogłem odtworzyć ffmpeg -framerate 1 -pattern_type glob -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4na Ubuntun 19.10 ffmpeg 4.1.4 właśnie teraz, jaka jest twoja wersja i dokładne polecenie?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
20

Prosta wersja z Dokumentów

Działa szczególnie dobrze w przypadku obrazów Google Earth Studio :

ffmpeg -framerate 24 -i Project%03d.png Project.mp4
Joshua Pinter
źródło
1
Nie można odtworzyć tego wyjścia: [h264 @ 0x7f148cc3cc40] akcelerator sprzętowy nie zdekodował obrazu
Bram
cześć, jak mogę wykonać to polecenie, które właśnie znalazłem, czy możesz mi pomóc?
Innocent
@Innocent z terminala lub konsoli.
Joshua Pinter
rozumiem człowieku, ale projekt% 3d.png nie wybrał wszystkich moich obrazów w folderze o nazwach Project001.png, Project002.png i tak dalej. Dostaję tylko 2 zdjęcia, co powinienem zrobić, aby uzyskać wszystkie moje zdjęcia i przekonwertować je na wideo
Innocenty
Czy używasz %3dlub %03d?
Joshua Pinter
10

cat *.png | ffmpeg -f image2pipe -i - output.mp4

z wiki

Głód
źródło