Portál AbcLinuxu, 30. dubna 2025 14:53
Asi znáte takové ty záběry rychle letících mraků, rozkvétajících kytiček, hnijícího jídla atd. Tomu se říká časosběr, protože sbíráme snímky v průběhu delšího času. Vytváří se tak, že kameru nebo foťák umístíme na stativ (rukou by to nešlo) a v pravidelných intervalech děláme fotky. Ty pak poskládáme za sebou třeba rychlostí 25 snímků za sekundu nebo rychleji, pokud chceme vyšší kvalitu, a uděláme z nich video.
Dá se použít třeba zrcadlovka, která má vstup pro dálkové ovládání (které budeme emulovat pomocí nějakého toho Atmelu, ESP32, RISC-V atd.) či kompaktní foťák ovládaný přes USB. Dneska si ale ukážeme, jak tohle udělat s webkamerou - což může být ta běžná spotřební, kterou teď asi všichni používáte na videokonference, nebo nějaká "průmyslovější" třeba i s C-mount výměnnými objektivy, která má ale stejné rozhraní - hardwarově UVC (USB video device class) a v GNU/Linuxu je to Video4Linux (v4l2, /dev/video*
).
Po připojení webkamery k USB si o ní můžeme zjistit základní informace:
dmesg -H | grep uvc | tail ls -l /dev/video* v4l2-ctl --all
Zobrazení živého náhledu - asi nejprimitivnější způsob je tento:
vlc v4l2:///dev/video0
problém je tu zpoždění (viz níže) způsobené tím, že VLC používá cache/buffer, což se nám ale při náhledu živého videa vůbec nehodí. Výhoda tohoto přístupu naopak je, že tu máme GUI pro nastavení kamery: Nástroje / Efekty a filtry / Ovládání v4l2 - záleží na konkrétní kameře, co tam jde nastavit (vyvážení bílé, expozice, zaostření atd.).
Uložení jednoho nebo několika snímků pomocí ffmpeg
:
ffmpeg -f video4linux2 -s 1920x1080 -i /dev/video0 -ss 0:0:2 -frames 3 "%03d.jpeg";
Parametrem -frames
zadáváme počet snímků, které chceme najednou vyfotit. Do názvu je potřeba přidat ještě třeba datum/čas nebo soubory následně někam přesouvat, aby nedocházelo k jejich přepisu. Nevýhoda je v tom, že když budeme tenhle příkaz volat v cyklu, bude se kamera pokaždé otevírat a zavírat (myslím tím softwarově) a někdy se pak může "unavit" a přestat fungovat - takže pak po několika hodinách nebo dni přijdeme a zjistíme, že se nám udělalo jen pár fotek a pak už to jen logovalo chyby (to se mi fakt stalo). Asi by to šlo nějak ošetřit, chyby detekovat a přidat případný reset USB zařízení... ale víc se mi osvědčil následující přístupu.
Použijeme přehrávač mpv:
mpv --no-cache --untimed /dev/video0 --input-ipc-server=mpv
díky tomu vidíme okno s živým náhledem videa, takže můžeme kameru hezky zaměřit a i průběžně sledovat, jestli je vše v pořádku. Parametry --no-cache
a --untimed
nám zajistí, že video bude téměř v reálném čase (nějaké minimální zpoždění tam je, ale je to dost dobré). A poslední parametr řekne mpv, aby vytvořil unixový soket s daným názvem. Přes tento zvláštní soubor pak můžeme přehrávači zadávat příkazy. Snímky bychom mohli vytvářet i klávesovou zkratkou "s", ale přes ten soket je to lepší.
echo "screenshot-to-file \"$(date --iso-8601=ns).jpeg\"" | socat - ./mpv
Tenhle příkaz můžeme volat v cyklu a snímat fotky pro náš časosběr:
while true; do ...; sleep 60; done
Pokud tam nepotřebujeme mít datum, tak stačí:
for ((n=1;;n++)); do echo "screenshot-to-file $n.jpeg" | socat - ./mpv; sleep 60; done
Kamera se otevře jen jednou na začátku a mpv ji celou dobu drží (a zároveň zobrazuje okno s náhledem). Jen jsem nepřišla na to, jak mpv přimět, aby při ukončení udělal unlink()
toho soketu, takže ho musím mazat ručně, ale to je detail.
Mimochodem, přehrávač ukončíme pomocí klávesy "q" a nekonečný cyklus pomocí Ctrl+C.
Z té hromady obrázků pak vyrobíme video příkazem:
ffmpeg -framerate 25 -i '%d.jpeg' -vf setsar=1 -c:v libx265 -crf 15 -preset ultrafast -pix_fmt yuv444p -c:a copy video.mkv
Dá se to ještě všelijak vylepšovat, ale jako základ si myslím, že to stačí. Doufám, že vám to k něčemu bude a že se v diskusi pochlubíte se svojí tvorbou
P.S. Tento článek původně vyšel na Farmě Trollí hnízdo (dostupné přes Tor): Časosběrná videa pomocí webkamery, v4l2, mpv a ffmpeg.
Tiskni
Sdílej:
supr blogísek :D ;D
btw ten onion link je asi blbě protože tam torem nejde vlízt
supr blogísek :D ;D
Díky
btw ten onion link je asi blbě protože tam torem nejde vlízt
Teď jsem to zkoušela a funguje mi to. Jiné stránky na Toru ti fungují?
Teď jsem to zkoušela a funguje mi to. Jiné stránky na Toru ti fungují?
z tor browseru na android mobilu se tam dostanu ale tady mi to vrací todlecto :O :O
Invalid Onionsite Address The provided onionsite address is invalid. Please check that you entered it correctly. Details: 0xF6 — The provided .onion address is invalid. This error is returned due to one of the following reasons: the address checksum doesn't match, the ed25519 public key is invalid, or the encoding is invalid.
dělá to i po uplným vypnutí zapnutí torbrowseru
dělá mi to jenom v torbrowseru na desktopu a si myslim že by to mohlo bejt verzí toru :O :O
když jakoby udělám
torsocks curl http://xaqbcbskm7otauau.onion/t/vitejte-na-farme-trolli-hnizdo/7
tak se tam dostanu protože tam má debian starou verzi 0.4.5.10 toru
starou verzi mam i na mobílku ale tor browser má vod 8mýho listopadu verzi 4.6.8 hele :O :O
nefungujou jenom ty starý v2
v3 fungujou
In September 2020, Tor started warning onion service operators and clients that v2 will be deprecated and obsolete in version 0.4.6. Tor Browser started warning users in June, 2021.
In July 2021, 0.4.6 Tor will no longer support v2 and support will be removed from the code base.
In October 2021, we will release new Tor client stable versions for all supported series that will disable v2.
Jen jsem nepřišla na to, jak mpv přimět, aby při ukončení udělal unlink() toho soketu, takže ho musím mazat ručně, ale to je detail.Žeby?
mpv --no-cache --untimed /dev/video0 --input-ipc-server=mpv; rm mpv
Mimochodem, přehrávač ukončíme pomocí klávesy "q" a nekonečný cyklus pomocí Ctrl+C.Tak sa dá:
for ((n=1;;n++)); do if [ -e mpv ]; then echo "screenshot-to-file $n.jpeg" | socat - ./mpv; else break; fi; sleep 60; donealebo
for ((n=1;;n++)); do echo "screenshot-to-file $n.jpeg" | socat - ./mpv || break; sleep 60; done
for ((n=1;;n++)); do echo "screenshot-to-file $n.jpeg" | socat - ./mpv; sleep 60; doneje lepšie:
while [ 1 ]; do echo "screenshot-to-file $n.jpeg"; sleep 60; done | socat - ./mpv
ffmpeg -use_wallclock_as_timestamps 1 -f mjpeg -i 'http://217.197.157.7:7070/axis-cgi/mjpg/video.cgi?camera=1&resolution=1024x768&fps=2&compression=10' -c:v libx264 -r 60 -vf "setpts=0.03333*PTS" kmcam-x30.aviTakto se to nahrálo 30x zrychleně. Když jsem se na to chtěl podívat normální pomalou rychlostí, bylo potřeba to zpomalit přehrávačem.
mpv --framedrop=no --speed=0.033 kmcam-x30.aviDneska už ona webkamera nevímproč nejede.
da se nejak udelat i opacny postup, tj. pustim video a neco z toho vytvori zarizeni /dev/video1?
pomocí v4l2loopback třeba hele ;D
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.