USB kamera képkészítés parancssorból, időzítve Windows 10-en (timelapse parancssorból)

Jbsiu, CC BY-SA 4.0 , via Wikimedia Commons

A timelapse a világ legegyszerűbb dolga – elvileg. X időnként kérek egy fotót. A Windows 10 sok minden, de nem nevezhető a világ legegyszerűbb dolgának – mégis meglepő, hogy van amit faék egyszerűséggel meg lehet oldani.

A CommandCam egy 2012-es fejlesztésű open source program. Sok mindent nem csinál, csak lő egy fotót a default, vagy a paraméterként megadott kamerával, az elkészült képet pedig elmenti vagy egy default file-ba, vagy paraméterként megadom neki a file nevét. Két gépen próbáltam, az egyik a 2020-as HP Envy x360 beépített kamerája volt, a másik egy PC, amin a 10+ éves Logitech kamerám ül. Mindkettőt felismerte és használni tudta.

A következő körben kitaláltam, hogy timestamppel készítsen nekem képeket, ez linuxban tök egyszerű:

#/bin/bash
now=$(date +"%Y%m%d_%H%M%S")
echo "Filename : cc_$now.bmp"

Windowsban se sokkal bonyolultabb, de itt belefutottam abba, hogy nem tudtam a date parancs outputját formázni, ami viszont a helyi beállításoktól függ. Elég ciki, hogy soha nem gondoltak arra, hogy batch file-ban az ember ilyesmit akar csinálni – legalábbis azt sejtem, hogy a date parancs még az MS-DOS-ból maradt ránk.

echo off
set ToDaysDate=%date:~6,4%%date:~3,2%%date:~0,2%
set CUR_NN=%time:~3,2%
set CUR_SS=%time:~6,2%
set CUR_MS=%time:~9,2%
set SUBFILENAME=%ToDaysDate%-%CUR_HH%%CUR_NN%%CUR_SS%
CommandCam.exe /filename cc_%SUBFILENAME%.bmp /quiet

A fenti parancs egy “cc_20201221-203915.bmp” képet generál az egyik gépen. A másik gépen kicsit alakítani kellett a substringeken, YMMV, úgyhogy nem pakolom ide, a fenti részletből ki lehet indulni.

A következő feladat egy crontab -e windowsos megfelelője lenne, lehetőle gui és interaktivitás nélkül.

Linuxon ez a (crontab -l 2>/dev/null; echo "*/5 * * * * /path/to/job -with args") | crontab - meghívásával történhet, a Windowson meglepő módon egy csöppet sem komplikáltabb, csak ki kell adni parancssorból a schtasks /create /tn "MyTask" /sc minute /mo 5 /tr "path/to/batch" parancsot, és szintén öt percenként fogja hívogatni a batch file-t.

Az eredmény annyira nem szép, mert 5 percenként meg fog jelenni a cmd ablak, de működőképes. Sunyiban fotózni viszont nem lehet vele.

A következő lépésként gondoltam az idő múlását jelezni azzal, hogy a 90-as évek kameráihoz hasonlóan beleégetem a képbe, hogy mikor készült. Ehhez az ImageMagic hordozható verzióját töltöttem le a Windows-ra. A montage.exe-t a CommandCam mellé másoltam, kiválasztottam a nekem tetsző legegyszerűbb feliratot, és a fenti batch fileba illesztettem a montage.exe -label %SUBFILENAME% cc_%SUBFILENAME%.bmp -geometry +0+0 tl_%SUBFILENAME%.bmp Az ImageMagic egyébként opensource program és Linux, Windows MacOSX, iOS, Android és más rendszereken fut. Képmachinálás svájcibicskája, ha még nem ismerted, szinte szégyen erre az egyszerű dologra használni.

Az utolsó lépés nem a batch file része, hanem utólag követem el, amikor a képeket mozgásban akarom látni. Az ffmpeg.exe program az ImageMagic-nek is része, úgyhogy nem kellett külön megszereznem (amúgy se, mert minden gépemen van mplayer). Az ffmpeg-et nagyon szépen fel lehet paraméterezni linux alatt, Windowson viszont megszorításokkal csak. Azaz hiába van nekem timestamp a filenévben, neki counter kell.

@echo off
setlocal enabledelayedexpansion
set "count=10000"
for /f "delims=" %%f in ('dir /b tl_.bmp') do (
ren %%f tc_!count!.bmp
set /a count+=1
)

Több út is vezet Rómába, az egyik a kedvenc Total Commanderrel történik. A másik a fenti batch file-lal, ahol a counter 10.000-től kezdődik – percenkénti felvétellel naponta max 1440 kép készül, jó lesz az! Itt kezdtem elveszíteni a türelmemet, úgyhogy annyira hagytam quick and dirty-ben, amennyire a működőképesség engedte. (Biztosra veszem, hogy hamarosan hagyni fogom, hogy egy hétig gyüljön a cucc, lesz 10001 kép, aztán nekem lőttek, és facebookon fogm szidni azt a hülyét, aki kitalálta, hogy jó lesz az!)

A fenti scripttel nem kellett a leading zeroval szívnom, ami Windowson nincs, esetleg powershellben, vagy ha nagyon akarod, akkor van rá egy külön batch file. Itt egyébként elkezdtem azon gondolkozni, hogy ennyi idő alatt csináltam volna egy mini java progit, minek akarok erőszakot tenni a batch-en, ha a batch nem akarja, illetve eszmbe jutott az is, hogy Windows alá is lehet bash shellt biggyeszteni. Bezzeg abban.
A növekvő számsorrenddel rendezett csodára aztán ráeresztettem az ffmpeg -r 4 -i tl_1%04d.bmp -start_number 10000 -b:v 20M output.mp4 parancsot, és már enyém is volt a mennyei manna, azaz a pár megabyte-os filmecske, amiben röpke 48 másodperc alatt nézhettem meg alig egy nap képeit.

Tuningolási lehetőség van, pl. motion detection, de azért nehogy már a nyúl vigye a vadászpuskát… jó lesz ez így!