Jeg har videorammer i PNG-format ved 1 FPS, og jeg prøver at konvertere dem til en video ved hjælp af ffmpeg.

Hvis jeg gør noget som dette:

ffmpeg -i data/input-%4d.png data/output.mp4

får jeg en video ved 25FPS, som grundlæggende er en meget hurtig fremad af input (som er fanget ved 1FPS).

Hvis jeg prøver:

ffmpeg -i data/input-%4d.png -r 1 data/output.mp4

Jeg får noget, som VLC ikke vil afspille 🙂

Nu, hvis jeg tager den første video (FF-en) og anvender et filter for at bremse det (f.eks. -filter:v "setpts=24.0*PTS"), jeg kan få det til at spille som en 1 FPS-video, men selvfølgelig er prisen filstørrelse. Det genererer en masse gentagne billeder antager jeg.

Så spørgsmålet er, hvordan opretter jeg en video, der har nøjagtigt 1 FPS og faktisk spiller med den hastighed? Outputformatet, btw, er ikke ” t det er vigtigt for mig.

Kommentarer

  • Jeg ‘ Jeg er ikke sikker ffmpeg er smart nok til at finde ud af videokodeken lige fra filtypen containerformat, .mp4. Prøv at tilføje -vcodec libx264 -vpre hq til kommandolinjen for at fortælle det codec og kodningsparametre.
  • Det regnede det faktisk ok, og jeg som nævnt fungerede godt og producerede kun underlige resultater, da jeg tilføjede -r 1.
  • Jeg tror, du måske har bedre held med et ffmpeg-svar på stackoverflow.com eller superbruger.com .

Svar

Hvis du vil have en one-liner til FFMPEG, der genererer en video, der afspilles med 1 frame pr. sekund, skal du angive framerates for både input og output, sådan her:

ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4

-r 1 betyder, at videoen afspilles med 1 af originale billeder pr. Sekund.
-r 10 betyder, at videoen afspilles med 10 billeder pr. sekund.

(-pix_fmt yuv420p er lige der for at sikre kompatibilitet med en lang række afspilningsprogrammer. Her kræves det for eksempel, at videoen kan afspilles af Windows Media Player.)

Jeg testede mange forskellige outputframerater, og 10 ser ud til at være det laveste antal, du kan bruge, der stadig vil producere en video, som VLC vil afspille.

Selvfølgelig betyder kommandoen ovenfor, at hvert originale billede multipliceres, men det er en enklere metode end den “langsomme det”, du nævnte, og afhængigt af codec det producerer muligvis ikke en video, der er meget større end en ægte 1-FPS-video.

For at teste dette producerede jeg netop en ægte 1-FPS-video, som kom ud på 2,24 kiB. Derefter producerede jeg en video med de samme inputbilleder, men output ved 24 FPS, og den kom ud på 5,76 kiB. Det er lidt over det dobbelte af størrelsen, og ikke i nærheden af 24 gange størrelsen. 🙂

Kommentarer

  • +1 på -pix_fmt. Let at glem nogle mennesker insisterer på at bruge WMP 🙂
  • hvorfor vil du have, at outputformatet skal være 10 fps, mens input kun er 1? Ville det ikke ‘ t det oprette 90% overflødige rammer, der er nøjagtigt de samme?
  • @Herbert skaber det overflødige rammer, så du kan få billedhastigheden op til 10, hvilket gøres bare så VLC ikke ‘ t klager , og det ændrer visuelt ikke ‘ videoen. Koderen er smart nok til at se, at rammerne alle er identiske, så du ender ‘ ikke med en meget større fil
  • @chiliNUT klar, keyframe-ting, som ikke alle formater, men de mest fornuftige formater vil gøre. Tak !

Svar

Brug begge -framerate og -r

F.eks. at have en endelig video, der ligner 1FPS:

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

Dette svarer til, hvad Konvertering af PNG-rammer til video ved 1 FPS | Unix & Linux Stack Exchange siger, men jeg havde brug for -framerate i stedet for -r for at det skal fungere.

Dette er nævnt på wikien på: http://trac.ffmpeg.org/wiki/Slideshow#Framerates

Det indstiller outputframeraten til 30, som VLC kan håndtere, og kopierer hvert billede 30 gange, så outputvideoen ser ud til at være ved 1 FPS. Se også: Afspilningsproblemer i VLC med lav fps-video fra billeder ved hjælp af ffmpeg | Stack Overflow

VLC er derefter i stand til at afspille videoen normalt.

Testet på Ubuntu 16.10, VLC 2.2.4, ffmpeg 3.0.5, i en mappe med 10 PNGer.

Se også: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

Kommentarer

  • Hvad ‘ er forskellen mellem -r og -framerate?
  • @Royi Jeg ved ikke ‘, bortset fra at det er det eneste, der fungerede for mig 🙂 Men hvis det lykkedes dig ekstraher det fra man siderne, lad mig det vide 😉 Et meningsfuldt citat er ” -r Som en inputmulighed skal du ignorere enhver tidsstempler gemt i filen og i stedet genererer tidsstempler under forudsætning af konstant billedhastighed fps. Dette er ikke det samme som -frameindstillingen, der bruges til nogle inputformater som image2 eller v4l2 (det plejede at være det samme i ældre versioner af FFmpeg). Hvis du er i tvivl, skal du bruge -framerate i stedet for inputmuligheden -r. ”

Svar

Hvad hvis du udvider dit andet eksempel lidt som følger:

$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4 

-r 1 skal komme før .png-filerne, ikke efter.

Fra FFmpeg-dokumentation :

Som hovedregel anvendes indstillinger til den næste angivne fil. Derfor er rækkefølge vigtig, og du kan have den samme mulighed på kommandolinjen flere gange. Hver forekomst anvendes derefter til den næste input- eller outputfil.

Kommentarer

  • Desværre er dette virker ikke. At nævne, at ordren er vigtig , sparte mig dog meget tid. Tak.

Svar

Dette er en fejl i VLC (som stadig findes i version 3.0.6). Efter nogle eksperimenter indså jeg, at VLC går ned for videoer med FPS mindre end 10 . Så alle videoer med 10 FPS eller mere burde ikke være et problem. Der er i øjeblikket ingen ren måde at få en video med 1 FPS, som kan afspilles i VLC ( don “t Giv op, fortsæt med at læse ).

En løsning er – som vist i svaret ovenfor – for at falske effekten af 1 FPS ved at duplikere billederne (når vi har faktisk en FPS lig med 10 eller mere, hvilket er ok for VLC).

Eksempel: hvis du har en mappe med 12 billeder, og du gerne vil generere en video med 1 FPS (som kan afspilles i VLC), skal du duplikere hvert billede flere gange (lad os sige 10 gange) og derefter fortælle FFMPEG til at generere en 10 FPS-video. På denne måde får vi en video med i alt 120 billeder, hvor hvert billede afspilles i 1 sekund (da det duplikeres 10 gange), hvilket simpelthen er en falsk for 1 FPS.

Jeg foretrækker at bruge fps parameter i stedet for

(som vises i et andet svar), hvilket i nogle tilfælde kan være problematisk (ifølge officiel dokumentation ).

ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv 

Da input -framerate er lavere end output fps, FFMPEG vil duplikere rammer for at nå din ønskede billedhastighed (som er 10 i henhold til kommandoen ovenfor).

Det er også vigtigt at bemærke at rækkefølgen af -framerate og -vf fps er vigtigt , da denne konfiguration vil blive anvendt på den næste nævnte video (ind- eller udgang). Det er ifølge officielle dokumenter :

indstillingerne anvendes til det næste specificerede fil. Derfor er rækkefølge vigtig …

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *