Portál AbcLinuxu, 12. června 2024 09:05

Linuxová webkamera

23. 12. 2005 | Jan Vondráček
Články - Linuxová webkamera  

Článek popisuje připojení kamerky k webovému serveru. Najdete v něm návod ke konfiguraci malé instalace linuxové distribuce i popis nastavení webserveru.

Co bylo na začátku

Kamarád si nainstaloval kameru a stavěl server podle www.iomojo.com. Toto řešení má nevýhody, protože je distribuce jednoúčelová a na dost starém základě. A také je na zbytečně velkém disku. Server se mi velice líbil, ale díky ořezané distribuci se nedá použít na nic jiného. A kromě toho Iomojo poskytuje služby, které mi přijdou zbytečné (třeba funkce fotoalba, chatu nebo hýbání s kamerou). A tak jsem se inspiroval a postavil si takový server na plné distribuci na mém oblíbeném Slackwaru. Pokud byste ale chtěli opravdu jen webkameru a distribuci ještě více ořezat, tak to také není problém, ukáži zhruba jak na to. I když je tedy otázka, zda by se nevyplatilo koupit rovnou kameru s ethernetovým rozhraním a integrovaným webserverem.

Co budeme potřebovat a jak to funguje

Vezmeme tedy standardní distribuci Linuxu; Slackware jsem zvolil jako svou distribuci také kvůli tomu, že po nainstalování zabírá nejméně místa (po naistalování serveru třeba jen 150 MB). Pro začátečníky připojím seznam nutných balíčků, protože jedním z velmi častých dotazů na mě je, co všechno vlastně potřebuji za balíčky, aby to chodilo, a kde vezmu ty, které nejsou součástí distribuce.

Všimněte si, že zde mám například uveden jak server Boa, který ovšem není součástí distribuce, tak i Apache, který součástí distribucí bývá. Je jasné, že na konec použijete jen jeden a je jen na vás, pro který se rozhodnete.

Boa web server jsem získal na stránkách www.linuxpackages.net, kde je slušný archiv různých programů ve formě balíčků pro Slackware. Program bttvgrab, který nám získává obrázky z kamery, je zase z rpmfind.net, kde byl jako rpm pro Mandrake. Ovšem lze ho převést pomocí konvertoru rpm2tgz a normálně nainstalovat. Jak vidíte, snažil jsem se vyhnout nutnosti vlastní kompilace a zdařilo se.

Pozastavím se u volby web serveru. Boa server je jednoduchý a hlavně malý webový server na zobrazování statických stránek, ale umí i CGI. Rozhodl jsem se ho použít právě z těchto důvodů. Jediné, co ale nemá, je autorizace jako Apache. PHP a další věci zde nejsou potřeba, ale je jen na vás, který ze serverů vám vyhovuje více. Nicméně já se v článku zmíním o obou. Pokud by někdo toužil po ukládání obrázků, které se právě snímají, také není problém, já to ukáži na Boa serveru pomocí CGI skriptu. Ale do detailů možností už opravdu zabíhat nebudu, protože pomocí CGI nebo PHP a dalších skriptovacích jazyků není problém obrázky posílat poštou a podobně. Fantazii se meze nekladou.

Jestli někdo použije jinou distribuci, třeba Fedoru či Mandrake, názvy balíčků budou podobné a závislosti za vás vyřeší zbytek problémů. Ovšem určitě se nedostanete na mnou avizovaných 150 MB. V případě instalace na flash budete balíčky ze seznamu potřebovat také, ale ne celé. Třeba z libungif potřebujete jen jednu knihovnu, tak proč instalovat celý balíček.

Jak to funguje

Jak ten server vlastně pracuje? Bttvgrab sype obrázky z kamery do jpg souboru, který se stále přepisuje. Samozřejmě není problém použít místo bttvgrabu xawtv či jiný program. Web server se na obrázek odkazuje a pomocí Javy se vytváří plynulý obraz. Já si k tomuto serveru přidal i teploměr a teplota se mi také zobrazuje na stránce.

Jak vidíte, teorie je snadná, a tak můžeme přistoupit k praxi. Budeme potřebovat počítač, stačí P120, ale pokud máte něco rychlejšího, je to lepší, protože obraz může mít pak větší rozlišení a bude plynulejší. RAM 64 MB stačí. Grabovací kartu jsem měl k dispozici AVER EZ Capture, ale je v podstatě fuk, co použijete, protože podstatné je, aby to Linux uměl ovládat a brát z toho obrázky. Co se týče výběru hardware, odkáži vás na dokumentační projekt linuxu a tam si najděte video4linux a hardware, který je podporován pro bttv a pro xawtv. Disk mám 800 MB, ale ukážeme si i způsob, jak kameru narvat i na 32 MB flash. Pro kartu, jakou jsem použil já, připojíte libovolnou kameru, která má výstup kompozitního videa. Výhoda je, že karta nám pro kameru poskytuje přímo i napájení, a tak ho nemusíme tahat externím zdrojem nebo přes stabilizátor z PC. Ovšem pozor na velikost napětí.

Zde se trochu vrátím. Spousta lidí bude asi chtít použít USB kameru. Já se zde o ní bohužel nezmíním, protože se mi žádnou nepodařilo rozchodit. Měl jsem půjčené asi 4, ale všechny chtěly modul sn9c102. Ten je ale psán dost divoce a vyžaduje určitá jádra, jinak nechodí. Ovšem v diskuzích a v popisu hardware na abclinuxu.cz bylo napsáno, že chodí. Proto také nemám vyzkoušeno, jestli chodí s bttvgrabem, ale xawtv jde použít stejně dobře a s tím chodí určitě. Příkaz, který bude grabovat, je pěkně popsán v dokumentaci. A jakmile získáme obraz do souboru, je další postup stejný. USB kamery mají ale také nevýhodu; nelze jejich signál přepínat, u nás se to dá sehnat třeba na www.papouch.com. U Papoucha, možná to dělá u nás i někdo jiný, seženete jak ten přepínač, tak i teploměr, kterému posíláte ASCII znak a on vám v ASCII odpoví. Je ale pro rozhraní RS485 a na RS232 potřebujete ještě převodník. Kompozitní videosignál lze tahat na mnohem delší vzdálenost, máme odzkoušeno asi 30 metrů. A jako zdroj může sloužit opravdu jakékoliv zařízení.

Stavba

Všechen ten HW si tedy sešijte do kupy a nainstalujte systém. Pro méně zkušenné uživatele vám může být pomocníkem můj starší článek na rootu Linux jako internetová gateway; berte jen začátek, kde je instalace popsána (vím, že by potřeboval zrevidovat, ale i já se učím :-) Na abclinuxu.cz vyšel seriál Inštalácia Slackware.

Pokud necháte spuštěný na Slackware hotplug, tak se vám karta při bootu najde sama a zavedou se k ní potřebné moduly. Na RedHatu 7, na kterém je postavena distribuce Iomojo, jsou ovšem potřeba zadat parametry do /etc/modules.conf, ovšem na Slackwaru se mi osvědčilo, aby si systém vše našel sám:

Linux video capture interface: v1.00
i2c-core.o: i2c core module
i2c-algo-bit.o: i2c bit algorithm module
bttv: driver version 0.7.107 loaded
bttv: using 4 buffers with 2080k (8320k total) for capture
bttv: Host bridge is Intel Corp. 430VX - 82437VX TVX [Triton VX]
bttv: Host bridge needs ETBF enabled.
bttv: Bt8xx card found (0).
bttv0: Bt878 (rev 2) at 00:0a.0, irq: 11, latency: 32, mmio: 0xe0000000
bttv0: using: BT878( *** UNKNOWN/GENERIC **) [card=0,autodetected]
bttv0: enabling ETBF (430FX/VP3 compatibilty)
i2c-core.o: adapter bt848 #0 registered as adapter 0.
bttv: readee error
bttv0: using tuner=-1
bttv0: i2c: checking for MSP34xx @ 0x80... not found
bttv0: i2c: checking for TDA9875 @ 0xb0... not found
bttv0: i2c: checking for TDA7432 @ 0x8a... not found
bttv0: registered device video0
bttv0: registered device vbi0

root@thovt:~# lsmod
Module                  Size  Used by    Not tainted
bttv                   94432   1 
i2c-algo-bit            6984   1  [bttv]
i2c-core               12740   0  [bttv i2c-algo-bit]
soundcore               3332   0  [bttv]
videodev                5664   3  [bttv]

Ale nelekejte se detekce trvá opravdu dost dlouho, klidně i 5 minut, ale jen při zavádění modulu. To bude ale jen při bootu systému, což asi nebude tak často. Pro parametry do modules.conf vás odkážu opět na tldp.org, kde je to velmi dobře popsáno. Detekce by pak měla proběhnout rychleji.

Pokud nám systém kartu vidí, a to ověříme tak, že se nám objeví v procu položka video (/proc/video/...), můžeme zkusit sejmout první obrázek. Program bttvgrab má spoustu parametrů týkajících se norem, ale mně se opět osvědčila automatika.

bttvgrab -b2 -w320 -W240 -ojpg -S1 -f webcam:/home/www/ramdisk/webcam.jpg -Q -dq &

Co se parametrů týče, podrobnosti nám poskytne dokumentace či manuálové stránky. Ale b je buffer, rozměry obrázku asi poznáte, formát je také jasný. S je kanál, Q bez zvuku a nakonec d. Parametr q vypne zobrazování statistiky grabování a dalších údajů. Když pustíte totiž bttvgrab bez parametrů objeví se vám okno s informacemi o počtu sejmutých snímků, datovém toku a podobně, které ovšem při provozu nebudeme potřebovat.

Zde udělám odbočku pro začátečníky, kterým se může stát, že jim program zařve, že mu chybí knihovna a co teď. Jednoduše si můžeme zjistit, které dynamické knihovny program vyžaduje a to takto:

root@thovt:~# ldd `which bttvgrab`
        libm.so.6 => /lib/libm.so.6 (0x40019000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x4003d000)
        libungif.so.4 => /usr/lib/libungif.so.4 (0x4008e000)
        libaa.so.1 => /usr/lib/libaa.so.1 (0x40096000)
        libncurses.so.5 => /lib/libncurses.so.5 (0x400af000)
        libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x400eb000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0x40108000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0x40117000)
        libc.so.6 => /lib/libc.so.6 (0x401de000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
        libslang.so.1 => /usr/lib/libslang.so.1 (0x40314000)
        libgpm.so.1 => /lib/libgpm.so.1 (0x40386000)
        libdl.so.2 => /lib/libdl.so.2 (0x4038c000)

A pokud programu nějaká dynamická knihovna chybí, napíše, že ji nenašel, a vy víte, co řešit. Slackware na svých stránkách spustil databázi, kde zadáte název souboru. Třeba libungif.so (nedávejte celé názvy včetně koncových čísel, ta se občas liší, protože jedna knihovna má několik linků) a vypadne vám balík, kde knihovna je. Než byla taková databáze spuštěna, prohledával jsem balíčky na CD skriptem, a tak zjišťoval, kde je knihovna obsažena. Bylo to dost zdlouhavé. Kdyby vám test knihoven prošel, ale program se přesto nespustil s odkazem na špatnou verzi GCC, je to tím, že jste ho brali třeba z rpm balíčku jiné distribuce a ta je kompilovaná novější verzí GCC. Také platí, že balíček ze Slackware 10.1 nechodí na systému Slackware 9.1 Použijte tedy starší verzi balíčku, nebo si budete muset zkompilovat svou. Nicméně verze, které jsou popsány na začátku v seznamu balíčků, spolu korektně chodí.

Pokud nám bttvgrab chodí, objeví se v adresáři, kam jsme ho nechali obrázek ukládat, následující soubory:

-rw-r--r--      3 Nov  2 16:48 format
-rw-r--r--   2218 Nov  2 19:28 image
-rw-r--r--      0 Nov  2 19:28 image-new
prw-r--r--      0 Nov  2 19:28 status|
prw-r--r--      0 Nov  2 19:28 status-lock|
lrwxrwxrwx     23 Nov  2 16:48 webcam.jpg -> /home/www/ramdisk/image

Výpis, řekl bych, nepotřebuje vysvětlení, ale soubor image je právě oním neustále se obnovujícím obrázkem z kamery. Jeho překopírováním pod novým jménem získáme fotku. Po ukončení programu (sestřelením přes kill) nám soubory zmizí. Pozor, někdy zůstanou a je nutno je smazat manuálně, jinak si bttvgrab myslí, že je již spuštěn. Grabování obrázku tedy spustíme jako proces na pozadí, já ho třeba mám v rc.local, aby se mi spustil sám po startu systému.

Ne náhodou se v příkladu můj soubor ukládá do adresáře ramdisk. Jde o to, že soubor se neustále přepisuje a disk je tedy stále aktivní, zapisuje dokolečka jeden soubor. A pokud budeme kameru rozcházet z flash, brzo bychom ji oddělali. Proto jsem vytvořil ramdisk, kam obrázek zapisuji. Při výpadku napájení mi navíc v adresáři nemohou zůstat zamykací soubory z výpisu, ramdisk se po výpadku napájení maže. Vytvoření ramdisku je triviální záležitost, Slackware má jeho podporu standardně zakompilovanou v jádře. A tak stačí zadat

mke2fs /dev/ram0
mount /dev/ram0 /home/www/ramdisk

a je hotovo. Samozřejmě musí adresář ramdisk už existovat, abychom k němu mohli nový disk připojit. Formátování ramdisku se musí přidat třeba do rc.local, aby se při startu vytvořil. A disk je hned ušetřen neustálého zápisu. Takovýto ramdisk je nutný pro chod systému z flash, kde adresáře, do kterých se při chodu systému zapisuje (jako /var a /tmp) nalinkují symbolické odkazy do ramdisku.

Webový server Boa

Začnu tím jednodušším serverem, Boa. Je mnohem snazší jej rozchodit, ale jeho možnosti jsou oproti Apachi dost omezené. Není tak výkonný, neumí autentizaci, omezování přístupu k adresářům bere podle práv na filesystému a ze skriptů podporuje jen CGI. Otázkou ale je, zda skutečně potřebujeme kanón jako je Apache.

Konfigurace je v jednom souboru v /etc/boa/boa.conf a já z ní vytáhnu pouze pár řádek.

Port 80 Nastavení portu, na kterém má server naslouchat.
User nobody
Group nobody
Uživatel a skupina, pod kterou má server běžet.
#ErrorLog /var/log/boa/error_log
ErrorLog /dev/null
AccessLog /dev/null
Po úspěšném rozchození logování vypínám.
ServerName thovt.vetrnik.net
DocumentRoot /home/www Cesta k výchozímu HTML souboru, tj. kde máte vaše HTML stránky.
DirectoryIndex index.html Jaký soubor z document rootu server poskytne, když nezadáte konkrétní soubor.
KeepAliveMax 1000
KeepAliveTimeout 10
Server umí HTTP 1.1 takže tento parametr nám říká, kolik souborů na jedno spojení může poskytnout, a timeout je čas, kdy server spojení ukončí, jestli nemáme žádné další dotazy.
MimeTypes /etc/mime.types Cesta k MIME typům souborů; zde pozor, tento soubor není součástí balíku a musíte použít libovolný jiný, třeba z Apache.
ScriptAlias /cgi-bin/ /home/www/cgi-bin/ Alias k cestě k CGI skriptům.

S dalšími parametry nemusíte hýbat, ale server umí i virtuální servery atd. Pak už stačí do /home/www nahrát pokusný index.html a server spustit. Na Slackwaru /etc/rc.boa start. Pozor, startovací skripty Slackwaru s tímto serverem nepočítají jako třeba s Apachem, a proto je nutno spouštění třeba do rc.local dopsat manuálně.

Příště

V druhém a závěrečném díle bude popsána konfigurace Apache, vytvoření souboru s hesly pro autorizovaný přístup, příprava prezentační stránky a také instalace Linuxu na flash.

Související články

Linuxová webkamera - 2
Inštalácia Slackware
Jak vytvořit vlastní DVD pod Linuxem
Zajímavosti ze světa Linuxu - 5
Převod filmu na DVD
Na co se často ptáme: MPlayer

Odkazy a zdroje

www.iomojo.com

Další články z této rubriky

Linuxové foto novinky: nejen darktable 2.2 a Rawtherapee 5
Linuxové foto novinky: GIMP konečně prolomil 8bit mez
DLNA v praxi: Android
Technologie DLNA na Linuxu v praxi – PS3 Media Server
Technologie DLNA na Linuxu v praxi – 1

Diskuse k tomuto článku

23.12.2005 08:34 Martin
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
Pekny clanek :)
23.12.2005 08:50 ich
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
V clanku pises: " Pro kartu, jakou jsem použil já, připojíte libovolnou kameru, která má výstup kompozitního videa" To je aka? Klasicka web kamerka? Aku kameru si pouzit ty? Sorry, ale nemam v tom moc jasno.
23.12.2005 09:03 lukas.ramlich | skóre: 3 | blog: linux_a_ja
Rozbalit Rozbalit vše Re: Linuxová webkamera
To je prakticky každá kamera. Dokonce jde použít i stará VHS třeba s rozsekanou mechanikou - tu najdeš u popelnice. Obraz budeš mít pořád kvalitnější než s nějakou novou ethernet CMOS kamerou. CMOS rozhodně nekupovat! Jedině CCD.
23.12.2005 11:32 kavol | skóre: 28
Rozbalit Rozbalit vše Re: Linuxová webkamera
CMOS rozhodně nekupovat! Jedině CCD.
hm, a to jako proč?

... škoda, že to před nákupem nikdo neřekl třeba mému kámošovi, spokojenému majiteli Canon EOS300D :-)
23.12.2005 11:42 kavol | skóre: 28
Rozbalit Rozbalit vše Re: Linuxová webkamera
Klasicka web kamerka?
ne, právěže ta ne ... normální videokamera(*) - jako laik poznáš "kompozitní video" podle toho, že se do televize (do videa) připojuje přes žlutý konektor cinch (američani říkají RCA) - viz

(*) kolega výše zmiňuje VHS - ehm, VHS je způsob záznamu, to se způsobem přenosu nemá až tak moc do činění, ale je fakt, že pro VHS (VHS-c) zařízení je použití kompozitního videa typické
23.12.2005 11:47 kavol | skóre: 28
Rozbalit Rozbalit vše Re: Linuxová webkamera
VHS je způsob záznamu, to se způsobem přenosu nemá až tak moc do činění ...
ještě jednou: chtěl jsem názorně říci, že kompozitní video používají např. kamery systému Sony Video8 (a stejný výstup se najde snad i na všech modelech Hi8 a Digital8)
23.12.2005 09:17 bhy | skóre: 35 | blog: bhyblog | brno
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
"Server umí HTML 1.1 ...." no nevím, školy nemám, ale nepatří tam spíš http?
Petr Břeň - IT služby
23.12.2005 11:50 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: Linuxová webkamera
patri.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
23.12.2005 10:32 Frank J. Tomes | skóre: 29 | Plzeň
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
Pod pojmem webkamera si představuji něco jiného, pěkně jsem se nechal nadpisem nachytat :-(
[frank]$ uname -prs FreeBSD 4.11-RELEASE-p25 i386
23.12.2005 11:13 bhy | skóre: 35 | blog: bhyblog | brno
Rozbalit Rozbalit vše Re: Linuxová webkamera
přesně.. čekal jsem ty malinké USB webkamery. ty ke kterým většinou nejsou free ovladače :(
23.12.2005 10:45 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: rozhodit
Odpovědět | Sbalit | Link | Blokovat | Admin
Začnu tím jednodušším serverem, Boa. Je mnohem snazší jej rozhodit, ale jeho možnosti jsou oproti Apachi dost omezené.
Z kontextu věty mi připadá, že by tam mělo být spíš rozchodit. Pokud jsou jeho možnosti omezené a ještě je snadné jej rozhodit, tak bych ten server asi radši nepoužíval :-)
23.12.2005 11:03 0
Rozbalit Rozbalit vše Re: rozhodit
Boa patri do skupiny jednoduchych, rychlych a spolehlivych serveru. Cili rozchodi se snadno, rozhodi se tezko a je mnohem vykonejsi (zvladne mnohonasobne vic pozadavku za mnohonasobne mensi cas pri pouziti mnohanasobne mensich systemovych prostredku) nez apache.
23.12.2005 11:43 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: rozhodit
Pěkný překlep :-). Díky, opraveno.
23.12.2005 12:40 Lukáš Zapletal | skóre: 42 | blog: lzapův svět | Olomouc
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
Jako webserver mohu doporučit shttpd, je to jen jeden .c soubor :-) K dispozici je i Gentoo ebuild.
Later --- Lukáš Zapletal
23.12.2005 13:05 cartman | skóre: 22
Rozbalit Rozbalit vše fuuuuuuha
Odpovědět | Sbalit | Link | Blokovat | Admin
Tak som sa rozhodol ze si to naistalujem:
emerge bttvgrab
Calculating dependencies   
emerge: there are no ebuilds to satisfy "bttvgrab".
Zo officialnej stranky bttvgrab:
News:

06.05.2002:
    This project is now officially abandoned.
...
Download:

bttvgrab is available in source form only. With all that
 fast changing driver stuff, you should really compile it
 yourself. And really do patch the driver, you won't break
 anything with it, but you will profit from it when
 grabbing.

    * bttvgrab-0.15.10.tar.bz2, 664kb, 13.04.2000, source,
 for any video4linux driver 
Nemalo toto howto vyjst pred piatimi rokmi :)? Len zartujem... vpohode clanok.
24.12.2005 15:06 Zdeněk Štěpánek | skóre: 57 | blog: uz_mam_taky_blog | varnsdorf
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
Zdravim

Tesil jsem se na online kameru, pochopitelne ve svobodnem formatu ogg, ale bohuzel... Osobne jsem top sice rozchodil, ale P-III 550 na to proste nestaci ani omylem, bylo to video velikosti poskakujici postovni znamky.

Statickou obrazkovou kameru delam takhle, neni to ponekud jednodussi?
#!/bin/sh

/usr/local/bin/mplayer tv:// -tv driver=v4l2:input=1:width=768:height=576 -vf pp=lb -vo tga -ao null -frames 1
convert -quality 90 00000001.tga kamera.jpg
rm ./00000001.tga
rm ./00000002.tga
Vysledek muzete videt zde: http://www.gavanet.org:81/kamera/

Zdenek
www.pirati.cz - s piráty do parlamentu i jinam www.gavanet.org - czfree varnsdorf
30.4.2006 14:48 Rada | skóre: 14
Rozbalit Rozbalit vše Re: Linuxová webkamera
Odpovědět | Sbalit | Link | Blokovat | Admin
Narazil jsem na tenhle článek a zaujal mě. Je to něco, co jsem už dříve hledal a řešil. Zkoušel jsem popsaný postup, stejně tak jako postupy z diskuze pod článkem. Zajímalo by mě však, jak s využitím bttvgrab nebo mplayeru nastavit kanál TV karty. Momentálně nemám kameru a rád bych to vyzkoušel. Při zachytávání ale dostávám dokonale modrý obraz. Netušíte někdo jak na to - pokud to vůbec jde?

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.