Podobne ako pred vyše desiatimi rokmi sme si ani teraz nechceli nechať ujsť príležitosť získať obrazové materiály pre výrobu časozberného videa z demolácie déčok, ktoré iste mnohým z vás, ktorí ich poznáte už dlhé a dlhé roky, možno znovu pripomenú všelijaké spomienky zo začiatkov na FI.
Pre účely zberu podkladových obrázkov sme postupne nainštalovali tri kamery:
- na streche rozhrania budov A a C,
- na streche rozhrania budov A a B,
- v priestoroch Sfinxu, kde ďakujeme doc. Eve Hladkej za možnosť realizácie a spoluprácu.
Kamery zbierali (a naďalej zbierajú) snímky JPEG zo scenérie stavby, s rozlíšením 1920x1080, a to každú minútu (denne asi 0.8 GB dát na jednu kameru). Pomerne vysoká frekvencia zberu bola užitočná hlavne vo fáze demolácie, kde sa veci dejú často veľmi náhle („sú déčka… a už nie sú déčka.“). Pre porovnanie, za 2012–2014 sme realizovali zber snímok každých 5 minút, a to v rozlíšení 800x264.
Video pokrýva dni 6. 1. až 9. 2. a má šesť minút. Zrýchlenie (hoci ide o 3600x) je relatívne malé a dĺžka videa je i pri 60 FPS pomerne veľká, ale problémom je, že demolácia postupovala často dosť skokovo a vizuálne výrazné zmeny sa udejú bežne i v priebehu jedinej sekundy tohto videa. V zásade tu ešte bola možnosť regulovať toto viac dynamicky, ale to by bolo prácnejšie a zrejme i subjektívnejšie, takže sme zostali pri videu s konštantným zrýchlením.
Technické riešenie zberu snímok, resp. kamier
V prípade dvoch kamier na budove FI ide o celkom štandardnú realizáciu, keďže unix@fi spravuje aj kamery na FI. Navyše bolo len zabezpečenie ukladania snímok cez API kamery, prostredníctvom cronu, vrátane upozornenia v prípade zlyhanie uloženia.
Realizačne o čosi zaujímavejšou je kamera vo Sfinxe, kde bolo nutné riešiť jej externosť voči sieti FI. To sme vyriešili pomocou Raspberry Pi, ktoré je cez Wi-Fi pripojené k lokálnej sieti a cez staticky konfigurovanú drôtovú sieť (vrátane PoE injectora) má pripojenú kameru, z ktorej pravidelne sťahuje snímky. Následne sa tieto snímky raz za hodinu kopírujú k nám na FI a z lokálneho úložiska na RPi sa snímky staršie ako týždeň priebežne premazávajú.
Aby sme mali pre prípad potreby k RPi prístup i vzdialene, RPi udržuje SSH spojenie na FI s reverzným tunelom. Ako dobre odolným riešením sa preukázala byť výroba user systemd unit so zabezpečením štartu po boote systému (závislosť na používateľskom default.target
):
mkdir -p ~/.config/systemd/user
cat >~/.config/systemd/user/ssh-rev-tunnel.service <<EOF
[Unit]
Description=Maintain an SSH connection to FI with a reverse tunnel allowing access to this RPi
After=network-online.target
Wants=network-online.target
[Service]
# enable keepalive on the connection
# also make sure it fails if the reverse tunnel fails to establish
ExecStart=/usr/bin/ssh fi-node -o ServerAliveCountMax=5 -o ServerAliveInterval=60 -N \
-o ExitOnForwardFailure=yes -R XXX::127.0.0.1:22
# for resilience, attempt to restart the unit indefinitely
Restart=always
RestartSec=60
[Install]
WantedBy=default.target
EOF
# load the new unit from the filesystem
systemctl --user daemon-reload
# enable and start the new unit
systemctl --user enable --now ssh-rev-tunnel.service
Nie úplne triviálny, ale kľúčový krok, ktorý zabezpečí rezilienciu tohto riešenia nielen v prípade výpadku internetového pripojenia, ale i v prípade výpadku napájania (kamera i RPi po jeho obnove naštartujú automaticky), je umožnenie, aby sa po štarte systému hneď spustil používateľský cieľ default
. Inak dôjde k jeho spusteniu (a vytvoreniu prístupového tunela) len po prihlásení sa používateľa k systému:
loginctl enable-linger $USER
Chvíľu sme zvažovali i autossh, ale veľkej časti vecí okolo systemd by sme sa i tak nevyhli, takže autossh by v tomto kontexte nemal väčší prínos.
Medzi ďalšie praktické opatrenia potom patrí kontrola čerstvosti a veľkosti záznamov (už na infraštruktúre FI), a detekcia funkčnosti reverzného tunela.
Výroba časozberného videa
Čo sa týka výroby časozberného videa, prvotným problémom/rozhodnutím bolo, ktoré všetky snímky do časozberného videa zahrnúť. Demolačné práce prebiehali odhadom medzi 07:00 a 18:00. Do tohto však ešte vstupuje otravnosť v podobe krátkeho trvania dňa v januári, čo je mierne rušivé, no nejaké činnosti sa diali i po zotmení a nechceli sme ich vynechať.
„Surové“ video sme zo snímkov vyrobili pomocou osvedčeného nástroja FFmpeg. Vyrobili sme si najprv súbor s názvami súborov (máme ich uložené ako CAM-NAME/YYYY-mm-dd/HHMM.jpg
):
find CAM-NAME -not -empty -name '*.jpg' -exec sh -c \
'T=`basename {} .jpg`; test "$T" -ge 0700 -a "$T" -le 1800 && echo file {}' ';' \
| sort > in.txt
A následne sme z nich nechali vyrobiť video kódované pomocou H.264, kde sme teda navyše vynútili ešte formát pixelov yuv420p namiesto implicitného yuv444, keďže ten Firefox nepodporuje:
ffmpeg -f concat -r 60 -i in.txt -r 60 -c:v libx264 -pix_fmt yuv420p -crf 26 CAM-NAME.mp4
Nasledovali ešte technickejšie úpravy súvisiace s pridaním riadka s časovou značkou a spájaním videí z viacerých kamier. Vzhľadom na postupné osadenie jednotlivých kamier sme pre túto časť procesu použili interaktívnejšie Kdenlive.