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

Hoe maak je een video van beelden met FFmpeg?

Is het mogelijk om met ffmpeg een video te maken van een reeks sequenties, waarbij het nummer niet bij nul begint?

Bijvoorbeeld, ik heb een aantal afbeeldingen [test_100.jpg, test_101.jpg, test_102.jpg, …, test_200.jpg], en ik wil ze omzetten naar een video. Ik heb het volgende commando geprobeerd, maar het werkte niet (het lijkt erop dat het nummer bij nul moet beginnen):

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

Enig advies?

Antwoorden (10)

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

Het is niet nodig om bestanden te hernoemen als je de -start_number switch gebruikt zoals dit:

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

waarbij n het begin is van de reeks stills.

Note, dit werkt zolang de reeks ononderbroken is als hij eenmaal begint. Als er gaten zijn en je wilt alle foto’s erin, dan kan het nodig zijn om de gaten op te vullen door ze te hernummeren.

Er zijn nog enkele andere schakelaars die je misschien nuttig vindt.

Ik gebruik de volgende one-liner om een langzamere framerate te krijgen en om de beelden te comprimeren en een kleinere video te krijgen:

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

De -r 3 optie zet de framerate van de resulterende video op 3 frames per seconde, zodat ik elke still gedurende een korte tijd kan zien. De -s optie schaalt de foto’s op naar de gewenste resolutie om de grootte van de resulterende video te beheren.

(In de Windows schil, vervang -i Imgp%04d.jpg door -i "Imgp%%04d.jpg". Krediet hiervoor aan Mike Fitzpatrick https://superuser.com/a/344178/153054 )

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

U kunt een voorbeeldscript vinden in de ffmpeg documentatie :

*3.2 Hoe codeer ik afzonderlijke afbeeldingen in films? *

Als u een groot aantal afbeeldingen moet hernoemen, kunt u het volgende commando gebruiken om de last te verlichten. Het commando, dat de bourne shell syntaxis gebruikt, koppelt symbolisch alle bestanden in de huidige directory die overeenkomen met img001.jpg',img002.jpg’ enzovoort.

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

Dan uitvoeren:

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

Uit ffmpeg’s docs: ](https://trac.ffmpeg.org/wiki/Create%20a%20video%20slideshow%20from%20images)

Het gebruik van een glob patroon

ffmpeg ondersteunt ook bash-style globbing (* staat voor een willekeurig aantal karakters).

Dit is handig als je afbeeldingen opeenvolgend zijn, maar niet noodzakelijkerwijs in een numeriek opeenvolgende volgorde zoals in de vorige voorbeelden.

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

Dus, zolang je bestanden gesorteerd zijn, zou het gebruik van de -pattern_type glob switch voor jou moeten werken.

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

Voor zover ik weet, kan je de sequentie niet beginnen met willekeurige getallen (ik herinner me niet of je moet beginnen bij 0 of 1), plus, het mag geen gaten hebben, als dat wel zo is, zal ffmpeg aannemen dat de sequentie voorbij is en stoppen met het toevoegen van meer afbeeldingen.

Ook, zoals vermeld in de opmerkingen bij mijn antwoord, vergeet niet dat je de breedte van je index moet specificeren. Zoals:

image%03d.jpg

En als je een %03d index type gebruikt, moet je je bestandsnamen opvullen met 0, zoals :

image001.jpg image002.jpg image003.jpg

enz.

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

Ik ben het eens met Francisco, maar als workaround zou je gewoon een snel script kunnen schrijven om symbolische links naar de bestanden te verplaatsen of te maken met de sequentienummers die ffmpeg nodig heeft. Het script kan dan ffmpeg oproepen en dan de links verwijderen of de bestanden terugplaatsen naar hun oorspronkelijke locaties.

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

Ik weet dat dit een oude vraag is, maar ik kwam het tegen in Google terwijl ik op zoek was naar hetzelfde antwoord. Geen van de antwoorden hier bevredigde me volledig dus ik heb meer gezocht en gelezen en dit is een commando dat ik voor mijn eigen probleem heb bedacht.

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

De reden waarom ik een commando als dit zou gebruiken is…

  1. Cat en -f image2pipe geven je fijnere controle over welke plaatjes je gebruikt. Zo kun je bijvoorbeeld bash-functies gebruiken zoals bracket expansion en andere commando’s zoals grep om je resultaten te verfijnen, mocht je dat willen.
  2. Minder switches om te onthouden.
  3. Ik raad aan om -r NIET te gebruiken, en gewoon -framerate te gebruiken. Mijn ervaring is dat -r vaker frames laat vallen.
  4. Minder complex, geen onnodige schakelaars in gebruik en het zal werken zoals het is. U kunt meer complexiteit toevoegen (bijvoorbeeld encoder specificeren) en afstemmen op uw behoeften.
0
0
0
2019-08-22 09:59:39 +0000

-pattern_type glob concrete voorbeelden met audio

Deze optie werd genoemd op: https://superuser.com/a/782520/128124 maar hier zijn een paar concrete voorbeelden van het gebruik ervan, inclusief van het toevoegen van audio aan de output video.

Slideshow video met één beeld per seconde

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

Voeg er wat muziek aan toe, en zet de audio uit als de beelden afgelopen zijn:

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

Hier zijn twee demo’s op YouTube:

Wees een hippie en gebruik het Theora patent-ongelimiteerde video formaat :

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

Uw beelden moeten natuurlijk alfabetisch gesorteerd worden, typisch als:

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

enzovoort.

Zie ook: http://unix.stackexchange.com/questions/68770/converting-png-frames-to-video-at-1-fps/339399#339399

Normale snelheid video met één beeld per frame bij 30 FPS

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

Zo ziet het er uit:

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

Voeg er wat audio aan toe:

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

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

Een muziekbestand omzetten naar een video met een vaste afbeelding voor YouTube upload

Beantwoord op: Hoe converteer ik MP3 naar een videoformaat dat door Youtube is toegestaan? ](https://superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572)

Krijg enkele synthetische test-invoerbeelden

Dit zijn de testbeelden die ik in dit antwoord heb gebruikt:

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

Beelden gegenereerd met: https://stackoverflow.com/questions/3191978/how-to-use-glut-opengl-to-render-to-a-file/14324292#14324292

Het is cool om te zien hoeveel de video de beeldsequentie veel beter comprimeert dan ZIP, omdat het in staat is om frames te comprimeren met gespecialiseerde algoritmen:

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

Over de CLI opties

Merk echter op dat ondanks de naam, -glob dit niet zo algemeen is als shell Glob patters, bijv: -i '*' mislukt: https://trac.ffmpeg.org/ticket/3620 (blijkbaar omdat filetype wordt afgeleid uit extensie).

-r 30 maakt de -framerate 1 video 30 FPS om bugs in spelers als VLC voor lage framerates te ondervangen: https://stackoverflow.com/questions/19267443/playback-issues-in-vlc-with-low-fps-video-from-images-using-ffmpeg/41797724#41797724 Daarom herhaalt het elk frame 30 keer om het gewenste 1 beeld per seconde effect te behouden.

Volgende stappen

Je zult ook willen:

TODO: leer om meerdere audiobestanden in de video te knippen en samen te voegen vanaf de opdrachtregel:

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografie

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

In mijn geval was het een beetje lastiger vanwege de nummers in de bestanden. Hier is hoe mijn afbeeldingen eruit zien:

$ 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

en hier is het commando dat ik gebruikte:

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

Uit de documentatie , lijkt het erop dat je gewoon *

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

Als een opmerking, om de kwaliteit te verbeteren, de rate/fps zou belangrijk kunnen zijn (bijvoorbeeld, eerst specificeren zeer laag / hoog frame rate en dan passeren van een tweede filter dat de slow motion video zal maken om normaal?)

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

Je kunt dit doen met convert -morph :

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

Als je ffmpeg wilt gebruiken, gebruikte ik

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

waarbij de 10*PTS ffmpeg vertelt om het 10 keer te vertragen. Je kunt er ook breuken in zetten om het te versnellen.