Jeg har videorammer i PNG-format ved 1 FPS, og jeg prøver å konvertere dem til en video ved hjelp av ffmpeg.
Hvis jeg gjør noe slikt:
ffmpeg -i data/input-%4d.png data/output.mp4
får jeg en video på 25FPS som i utgangspunktet er en veldig raskt fremover av inngangen (som er fanget ved 1FPS).
Hvis jeg prøver:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Jeg får noe som VLC ikke vil spille 🙂
Nå, hvis jeg tar den første videoen (FF-en) og bruker et filter for å senke den (f.eks. -filter:v "setpts=24.0*PTS"
), jeg kan få den til å spille som en 1 FPS-video, men selvfølgelig er prisen filstørrelse. Det genererer en mengde gjentatte bilder antar jeg.
Så, spørsmålet er hvordan lager jeg en video som har nøyaktig 1 FPS og faktisk spiller i den hastigheten? Utdataformatet, btw, er ikke » t det viktige for meg.
Kommentarer
Svar
Hvis du vil ha en one-liner for FFMPEG som genererer en video som spilles av med 1 ramme per sekund, er det du vil gjøre å spesifisere framerates for både input og output, slik:
ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4
-r 1
betyr at videoen vil spilles av med en av originalbildene per sekund.
-r 10
betyr at videoen vil spilles av med 10 bilder per sekund.
(-pix_fmt yuv420p
er bare der for å sikre kompatibilitet med et bredt spekter av avspillingsprogrammer. Det kreves for eksempel her at videoen kan spilles av Windows Media Player.)
Jeg testet mange forskjellige utskriftsrammer, og 10 ser ut til å være det laveste tallet du kan bruke som fremdeles vil produsere en video som VLC vil spille av.
Selvfølgelig betyr kommandoen over at hvert originale bilde blir multiplisert, men det er en enklere metode enn den «sakte ned» du nevnte, og avhengig av kodeken produserer kanskje ikke en video som er mye større enn en ekte 1-FPS-video.
For å teste dette, produserte jeg nettopp en ekte 1-FPS-video, som kom ut på 2,24 kiB. Deretter produserte jeg en video med de samme inngangsbildene, men sendte ut med 24 FPS, og den kom ut på 5,76 kiB. Det er litt over det dobbelte, og ikke i nærheten av 24 ganger størrelsen. 🙂
Kommentarer
- +1 på -pix_fmt. Lett å glem at noen insisterer på å bruke WMP 🙂
- hvorfor vil du at utdataformatet skal være 10 fps mens inngangen bare er 1? Ville ikke ‘ t det lage 90% overflødige rammer som er nøyaktig de samme?
- @ Herbert skaper det overflødige rammer slik at du kan få rammehastigheten opp til 10, noe som gjøres bare så VLC ikke ‘ t klager , og det endrer visuelt ikke ‘ videoen. Koderen er smart nok til å se at rammene alle er identiske så du ikke ‘ t ender med en mye større fil
- @chiliNUT klar, keyframe-tingen, som ikke alle formater, men mest fornuftige formater vil gjøre. Takk !
Svar
Bruk begge -framerate
og -r
F.eks. å ha en endelig video som ser ut som 1FPS:
ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Dette ligner på det Konvertering av PNG-rammer til video ved 1 FPS | Unix & Linux Stack Exchange sier, men jeg trengte -framerate
i stedet for -r
for at det skal fungere.
Dette er nevnt på wiki-en på: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Den setter utgangsbildet til 30
, som VLC kan håndtere, og kopierer hvert bilde 30 ganger, slik at utgangsvideoen ser ut til å være på 1 FPS. Se også: Avspillingsproblemer i VLC med lav fps-video fra bilder ved hjelp av ffmpeg | Stack Overflow
VLC kan da spille av videoen normalt.
Testet på Ubuntu 16.10, VLC 2.2.4, ffmpeg
3.0.5, i en katalog med 10 PNGer.
Kommentarer
- Hva ‘ er forskjellen mellom
-r
og-framerate
? - @Royi Jeg vet ikke ‘, bortsett fra at det er det eneste som fungerte for meg 🙂 Men hvis du klarte å trekk den ut fra
man
-sidene, gi meg beskjed 😉 Et meningsfylt sitat er » -r Som et inputalternativ, ignorere alle tidsstempler lagret i filen og i stedet genererer tidsstempler forutsatt konstant bildefrekvens fps. Dette er ikke det samme som -frame-alternativet som brukes for noen inngangsformater som image2 eller v4l2 (det pleide å være det samme i eldre versjoner av FFmpeg). Hvis du er i tvil, bruk -framerate i stedet for input-alternativet -r. »
Svar
Hva om du forsterker det andre eksemplet ditt litt som følger:
$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
-r 1
må komme før .png-filene, ikke etter.
Fra FFmpeg-dokumentasjon :
Som hovedregel brukes alternativene til den neste spesifiserte filen. Derfor er rekkefølge viktig, og du kan ha det samme alternativet på kommandolinjen flere ganger. Hver forekomst blir deretter brukt på neste inn- eller utdatafil.
Kommentarer
- Dessverre dette virker ikke. Å nevne at bestillingen er viktig sparte meg imidlertid mye tid. Takk.
Svar
Dette er en feil i VLC (som fortsatt eksisterer i versjon 3.0.6). Etter noen eksperimenter skjønte jeg at VLC krasjer for videoer med FPS mindre enn 10 . Så alle videoer med 10 FPS eller mer burde ikke være et problem. Det er for øyeblikket ingen ren måte å få en video med 1 FPS som kan spilles av i VLC ( don «t gi opp, fortsett å lese ).
En løsning er – som vist i svaret ovenfor – for å falske effekten av 1 FPS ved å duplisere bildene (når vi har faktisk en FPS som tilsvarer 10 eller mer, noe som er ok for VLC).
Eksempel: hvis du har en mappe med 12 bilder, og du vil generere en video med 1 FPS (som kan spilles av i VLC), må du duplisere hvert bilde flere ganger (la oss si 10 ganger), og deretter fortelle FFMPEG for å generere en 10 FPS-video. På denne måten får vi en video med totalt 120 bilder, hvor hvert bilde blir spilt i 1 sekund (da det dupliseres 10 ganger), som ganske enkelt er en falsk for 1 FPS.
Jeg foretrekker å bruke fps
parameter i stedet for
(som vises i et annet svar) som i noen tilfeller kan være problematisk (i henhold til offisiell dokumentasjon ).
ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv
Da inngangen -framerate
er lavere enn utdata fps
, FFMPEG vil duplisere rammer for å nå ønsket utgangsfrekvens (som er 10 i henhold til kommandoen ovenfor).
Det er også viktig å legge merke til at rekkefølgen på -framerate
og -vf fps
er viktig , da denne konfigurasjonen vil bli brukt på neste nevnte video (inn- eller utgang). Det er i henhold til offisielle dokumenter :
alternativene blir brukt på det neste angitte fil. Derfor er orden viktig …
ffmpeg
er smart nok til å finne ut videokodeken bare fra filtypen containerformat,.mp4
. Prøv å legge til-vcodec libx264 -vpre hq
til kommandolinjen, for å fortelle det kodeken og kodingsparametrene.-r 1
.