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

  • I ‚ si nejsem jistý 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í.
  • Ve skutečnosti to přišlo dobře, a jak jsem již zmínil, fungovalo to dobře a pouze podivné výsledky přinesly, když jsem přidal -r 1.
  • Myslím, že můžete mít větší štěstí při odpovědi ffmpeg na stackoverflow.com nebo superuser.com .

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.

Viz také: https://stackoverflow.com/questions/19267443/vlc-freezes-for-low-1-fps-video-created-from-images-with-ffmpeg

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.

Z dokumentace FFmpeg :

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 …

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *