Mám snímky videa ve formátu PNG rychlostí 1 FPS a pokouším se je převést na video pomocí ffmpeg.
Pokud udělám něco takového:
ffmpeg -i data/input-%4d.png data/output.mp4
Zobrazuje se mi video rychlostí 25 FPS, což je v zásadě velmi rychlý posun vstupu (zachyceného rychlostí 1 FPS).
Pokud zkusím:
ffmpeg -i data/input-%4d.png -r 1 data/output.mp4
Dostanu něco, co VLC nechce hrát 🙂
Teď, když pořídím první video (FF) a použiji filtr, který ho zpomalí (např. -filter:v "setpts=24.0*PTS"
), mohu to přehrát jako video s 1 FPS, ale cena je samozřejmě velikost souboru. Myslím, že to generuje spoustu opakovaných snímků.
Otázkou tedy je, jak vytvořím video, které má přesně 1 FPS a skutečně se přehrává takovou rychlostí? Výstupní formát, btw, není? “ To je pro mě důležité.
Komentáře
Odpovědět
Pokud chcete pro FFMPEG jednořádkovou linku, která generuje video, které se přehrává rychlostí 1 snímek za sekundu, je třeba zadat snímkové frekvence pro vstup i výstup, například takto:
ffmpeg -r 1 -i data / input-% 4d.png -pix_fmt yuv420p -r 10 data / output.mp4
-r 1
znamená, že se video bude přehrávat při 1 z původních obrázků za sekundu.
-r 10
znamená, že se video bude přehrávat rychlostí 10 snímků za sekundu.
(-pix_fmt yuv420p
je tu právě proto, aby zajistil kompatibilitu s širokou škálou programů pro přehrávání. Zde je například vyžadováno, aby bylo video možné přehrát v programu Windows Media Player.)
Testoval jsem mnoho různých výstupních snímkových rychlostí a 10 se zdá být nejnižším číslem, které můžete použít a které bude stále produkovat video, které VLC přehraje.
Výše uvedený příkaz samozřejmě znamená, že každý původní obrázek se znásobuje, ale je to jednodušší metoda než ta, kterou jste zmínili, a v závislosti na kodeku to nemusí produkovat video mnohem větší než skutečné 1-FPS video.
Abych to otestoval, právě jsem vytvořil skutečné 1-FPS video, které vyšlo na 2,24 kiB. Poté jsem vytvořil video se stejnými vstupními obrazy, ale výstupem 24 FPS, a vyšlo to na 5,76 kiB. To je o něco více než dvojnásobná velikost a zdaleka 24násobek velikosti. 🙂
Komentáře
- +1 na -pix_fmt. Snadné zapomenout, že někteří lidé trvají na používání WMP 🙂
- proč byste chtěli, aby výstupní formát byl 10 fps, zatímco vstup je pouze 1? Nebylo by to ‚ vytvořit 90% nadbytečných snímků, které jsou přesně stejné?
- @Herbert vytváří nadbytečné snímky, takže můžete získat snímkovou frekvenci až 10, což se děje jen proto, aby VLC ‚ t si stěžuje a vizuálně to nezmění ‚ t video. Kodér je dostatečně chytrý, aby zjistil, že všechny snímky jsou identické, takže ‚ nebudete mít mnohem větší soubor
- @chiliNUT jasný, klíčový snímek, který ne všechny formáty, ale většina rozumných formátů zvládne. Díky !
Odpověď
Použít oba -framerate
a -r
Například mít finální video, které vypadá jako 1FPS:
ffmpeg -framerate 1 -pattern_type glob -i "*.png" \ -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
Je to podobné jako Konverze snímků PNG na video rychlostí 1 FPS | Unix & Linux Stack Exchange říká, ale místo -r
div jsem potřeboval -framerate
> aby to fungovalo.
Toto je uvedeno na wiki na adrese: http://trac.ffmpeg.org/wiki/Slideshow#Framerates
Nastaví výstupní snímkovou frekvenci na 30
, kterou dokáže VLC zpracovat, a zkopíruje každý obraz 30krát, takže výstupní video vypadá jako 1 FPS. Viz také: Problémy s přehráváním ve VLC s videem s nízkou rychlostí fps ze obrázků pomocí ffmpeg | Přetečení zásobníku
VLC je poté schopen normálně přehrávat video.
Testováno na Ubuntu 16.10, VLC 2.2.4, ffmpeg
3.0.5, v adresáři s 10 PNG.
Komentáře
- Jaký je ‚ rozdíl mezi
-r
a-framerate
? - @Royi Nevím ‚ opravdu, kromě toho, že to je jediná věc, která pro mě fungovala 🙂 Ale pokud se ti podařilo extrahujte jej ze stránek
man
, dejte mi vědět 😉 Smysluplný citát je “ -r Jako možnost vstupu ignorujte všechny časová razítka uložená v souboru a místo toho generovat časová razítka za předpokladu konstantní snímkové frekvence fps. To není totéž jako volba -framerate použitá pro některé vstupní formáty jako image2 nebo v4l2 (u starších verzí FFmpeg to bývalo stejné). Pokud máte pochybnosti, použijte místo možnosti vstupu -framerate -r. “
Odpovědět
Co když mírně zvýšíte svůj druhý příklad takto:
$ ffmpeg -r 1 -i data/input-%4d.png -c:v libx264 out.mp4
-r 1
musí být před soubory .png, ne až po nich.
Obecně platí, že možnosti se použijí na další zadaný soubor. Pořadí je proto důležité a na příkazovém řádku můžete mít stejnou možnost několikrát. Každý výskyt se poté použije na další vstupní nebo výstupní soubor.
Komentáře
- Bohužel toto nefunguje. Zmínka o tom, že objednávka je důležitá , mi však ušetřila spoustu času. Děkujeme.
Odpověď
Toto je chyba ve VLC (která stále existuje ve verzi 3.0.6). Po několika experimentech jsem si uvědomil, že zhroucení VLC u videí s FPS méně než 10 . Všechna videa s 10 FPS a více by tedy neměla být problém. Aktuálně tedy neexistuje čistý způsob, jak získat video s 1 FPS, které lze přehrát ve VLC ( don „t vzdejte se, pokračujte ve čtení ).
Jedním řešením je – jak je uvedeno v odpovědi výše – falešný efekt 1 FPS duplikováním obrázků (když ve skutečnosti máme FPS rovnou 10 nebo více, což je pro VLC v pořádku).
Příklad: pokud máte složku s 12 obrázky a chcete vygenerovat video s rychlostí 1 FPS (kterou lze přehrávat ve VLC), musíte každý obrázek duplikovat několikrát (řekněme 10krát) a poté říct FFMPEG pro generování videa 10 FPS. Tímto způsobem získáme video s celkovým počtem snímků 120, kde bude každý obrázek přehráván po dobu 1 sekundy (protože je duplikován 10krát), což je jednoduše falešné pro 1 FPS.
Dávám přednost použít parametr fps
spíše než
(který je uveden v jiné odpovědi), což může být v některých případech problematické (podle oficiální dokumentace ).
ffmpeg -framerate 1 -i "img (%d).jpg" -c:v libvpx-vp9 -vf "fps=10,format=yuv420p" out.mkv
Protože vstup -framerate
je nižší než výstup fps
, FFMPEG duplikuje snímky, aby dosáhl požadované výstupní snímkové frekvence (která je podle výše uvedeného příkazu 10).
Je to také je důležité si uvědomit že pořadí -framerate
a -vf fps
je důležité , protože tato konfigurace bude použita na další zmíněné video (na nebo na výstup). To je podle oficiálních dokumentů :
možnosti se použijí na další zadané soubor. Proto je důležitá objednávka …
ffmpeg
je dostatečně chytrý na to, aby zjistil video kodek pouze z přípony souboru ve formátu kontejneru,.mp4
. Zkuste přidat-vcodec libx264 -vpre hq
do příkazového řádku a sdělit mu parametry kodeku a kódování.-r 1
.