Webcam zonder webcam
Webcam of TV kaart
Slechts een handvol webcams zijn ondersteund onder Linux, dus moet je
controleren of een webcam met Linux werkt of niet.
Eigenaars van een TV kaart en een video camera hebben niet zoveel
problemen.
Maar ook zonder camera zijn veel leuke dingen mogelijk, zoals het streamen
van videos over het netwerk of zelfs TV programma's.
Zou niet het niet leuk zijn om je nieuwste vakantie video via Internet aan
buitenlandse kennissen te laten zien (mits voldoende bandbreedte).
Op je LAN kun je ieder geval TV kijken via een webbrowser op een PC zonder
TV kaart.
De Software
Het gebruikte software backend is het programma bttvgrap, versie
0.15.5 (te downloaden op
http://moes.pmnet.uni-oldenburg.de/bttvgrab/).
Dit programma is eenvoudig te bedienen en kan gestart worden vanaf de
console. Het is dus ideaal voor gebruik via scripts of andere programma's.
Na het uitpakken van het programma naar de /tmp directory met:
>> tar zxvf bttvgrab-0.15.5.tar.gz -C /tmp/volstaan de drie commando's:
>> cd /tmp/bttvgrab-0.15.5/ >> ./configure >> makeom het programma te compileren. Daarna kopieer de volledige directory naar /usr/local:
>> cp /tmp/bttvgrab-0.15.5/ /usr/local/(make install is af te raden omdat we bttvgrab in een script willen gebruiken en we de bestanden niet over het hele systeem willen uitsmeren.)
Als je het actuele TV scherm wilt "grabben", gebruik je een commando met het formaat (uitgevoerd in /usr/local/bttvgrab-0.15.10/) als:
>> bttvgrab -f webcam:/tmp/bttvgrab.jpg -s <sleeptime> -w <width> -o jpg -QSLEEPTIME zet het interval waarop wordt gewacht totdat het volgende TV beeld wordt opgeslagen. Dit is afhankelijk van het "object" dat wilt opnemen. Voor je vissen zou een waarde van 5 of 10 seconden voldoende moeten zijn.
WIDTH stelt de grootte van de afbeelding in en zou een waarde tussen 32 en 768 moeten zijn.
De overige opties zijn voor:
-f webcam:/tmp/bttvgrab slaat de opgenomen afbeelding op met deze bestandsnaam. -o jpg maakt afbeeldingen in het JPEG formaat en -Q schakelt het TV geluid uit.
Een goede aanroep zou zijn:
>> bttvgrab -f webcam:/tmp/bttvgrab.jpg -s 5 -w 640 -o jpg -QHet programma reageert dan met de volgende tekst:
| Uitvoer: bttvgrab |
+-< bttvgrab 0.15.10 [2000-03-21] (v4l) by J. Walter/A. Kopacz >---------------+ | | | | |------------------------------------------------------------------------------| | | | Image Nr.: 8 Time: 0:0.43 | | FPS: 0.2 (0.2) Frames lost: 11 | | Image size: 640x480 | | | | Status: Working... | | | |------------------------------------------------------------------------------| | | | | | Keys: Q - Quit | | P - Pause | | S - Sync HDDs | | Grabbing into: /tmp/image-new [19] | | | | | | | | | | | +-----------------------------< http://moes.pmnet.uni-oldenburg.de/bttvgrab/ >-+ |
Een toenemend Image Nr. geeft aan dat alles goed werkt. Verder kun je zien dat het programma het bestand /tmp/image-new maakt, terwijl bttvgrab.jpg een link is naar dit bestand.
Naar het Web...
Tot nu toe hebben een reguliere opname van de actuele afbeelding. In de volgende setup geven we web-gebruikers toegang tot deze afbeelding.
Daarvoor maken we een nieuwe directory op de webserver (we gaan er vanuit dat de hoofddirectory voor de webserver /usr/local/httpd is - daar is het in de SuSE distributie).
Eerst maak je de directory webcam waarin alle bestanden worden geplaatst.
>> mkdir /usr/local/httpd/htdocs/webcam
De eenvoudigste manier om de actuele afbeelding van bttvgrab op de webpagina te laten verschijnen is een meta-tag.
<meta http-equiv="refresh" content="5">Dit herlaadt de pagina iedere 5 seconden. Iedere keer dat de pagina opnieuw wordt geladen, wordt de afbeelding ook herladen.
| webcam.html |
<HTML><HEAD><TITLE>bttvgrab WebCam</TITLE></HEAD>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="refresh" content="5"> <!-- Hier stel je het interval in -->
</HEAD>
<BODY BGCOLOR="black" TEXT="black" LINK="blue" VLINK="blue" ALINK="red">
<CENTER>
<P><IMG SRC="./webgrab.jpg" ALT="-bttvgrab WebCam Picture-">
<P>
</BODY></HTML>
|
Dit script laat bestand
/usr/local/httpd/htdocs/webcam/webgrab.jpg na iedere verversing
zien.
Natuurlijk dien je bttvgrab met een iets andere optie aan te
roepen. Het is vooral belangrijk dat de refresh-rate van de webpagina en
bttvgrap identiek zijn, anders wordt de server te zwaar beladen.
>> bttvgrab -f webcam:/usr/local/httpd/htdocs/webcam/webgrab.jpg -s 1 -w 640 -o jpg -QDe pagina kun je zien op http://localhost/webcam/webcam.html.
Zoals je kunt zien is deze manier van verversen niet erg prettig. Voor
iedere verversing moet de afbeelding opnieuw worden opgebouwd en het
geknipper gaat je al snel op de zenuwen werken.
Het zou veel beter zijn als de pagina zou blijven en alleen de afbeelding
regelmatig ververst werd.
Server-Push
Ook deze optie wordt door moderne browsers ondersteund en staat bekend als
server push.
Hiervoor moet je weer werk investeren, maar het is niet zo heel veel.
De benodigde HTML pagina zou er ongeveer zo uit moeten zien:
| server-push.html |
<pre> <HTML><HEAD><TITLE>bttvgrab WebCam</TITLE></HEAD> </HEAD> <BODY BGCOLOR="black" TEXT="white" LINK="blue" VLINK="blue" ALINK="red"> <CENTER> Text <hr> <P><IMG SRC="./cgi-bin/nph-webgrab.cgi/0.gif" ALT="-bttvgrab WebCam Picture-"> <P> </BODY></HTML> </pre> |
en heeft slechts een taak: de afbeelding weergeven. De image tag <IMG
SRC="..."> verwijst niet naar afbeeldingsbestand, maar naar een CGI
script dat zorgt voor het streamen van de afbeelding.
Het script zou er als volgt uit moeten zien en zich bevinden in de
cgi-bin directory in de webcam directory.
| cgi-bin/nph-webgrab.cgi |
#!/usr/bin/perl
print "HTTP/1.0 200 Document follows\n";
print "Content-type: multipart/x-mixed-replace;boundary=goober\n\n";
while(true){
print "\n--goober\n";
print "Content-type: image/gif\n\n";
open(IN, "../webgrab.jpg");
while (read(IN, $buffer, 4096)){
print $buffer;
}
close("../webgrab.jpg");
#sleep(1);
}
print "\n--goober--\n";
exit 0;
|
Belangrijk hierbij is dat de naam van het script begint met de letters
nph. Dit verteld de browser dat het geen cache moet gebruiken.
Als de browser de data-stroom zou cachen, kan het gebeuren dat er korte
onderbrekingen optreden in de weergave van de afbeelding en dat dat er
veel afbeeldingen in een korte tijd langskomen.
Het uitschakelen van de cache van de browser dwingt ons om andere delen
van het HTTP protocol te gebruiken die we niet expliciet nodig hebben.
Daarom hebben we
print "HTTP/1.0 200 Document follows\n";
print "Content-type: multipart/x-mixed-replace;boundary=goober\n\n";
nodig.
De regel
#sleep(1);zet het interval in seconden waarna de afbeelding wordt ververst. In de huidige instelling is deze regel uitgeschakeld en kunnen de afbeeldingen zo snel als het netwerk het toestaat worden verzonden.
Maar dit is alleen in je lokale netwerk aan te raden. Als je de afbeelding op Internet wilt zetten, zou je de regel moet activeren en een nummer opgeven dat vergelijkbaar is met degene die je gebruikt voor bttvgrab.
Vervolgens vertel je Apache dat er een CGI script in de
webcam/cgi-bin directory staat.
Daarvoor voeg je de volgende entry toe aan het bestand
/etc/httpd/srm.conf:
| File /etc/httpd/srm.conf |
# ScriptAlias: This controls which directories contain server scripts. # Format: ScriptAlias fakename realname ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/" #De volgende regel moet worden toegevoegd! ScriptAlias /webcam/cgi-bin/ "/usr/local/httpd/htdocs/webcam/cgi-bin/" |
Dan herstart je de webserver (met SuSE):
>> /sbin/init.d/apache restartNu zou alles klaar moeten zijn en kun je de website met de server push techniek uitproberen.
Daarvoor start je bttvgrab (om de mogelijkheden te laten zien is de sleep-time uitgeschakeld)
>> bttvgrab -f webcam:/usr/local/httpd/htdocs/webcam/webgrab.jpg -w 200 -o jpg -Qen ga je naar http://localhost/webcam/server-push.html.
Het verbaasde me hoe soepel de videos in de browser lopen. Aan de kant heb
je een erg hoge CPU load.
Om je eigen webcam te ondersteunen, stel je een sleeping-time in
bttvgrab en nph-webgrab.cgi die een beetje nuttig zijn.
Overzicht
Hoe gebruik je deze techniek als een webcam?
Heel makkelijk. Je sluit je camcorder aan op de TV kaart of video recorder
en deze op de TV kaart.
Deze webcam-vervangen is alleen bruikbaar als je al en video camera en een
VCR bezit. Het zou te kostbaar worden om deze te kopen als vervanging voor
een webcam.
Maar het is een interessante en goedkope manier als je geen nieuwe
investeringen wilt doen.
Een ander probleem is dat je geen programma hebt om de tuner van de TV
kaart in te stellen en er is geen andere manier om het kanaal te
veranderen.
Het instellen van het kanaal kan werken met set-tv uit het XawTV
pakket van Gerd Knorr.
Met een beetje handig programmeren zou het mogelijk moeten zijn om de
kanalen te veranderen via je website.
Voor de ervaren gebruiken raden we aan om de webcam automatisch bij het
inloggen bij je provider te starten via een entry in het bestand
/etc/ppp/ip-up.
Als je een permanente verbinding met het Internet hebt, kun je de webcam
ook bij het opstarten starten. Daarvoor kun je het beste een init script
gebruiken.
Een andere manier om de afbeelding van je camera op een website te plaatsen is met behulp van een Java applet. Met deze optie is mogelijk om het continue laden van de afbeelding te onderdrukken, en pas te laten weergeven als het volledig geladen is. Als je geïnteresseerd bent in een dergelijke oplossing, kijk dan in de Java documentatie: trefwoord ImageObserver.
Links:
| http://moes.pmnet.uni-oldenburg.de/bttvgrab/ | Homepage van het bttvgrab programma |