Vytvoření AVI videa z obrázků

Vytvoření AVI videa z obrázků
« kdy: 25. 04. 2017, 14:21:52 »
Ahoj

Mam v jedne slozce vetsi mnozstvi png obrazku, rozliseni i barevna hloubra jsou vzdy stejne (2000x1000x8bit). Jedna se o modelove mapy a grafy. Pocet souboru ve slozce je 10000-20000 (vyjimecne i vice).

Chtel bych se zeptat, jak vytvorim z preddefinovane posloupnosti obrazku video s pouzitim prikazove radky. Asi nejlepsi na to bude program ffmpeg.

Musi byt obrazky pojmenovany IM0001 IM0002 atd, nebo staci abecedni serazeni. Aktualne jsou nazvy MAP${cislo}.png, kde se jedna o cela cisla, ktera ale nejdou po jedne, rozdil mezi jednotlvymi cisly jeruzny. Abecedni serazeni obrazku je totozne se serazenim podle casu vytvoreni-modifikace, a samozdrejme je totozne s tim, jak maji jit obrazky ve videu za sebou.

Posledni otazkou je, jak zvolit format. Vytvorene vido by melo byt co nevice bezstratove AVI, nevadi, ze bude velke desiky GiB, vytvorene AVI se totiz bude znovu prevadet do jinych formatu podle potreby. Uplne bezstratove-bez komprese AVI ale asi nepujde. Vlastnosti AVI - 30 fps, rozliseni 2000x1000 stejne jako obrazky, minimalni ztratovost (tedy i velke). Pocet obrazku je obvykle 1000-200000, takze doba videa bude priblizne 1-20hod. Diky za tip.

« Poslední změna: 25. 04. 2017, 14:32:35 od Petr Krčmář »


Trubicoid2

Re:Vytvoření AVI videa z obrázků
« Odpověď #1 kdy: 25. 04. 2017, 15:44:55 »
Já používal mencoder, viz https://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-enc-images.html

Trochu nechápu co nejmíň bezestrátový převod a pak ještě jeden převod do formátu podle potřeby. Bych to z těch obrázků konvertoval hned do těch několika formátů podle potřeby a prostřední krok vynechal. Tím to bude úplně bezestrátově :)

digfl

Re:Vytvoření AVI videa z obrázků
« Odpověď #2 kdy: 25. 04. 2017, 15:50:35 »
ffmpeg -i cokoli%d_neco.png output.avi
pozor, docela jsem zápasil s framerate videa, je existuje parametr -r a -framerate a také záleží na pořadí, zda před -i nebo až za. Tuším že mě fungovalo  pořadí ffmpeg -framerate 10 -i ....

co s týče formátu, mjpeg, x264 s qantizatorem 1 nebo rawvideo.
Pozor, nezapomeň -pix_fmt yuv420p, tedy pokud ho chceš.

Kodek

Re:Vytvoření AVI videa z obrázků
« Odpověď #3 kdy: 25. 04. 2017, 16:36:05 »
Predpokladejme ze mas obr00000.png az obr20000.png:

Pouzije se ayuv bezstratovy a nekomprimovany kodek, zachova dokonce i alfa kanal.
Vysledni soubor bude ale obrovsky (v podstate se png prevede do bmp) pocitej cca 1000Mbit/s.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v -c:v ayuv output.avi

Ponekud lepsi to bude kdyz se pouzije RGB bezstratova komprese podobna jako v png.
To uz budeme nekde na 250Mbit/s, co je mi znamo, avi to moc neumi, tak radeji mov.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v qtrle -pix_fmt rgb24 output.mov

Nejmensi velikost bude kdyz se to prevede z RGB do YUV, opet bezstratova komprese.
To budeme nekde na 150Mbit/s.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v huffyuv -pix_fmt yuv422p output.avi

Honza1

Re:Vytvoření AVI videa z obrázků
« Odpověď #4 kdy: 26. 04. 2017, 00:10:46 »
Kodek

Diky moc za info. Zcela bezstratova komprese u videa znamena opravdu obrovsky narust, takze bych se dostal na X desitek-stovek GiB. Ale aspon vim, ze i u videa existuje bezstratova komprese.

Alfa kanal tam ani neni, png obrazky maji rozliseni 2000x1000, hloubku 8 bit vetsinou (nekdy i 24 bit). FPS pouzivam 30 a 10 snimku za sekundu.

Na Widlich jsem pouzival na tvorbu videa z obrazku staricky jednoduchy program VirtualDub. Kompresi jsem zvolil "Cinepac codec by radius" a kvalitu 100%. Jedna se samozdrejme o ztratovou kompresi, nebylo to tak hrozne. A vysledny soubor mel priblizne 1 GB na 5000 obrazku (necelych 10 min), co je  okolo 1,5 Mbit/s. Jde tam zvolit i AVI bez komprese, ktere je pak mnohonasobne vetsi a nepouzitelne. AVI soubor o velikosti par desitek GiB jsem pak prevedl ffmpeg nebo HandBrake na mpg4, h264, h265. Pokles velikosti i vice nez 20x vetsinou. VirtualDub je stary skoro 15 let, dneska budou kodeky stejne jinde.

Mozna reseni je pouzit mp4 kodek s vysokou kvalitou. Komprese ztratova, ale porad to vypada dost dobre. Jde o to, aby prvni vytvareni souboru netrvalo tak dlouho. Dlouho trva az prevod do jinych formatu (h264, h265).

Musi byt pojmenovani obrazku primo IM00001 az IM20000, nebo staci abecedni razeni (v podstate jde o nazev a cislo, ale cisla nejdou po jedne, abecedni razeni se shoduje s razenim podle casu vytvoreni-modifikace) ?


Jenda

Re:Vytvoření AVI videa z obrázků
« Odpověď #5 kdy: 26. 04. 2017, 00:32:36 »
Doporučil bych ujasnit si pojmy "kodek" a "formát". Použil bych x264 s presetem ultrafast a malým CRF.

Ta výroba z PNG mi vyleakovala paměť, pokud se ti to stane taky, napajpoval bych tam obrázky v surovém RGB formátu.

Lama

Re:Vytvoření AVI videa z obrázků
« Odpověď #6 kdy: 26. 04. 2017, 02:35:20 »

Re:Vytvoření AVI videa z obrázků
« Odpověď #7 kdy: 26. 04. 2017, 09:58:48 »
Predpokladejme ze mas obr00000.png az obr20000.png:

Pouzije se ayuv bezstratovy a nekomprimovany kodek, zachova dokonce i alfa kanal.
Vysledni soubor bude ale obrovsky (v podstate se png prevede do bmp) pocitej cca 1000Mbit/s.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v -c:v ayuv output.avi

Ponekud lepsi to bude kdyz se pouzije RGB bezstratova komprese podobna jako v png.
To uz budeme nekde na 250Mbit/s, co je mi znamo, avi to moc neumi, tak radeji mov.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v qtrle -pix_fmt rgb24 output.mov

Nejmensi velikost bude kdyz se to prevede z RGB do YUV, opet bezstratova komprese.
To budeme nekde na 150Mbit/s.
Kód: [Vybrat]
ffmpeg -i obr%05d.png -c:v huffyuv -pix_fmt yuv422p output.avi

Tak to je bezstratove video podstatne vetsi nez PNG nebo GIFy. U videa by melo jit najit podobnosti mezi jednotlivymi obrazky.

Bezstratova komprese je i animovany GIF, jenze pouze pro 256 barev (coz je u me splneno). Stejne tak jako animovany GIF existuje animovane png - MNG.

Problem u animovaneho gifu je ten, ze pri spusteni se vsechny obrazky nactou do RAM jako bmp. U kratkych animaci to nevadi, video by zabralo desitky-stovky GB RAM.

Otazkou je, jak pak je mozne z animovanym GIF nebo MNG pracovat jako s videem a konvertovat do jineho formatu.

Zarazi me datovy tok k 1000 Mbit/s. Rozliseni je 2000x1000, barevna hloubka 8 bit, pri 30 fps je i pro BMP 2000x1000x8x30 tedy 480 Mbit/s neboli 60 MB/s U barevne hlobky 24 bit je to 3x vyssi, u animovaneho gifu podstatne mene.

U schemat a grafu neni tolik barev a velke plochy jsou stejnou barvou. U fotek je kazdy pixel vicemene jinny a bezstratova komprese PNG zmensi obrazek jen na 40-60%. Video je vetsinou vicemne z fotek, proto se pouzivaji ztratove komprese.

Re:Vytvoření AVI videa z obrázků
« Odpověď #8 kdy: 26. 04. 2017, 10:04:49 »
Doporučil bych ujasnit si pojmy "kodek" a "formát". Použil bych x264 s presetem ultrafast a malým CRF.

Ta výroba z PNG mi vyleakovala paměť, pokud se ti to stane taky, napajpoval bych tam obrázky v surovém RGB formátu.

Diky, to x264 s malym CRF by mohlo byt relativne ve vysoke kvalide, s presetem ultrafast to bude rychle.

Vedel by jsi, jak to v tom ffmpeg nastavit ? Jsem s ffmpeg uplny zacatecnik.

Surove RGB myslis BMP, ze bych to prekonvertoval nejdriv do BMP ? Pak je otazkou, jestli se obrazky musi jmenovat primo obr0001 obr0002 nebo staci abecedni pojmenovani.

bluebull

Re:Vytvoření AVI videa z obrázků
« Odpověď #9 kdy: 26. 04. 2017, 10:20:44 »
Surove RGB myslis BMP, ze bych to prekonvertoval nejdriv do BMP ? Pak je otazkou, jestli se obrazky musi jmenovat primo obr0001 obr0002 nebo staci abecedni pojmenovani.

Nic nekonvertuj, ffmpeg uz udela bitmapy jak je treba.

Jistejsi bude udelat abecdne setrideny seznam souboru a ten poslat do ffmpeg, pak mas jistotu, ze pujdou v spravnem poradi.
Kód: [Vybrat]
cd adresar/s/fotkama
ls | sort > seznam.txt
a pak
Kód: [Vybrat]
ffmpeg -f concat -i seznam.txt -c:v huffyuv -pix_fmt yuv422p output.avi

Re:Vytvoření AVI videa z obrázků
« Odpověď #10 kdy: 26. 04. 2017, 12:48:27 »
BlueBull

Diky, abecedne uz obrazky png pojmenovane jsou, jen ne primo v poradi Obr0001.png Obr0002.png, ale ty cisla jdou s vetsim rozestupem. Ale pro jistotu ten seznam udelam, to nezabere prakticky zadny cas.

ffmpeg -f concat -i seznam.txt -c:v huffyuv -pix_fmt yuv422p output.avi
to se jedna o ten bezstratovy kodek ?  Uvidim jak to poroste. Mozna ze i zkusim mirne ztratove video. Framerate 30 fps tam nekde pujde nastavit, tusim hned na zacatku. A rozliseni predpkladam bude takove, jako obrazky (2000x1000).

Ted uz jen pockat, nez se vse spocita.


Jenda

Re:Vytvoření AVI videa z obrázků
« Odpověď #11 kdy: 26. 04. 2017, 17:37:37 »
Vedel by jsi, jak to v tom ffmpeg nastavit ? Jsem s ffmpeg uplny zacatecnik.
https://jenda.hrach.eu/gitweb/?p=moa;a=blob;f=build.sh;h=8b34da470f6f9bb1562ae24693ce701354aeca07;hb=d924365955b5e9ae5857a8a39f80035394993f6f#l5

https://jenda.hrach.eu/gitweb/?p=duga;a=blob;f=rc;h=ec0705a85d4c374b2e5dd8b96f7ae0d5cd6ac587;hb=57d44e1dc97ec70f5db203fee66dec5014304266#l15

Surove RGB myslis BMP

Ne, surovým RGB myslím surové RGB. Kdybych myslel BMP, tak bych napsal BMP. Surové RGB je proud uint8_t, "první pixel: červená, první pixel: zelená, první pixel: modrá, druhý pixel: červená" atd.

Pak je otazkou, jestli se obrazky musi jmenovat primo obr0001 obr0002 nebo staci abecedni pojmenovani.
Ehm. Píšu, že to tam máš napajpovat, takže je jaksi úplně jedno, jak se ty obrázky jmenují.

Prostě do ffmpegu napajpuješ jednotlivé framy po sobě. Osobně bych to dělal takhle:
Kód: [Vybrat]
for f in *.png; do convert $f do_netpbm_typu_P6 - | tail -n +uřízni_hlavičku; done | ffmpeg -i - -f rgb24 -crf 5 -y out.mkv
https://en.wikipedia.org/wiki/Netpbm_format

Jenda

Re:Vytvoření AVI videa z obrázků
« Odpověď #12 kdy: 26. 04. 2017, 17:42:42 »
Jistejsi bude udelat abecdne setrideny seznam souboru a ten poslat do ffmpeg, pak mas jistotu, ze pujdou v spravnem poradi.
To není jenom o tom, že budou ve správném pořadí. To je o tom, že když ffmpegu dáš "-i obr%05d.png", tak je to všechny najednou rozbalí do paměti - a pokud se to tam nevejde, tak jsi skončil. Zatímco concat filtr je otvírá postupně.

ffmpeg -f concat -i seznam.txt -c:v huffyuv -pix_fmt yuv422p output.avi
to se jedna o ten bezstratovy kodek ?
Proč se ptáš a radši si nevygooglíš "huffyuv" a "yuv422p"? :-( Ne, není to bezztrátové, má to podsamplovanou barevnou složku na polovinu v jednom směru (google: chroma subsampling).

Pravdomil

Re:Vytvoření AVI videa z obrázků
« Odpověď #13 kdy: 26. 04. 2017, 18:12:38 »
To není jenom o tom, že budou ve správném pořadí. To je o tom, že když ffmpegu dáš "-i obr%05d.png", tak je to všechny najednou rozbalí do paměti - a pokud se to tam nevejde, tak jsi skončil. Zatímco concat filtr je otvírá postupně.

To je lez. Klidne si dej 20GB film jako -i velkej.film.mp4 a zbehne ti to i na 4GB RAM masine protoze to proste cely do pameti nepotrebuje davat, jak by to taky adresoval a nac? :D

Re:Vytvoření AVI videa z obrázků
« Odpověď #14 kdy: 26. 04. 2017, 20:28:13 »
Kód: [Vybrat]
ls | sort > seznam.txt
a pak
Kód: [Vybrat]
ffmpeg -f concat -i seznam.txt -c:v huffyuv -pix_fmt yuv422p output.avi

Vytvoreni seznamu je OK, pak ale ffmpeg zahlasi chybu.

[concat @ 0x5427900] Line 1: unknown keyword 'Image0000000004_MAP_Interpolated_MOLA_TEMP.png'
seznam.txt: Invalid data found when processing input

Zmineny nazev obrazku je pro prvni obrazek v rade (jak prvni v abecede tak prvni vytvoreny tak prvni v seznamu) (nikoliv ctvrty, cisla nejdou po jedne).