Videó az összes lehetséges android mintáról
Készítettem egy videót, amiben látható az összes lehetséges minta, amivel le lehet zárni egy androidos készüléket. Ebben a cikkben ezen projektem részleteit ismertetem.
A minta szabályai
Ebben a részben ismertetem, hogy milyen feltételeknek kell teljesülnie egy érvényes mintára. Ha a szabályokat már ismered, akkor ezt a részt nyugodtan átugorhatod.
Adott 9 pont, amik egy 3x3-as négyzetrács mentén vannak elhelyezve. Azaz 3 sorban és 3 oszlopban. Ezek közül a pontok közül kell kiválasztanunk 4≤l≤9 darabot úgy, hogy a sorrend számít. Továbbá bármely x és y pontra, ahol x-et közvetlenül y követi a mintában teljesülnie kell a következőnek: a négyzetrácsos megjelenítésben össze lehet kötni őket egy egynes szakasszal úgy, hogy bármely más pont, ami még a szakszra esik (az x és y-on kívül) már szerepelt a minta x-et megelőző részében.
A szoftver
Az első feladat az volt, hogy legeneráljam a lehetséges mintkákat képekként, hogy azokat majd össze tudjam fűzni egy videóvá. Ehhez írtam C nyelven egy programot, amit itt lehet elérni: plock. Ezután kigeneráltam a szükséges képeket SVG formátumba a következő parancsal:
plock -p svg -os SVGs/pattern_%d.svg
Aminek a futásával kapcsolatos részletek (a kód optimalizálása nélkül) a következő voltak:
time | du -sh | ||
---|---|---|---|
real | user | sys | |
0m36,226s | 0m21,465s | 0m14,309s | 1,5G |
A program jelenlegi változata fixen 500x500-as méretet állít be a generált SVG képeknek.
A képek számából természetesen kiderült, hogy a lehetséges minták száma: 389112
A videó
A képeket az ffmpeg nevű parancssoros videószerkesztő programmal fűztem össze egy videóvá. Először azzal próbálkoztam, hogy minden minta pontosan egy képkocka (frame) erejéig látszódjon és a framerate-nek olyan értéket adtam, hogy az így készült videó nagyábból 12 óra hosszú legyen. Azonban ez a megoldás nyilván nem szabványos framerate értéket eredményezett, amit sajnos a legtöbb lejátszó program nem tud kezelni, ahogy ezt a VLC esetében is megtapasztalhattam. Szóval ezután a következővel próbálkoztam:
ffmpeg -framerate 9.009 -i SVGs/pattern_%d.svg -r 25 all-patterns.mp4
Itt a bemeneti framerate-et a -framerate kapcsoló határozza meg, a kimenetit pedig az -r. Ha az -r nincs explicit megadva, akkor az értéke a bemeneti framerate-el lesz egyenlő. Ez már megfelelő eredményt adott, de mivel a videót az általam bérelt VPS-ről terveztem elérhetővé tenni, így a generált videó méretét is célszerű lett volna minnél jobban csökkenti. Szóval a végső megoldás a következő lett:
ffmpeg -framerate 9.009 -i SVGs/pattern_%d.svg -r 25 -preset veryslow -tune animation all-patterns.mp4
A -preset veryslow mondja meg az ffmpeg-nek, hogy olyan tömörítési algoritmust használjon, ami több CPU erőforrást használ (lassabb), de ezáltal hatékonyabb is.
Ezen két parancs futtatásának eredménye a következő táblázatban látható:
Verzió | time | size | bitrate | ||
---|---|---|---|---|---|
real | user | sys | |||
1. parancs | 98m44,197s | 316m44,632s | 4m1,423s | 583M | 113 kb/s |
2. parancs | 297m59,601s | 1097m54,172s | 5m56,486s | 276M | 53.5 kb/s |
Az eredmény
A fő videón kívül csináltam egy rövidebb részlet videót is, ha csak belenéznél és nem szeretnéd a teljes hosszúságú videót letölteni. A videók tulajdonságait és a linkeket az elérésükhöz a következő táblázatban találod:
letöltés | időtartam | méret |
---|---|---|
patterns-video-sample.mp4 | 10 perc 27 másodperc | 4,2MB |
all-patterns.mp4 | 11 óra 59 perc 51 másodperc | 276MB |
SHA256 összege a nagyobb videónak:
85c8c94f35ff2fda566545e4d691bde542cf13a4c5ce9d8552356c8e1c059f29 all-patterns.mp4
Egyéb tulajdonságok, amik megegyeznek mindkét videónál:
felbontás | kompatibilitás | |||
---|---|---|---|---|
firefox | chrome | VLC | mpv | |
500x500 | nem | igen | igen | igen |
A táblázatban a kompatibilitási oszlopok a generált videók különböző böngészőkben és lejátszó programokban történő lejátszhatóságára vonatkoznak.