Hoe maak je een video van afbeeldingen met FFmpeg?

Deze regel werkte prima, maar ik wil een videobestand maken van afbeeldingen in een andere map.
De namen van afbeeldingen in mijn map zijn:

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

Hoe kan ik afbeeldingsbestanden uit een andere map invoeren? Voorbeeld: C:\mypics

Ik heb deze opdracht geprobeerd, maar ffmpeggenereerde een video met alleen de eerste afbeelding (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

Antwoord 1, autoriteit 100%

Bekijk de Maak een videodiavoorstelling van afbeeldingen – FFmpeg

Als je video de frames niet correct weergeeftAls je problemen ondervindt, zoals het eerste beeld dat wordt overgeslagen of slechts voor één frame wordt weergegeven, gebruik dan het fps-videofilterin plaats van -rvoor de output framerate

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

Als alternatief kan het formaat videofilter worden toegevoegd aan de filterketen om -pix_fmt yuv420pzoals “fps=25,format=yuv420p”te vervangen. Het voordeel van deze methode is dat u kunt bepalen welk filter als eerste wordt gebruikt

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

Ik heb onderstaande parameters getest, het werkte voor mij

"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

onderstaande parameters werkten ook, maar de eerste afbeelding wordt altijd overgeslagen

"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

een video maken van afbeeldingen die in verschillende mappen zijn geplaatst

Voeg eerst afbeeldingspaden toe aan imagepaths.txtzoals hieronder.

# 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'

Voorbeeld van gebruik als volgt;

"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"

-safe 0parameter voorkomt fout Onveilige bestandsnaam

Verwante links

FFmpeg maakt een video van afbeeldingen die in verschillende mappen zijn geplaatst

FFMPEG An Intermediate Guide/image sequence

Samenvoegen – FFmpeg


Antwoord 2, autoriteit 86%

-pattern_type glob

Deze geweldige optie maakt het in veel gevallen gemakkelijker om de afbeeldingen te selecteren.

Diashowvideo met één afbeelding 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, cutoff wanneer de vermoedelijk langere audio wanneer de afbeeldingen eindigen:

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 door Theora gepatenteerde videoformaat:

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 afbeeldingen moeten natuurlijk alfabetisch worden gesorteerd, meestal als:

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

en ga zo maar door.

Ik zou er ook eerst voor zorgen dat alle te gebruiken afbeeldingen dezelfde beeldverhouding hebben, mogelijk door ze bij te snijden met imagemagickof nomacsvooraf, zodat ffmpeg geen moeilijke beslissingen hoeft te nemen. Vooral de breedte moet deelbaar zijn door 2, anders mislukt de conversie met: “breedte niet deelbaar door 2”.

Video met normale snelheid met één afbeelding per frame bij 30 FPS

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

Zo ziet het eruit:

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

Dit zijn de testmedia die ik heb gebruikt: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

Afbeeldingen gegenereerd met: Hoe om GLUT/OpenGL te gebruiken om naar een bestand te renderen?

Het is cool om te zien hoeveel de video de beeldreeks 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,3 miljoen

Een muziekbestand converteren naar een video met een vaste afbeelding voor YouTube-upload

Beantwoord op: https:// superuser.com/questions/700419/how-to-convert-mp3-to-youtube-allowed-video-format/1472572#1472572

Stap voor stap een volledig realistische case study-configuratie voor diavoorstellingen

Het maken van diavoorstellingen houdt iets meer in dan het uitvoeren van een enkele ffmpeg-opdracht, dus hier volgt een interessanter gedetailleerd voorbeeld geïnspireerd door deze tijdlijn.

De invoermedia ophalen:

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.
# https://unix.stackexchange.com/questions/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

Nu kijken we snel naar alle afbeeldingsformaten om de uiteindelijke beeldverhouding te bepalen:

identify png/*

die uitvoer:

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

dus de klassieke beeldverhouding van 480p (640×480 == 4/3) lijkt geschikt.

Voer één conversie uit met minimaal formaat om de breedten gelijk te maken (TODO
automatiseren voor elke breedte, hier heb ik handmatig naar identify-uitvoer gekeken en breedte en hoogte met één verminderd):

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

Dit levert verschrikkelijke output op, want zoals blijkt uit:

ffprobe raw.mp4

ffmpeg neemt gewoon de grootte van de eerste afbeelding, 556×494, en converteert vervolgens alle andere naar die exacte grootte, waardoor hun beeldverhouding wordt verbroken.

Laten we de afbeeldingen nu automatisch converteren naar de beoogde beeldverhouding van 480p door bij te snijden volgens ImageMagick: hoe een afbeelding minimaal bijsnijden tot een bepaalde beeldverhouding?

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

Dus nu is de beeldverhouding goed, maar onvermijdelijk moest er wat worden bijgesneden, waardoor interessante delen van de afbeeldingen werden versneden.

De andere optie is om een zwarte achtergrond te gebruiken om dezelfde beeldverhouding te krijgen als weergegeven op: Formaat wijzigen zodat deze in een kader past en achtergrond instellen op zwart op “leeg” gedeelte

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

Over het algemeen kun je echter idealiter afbeeldingen selecteren met dezelfde of vergelijkbare beeldverhoudingen om deze problemen te voorkomen.

Over de CLI-opties

Merk echter op dat ondanks de naam, -globdit niet zo algemeen is als shell Glob-patronen, bijvoorbeeld: -i '*'mislukt: https://trac.ffmpeg.org/ticket/3620(blijkbaar omdat het bestandstype wordt afgeleid uit de extensie).

-r 30maakt de -framerate 1video 30 FPS om bugs in spelers zoals VLC voor lage framerates te verhelpen: VLC loopt vast voor lage 1 FPS-video gemaakt van afbeeldingen met ffmpegDaarom wordt elk frame 30 keer herhaald om het gewenste effect van 1 beeld per seconde te behouden.

Volgende stappen

U wilt ook:

TODO: leer meerdere audiobestanden in de video te knippen en samen te voegen zonder tussenliggende bestanden, ik ben er vrij zeker van dat het mogelijk is:

Getest op

ffmpeg 3.4.4, vlc 3.0.3, Ubuntu 18.04.

Bibliografie


Antwoord 3, autoriteit 12%

Eenvoudige versie van de documenten

Werkt bijzonder goed voor Google Earth Studio-afbeeldingen:

ffmpeg -framerate 24 -i Project%03d.png Project.mp4

Antwoord 4, autoriteit 9%

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

van wiki


Antwoord 5

Om frames van video te maken:

ffmpeg\ffmpeg -i %video% test\thumb%04d.jpg -hide_banner

Optioneel: verwijder frames die u niet wilt in video-uitvoer
(nauwkeuriger dan het bijsnijden van video met -ss& -t)

Maak vervolgens een video van afbeelding/frames, bijv.:

ffmpeg\ffmpeg -framerate 30 -start_number 56 -i test\thumb%04d.jpg -vf format=yuv420p test/output.mp4

Other episodes