LinuxNetMag
Webcam ohne Webcam
Archiv | Home
Inhalt
   
LinuxNetMag #5

  Software
 Aktuell
kurz vorgestellt
SuSE7.0 Testbericht
Mozilla Preview
 Applikationen
Videoschnittsystem
Windows X-Server
Windowmanager
  
 

Hardware

TV-Karte
Wheel-Mouse
Webcam selbstgebaut
LCD-Panel
  
 

Netzwerk

Web2Fax-Gateway
Apache mit SSI
Booten übers Netz
Webcam-Streaming
offline Mailingliste
Audio-Streaming
ISDN-Dial-In Server
empfehlenswerte Links
  
 Wissen
Abenteuer ReiserFS
Linux-Devices
LinuxExpo Brasilien
  
 

Sonstiges

Mailing-Liste
Gästebuch
Artikelliste
Unterstützen Sie uns !
zurück zur Hauptseite



Druckversion


  Webcam Webcams sind genauso beliebt, wie überflüssig. Nahezu alle neuen Kameras benutzen den USB-Port und ein proprietäres Protokoll, so daß Ihnen die Linux-Welt verschlossen bleibt. Wer trotzdem eine Webcam benutzen will, sollte es mal mit seiner TV-Karte versuchen.

Privatvorstellung

Nur eine handvoll Webcams werden unter Linux unterstützt, also sollte man sich vor dem Kauf genau informieren, ob die Webcam auch mit Linux funktioniert.
Besitzer einer TV-Karte und einer Video-Kamera haben da weniger Probleme.
Aber auch ohne Kamera lassen sich viele nette Dinge anstellen, wie das Streamen von Videos ins Netz oder einfach nur das Übertragen des aktuellen Fernsehprogramms in alle Welt.
Wäre es nicht schön, wenn man seinen Bekannten im Ausland sein neuestes Urlaubsvideo übers Netz präsentieren kann, genügend Bandbreite vorausgesetzt.
Zumindest im eigenen LAN ist es nun möglich, das aktuelle TV-Programm per Web-Browser anzuschauen, auch wenn der Rechner, an dem man gerade arbeitet, keine TV-Karte besitzt.

die Software

Als Software-Backend benutzen wir hier das Programm bttvgrab in der Version 0.15.5 (zu erhalten unter http://moes.pmnet.uni-oldenburg.de/bttvgrab/).
Dieses Programm zeichnet sich besonders durch seine einfache Steuerung aus, sowie durch die Fähigkeit, auch von der Konsole aus gestartet werden zu können. Daher ist es ideal zum Aufruf aus Skripten oder anderen Programmen geeignet.
Nach dem Entpacken des Programms ins /tmp-Verzeichnis

>> tar zxvf bttvgrab-0.15.5.tar.gz -C /tmp/
genügen die drei Befehle
>> cd /tmp/bttvgrab-0.15.5/
>> ./configure
>> make
zum Kompilieren des Programms. Danach kopieren wir das gesamte Verzeichnis nach /usr/local
>> cp /tmp/bttvgrab-0.15.5/ /usr/local/
(Ein make install ersparen wir uns, da bttvgrab sowieso nur aus einem Skript heraus aufgerufen wird und wir uns somit ein Verstreuen der Programmdateien über das gesamte System ersparen)

Will man nun das Grabben des aktuellen TV-Bildes starten, braucht man einen Aufruf des Programms in folgender Form (ausgeführt im Verzeichnis /usr/local/bttvgrab-0.15.10/)

>> bttvgrab -f webcam:/tmp/bttvgrab.jpg -s <sleeptime> -w <width> -o jpg -Q
SLEEPTIME gibt dabei an, in welchen Zeitabständen ein aktuelles TV-Bild aufgenommen werden soll. Der Wert hängt davon ab, was Sie mit Ihrer Webcam aufnehmen. Für Ihre Fische reicht bestimmt ein Wert von 5-10 Sekunden.
WIDTH stellt die Größe des erzeugten Bildes ein und sollte zwischen 32 und 768 liegen.
Die anderen Optionen haben folgende Bewandnis:
-f webcam:/tmp/bttvgrab bewirkt, daß die erzeugten Bilder unter diesem Dateinamen abgelegt werden. Mittels -o jpg werden die Bilder im JPEG-Format erzeugt, und die Option -Q verhindert die Aufnahme des TV-Tons.

Ein geeigneter Programmaufruf könnte deshalb folgendermaßen aussehen:

>> bttvgrab -f webcam:/tmp/bttvgrab.jpg -s 5 -w 640 -o jpg -Q
Das Programm begnügt sich daraufhin mit folgendem Text:

Ausgabe: 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/ >-+

Ein Ansteigen der Image Nr. zeigt uns an, daß alles ordnungsgemäß funktioniert. Außerdem sieht man, daß das Programm eigentlich die Datei /tmp/image-new erzeugt, während bttvgrab.jpg nur ein Verweis auf diese Datei darstellt.

ab ins Web...

Bisher erzeugen wir zwar schon in regelmäßigen Abständen die jeweils aktuellen Bilder, im nächsten Schritt müssen wir nun aber noch dem Web-Benutzer den Zugriff auf diese Bilder ermöglichen.

Dafür legen wir zunächst ein neues Verzeichnis auf dem Web-Server an (wir nehmen dabei an, daß das Hauptverzeichnis des Web-Servers unter /usr/local/httpd liegt - dort befindet er sich zumindest bei SuSE-Distributionen).

Zunächst erzeugen wir ein Verzeichnis webcam, in dem dann alle Dateien abgelegt werden.

>> mkdir /usr/local/httpd/htdocs/webcam

Die einfachste Form, ein aktuelles Bild von bttvgrab auf einer Web-Seite darzustellen, ist es, die Web-Seite mittels des Meta-Tags

 <meta http-equiv="refresh" content="5">
automatisch alle 5 Sekunden neu zu Laden. Bei jedem erneuten laden der Seite wird dann auch das aktuelle Bild dargestellt.

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 ist die Zeitdauer einzustellen -->
</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>

Das Skript zeigt dabei nach jedem erneuten Laden die Datei /usr/local/httpd/htdocs/webcam/webgrab.jpg an.
Natürlich muß dafür bttvgrab mit leicht geänderten Optionen aufgerufen werden. Besonders wichtig ist, daß die Refresh-Rate zwischen bttvgrab und der Web-Seite identisch sind, da ansonsten unnötige Server-Last erzeugt wird.

>> bttvgrab -f webcam:/usr/local/httpd/htdocs/webcam/webgrab.jpg -s 1 -w 640 -o jpg -Q
Unter http://localhost/webcam/webcam.html kann man nun die Seite besuchen.

Wie man sieht, ist das Verfahren, die Seite regelmäßig neu zu laden, nicht sonderlich angenehm anzuschauen. Bei jedem Neuladen muß auch das Bild neu aufgebaut werden, und es entsteht ein nerviges Flackern.
Viel angenehmer wäre es da, wenn die Seite immer gleich bleibt, und nur das Bild sich regelmäßig erneuert.

Server-Push

Auch dies ist mit modernen Browsern möglich und wird Server-Push genannt.
Allerdings benötigt man dafür etwas mehr Aufwand, der hält sich allerdings noch in Grenzen.

Die benötigte HTML-Seite sollte etwa folgendermaßen aussehen:

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>

Und ist nur dafür zuständig, ein Bild anzuzeigen. Allerdings verweist der Image-Tag <IMG SRC="..."> nicht auf eine Bilddatei, sondern auf ein CGI-Skript, welches für das Streaming des Bildes zuständig ist.
Das Skript sieht folgendermaßen aus und sollte in einem Verzeichnis cgi-bin unterhalb des Verzeichnisses webcam liegen.

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;

Wichtig hierbei ist, daß der Name des Skriptes mit den Buchstabe nph beginnt. Dies signalisiert dem Browser, daß er kein Caching ausführen soll.
Wenn dies nicht der Fall ist, und der Browser den Datenstrom zwischenspeichert (chached), dann kann es dazu kommen, daß zeitweilig kurze Pausen bei der Darstellung der Bilder entstehen und dann wiederrum viele Bilder in kurzer Zeitfolge gezeigt werden.
Da wir nun das Caching des Browsers ausgestellt haben, müssen wir uns auch um die Teile des HTTP-Protokolls kümmern, mit denen man sonst explizit nichts zu tun hat.
Daher auch die seltsamen Zeilen

  print "HTTP/1.0 200 Document follows\n";
  print "Content-type: multipart/x-mixed-replace;boundary=goober\n\n";

Die Zeile

 #sleep(1);
stellt das Zeitintervall in Sekunden ein, in dem das Bild erneuert werden soll. Mit der jetzigen Einstellung ist diese Zeile auskommentiert, und erlaubt somit ein Übertragen des Bildes so schnell, wie das Netzwerk hergibt.
Dies ist aber nur zum Übertragen im lokalen Netzwerk geeignet. Um Daten ins Internet zu schicken, sollte die Raute am Beginn der Zeile entfernt werden, und ein Zahlenwert in der selben Größe eingestellt werden, wie er auch beim Aufruf von bttvgrab benutzt wird.

Um das Skript nun auch ausführen zu dürfen, muß man dem Apache-Webserver zunächst noch mitteilen, daß sich in dem Verzeichnis webcam/cgi-bin CGI-Skripte befinden.
Dafür fügt man in der Datei /etc/httpd/srm.conf einen Eintrag der folgenden Form im entsprechenden Abschnitt ein:

Datei /etc/httpd/srm.conf
 # ScriptAlias: This controls which directories contain server scripts. 
 # Format: ScriptAlias fakename realname 
 
 ScriptAlias /cgi-bin/ "/usr/local/httpd/cgi-bin/" 
 
 #Die naechste Zeile muss hinzugefügt werden!
 ScriptAlias /webcam/cgi-bin/ "/usr/local/httpd/htdocs/webcam/cgi-bin/"

und startet den Webserver neu (unter SuSE mittels)

>> /sbin/init.d/apache restart 
Somit wäre alles vorbereitet, um die Webseite mit Server-Push-Technologie auszuprobieren.
Wir starten dafür bttvgrab (zum Demonstrieren der Möglichkeiten erstmal ohne Sleep-Time)
>> bttvgrab -f webcam:/usr/local/httpd/htdocs/webcam/webgrab.jpg -w 200 -o jpg -Q
und gehen auf die Seite http://localhost/webcam/server-push.html.

Es ist schon überraschend, wie flüssig das Video im Browser läuft. Um so erschreckender ist es, wie hoch die Prozessor-Auslastung ist.
Um eine Webcam zu betreiben, sollte man sowohl bei bttvgrab als auch im nph-webgrab.cgi eine akzeptable Sleeping-Zeit einstellen.

Ausblick

Wie nutzt man diese Technik nun als Webcam?
Ganz einfach. Man schließt die Videokamera an einen Videorecorder an und diesen dann an die TV-Karte.

Der Webcam-Ersatz lohnt sich nur, wenn man bereits im Besitz einer Video-Kamera und eines Videorecorders ist. Falls nicht, lohnt es sich kaum, diese als Ersatz für eine Webcam zu kaufen. Die Kosten wären viel zu hoch.
Wenn Sie aber bereits derartige Geräte besitzen, bietet obige Löung einen interessanten und kostengünstigen Weg.

Ein weiteres Problem besteht darin, daß man keine Programme hat, um den Tuner auf der TV-Karte anzusteuern und dadurch das TV-Programm zu wechseln.
Das Umschalten zwischen den Sendern könnte allerdings mit set-tv aus dem Paket XawTV von Gerd Knorr erfolgen.
Mit etwas Programmieraufwand sollte es dann möglich sein, auch das Programm mit einem Button über die Webseite zu wechseln.

Eine Anregung für den erfahrenen Benutzer ist es, die Webcam automatisch beim Einwählen ins Internet mittels eines Eintrags in die Datei /etc/ppp/ip-up zu starten.
Wer im Besitz einer Standleitung ist, kann auch ein Init-Skript benutzen, um bei jedem Reboot die Webcam mit einzuschalten.

Eine weitere Version zum Darstellen des Kamerabildes auf einer Webseite stellt ein Java-Applet dar. Hiermit ist es möglich, das sichtbare Laden eines Bildes zu unterdrücken, und das Bild erst dann darzustellen, wenn es auch vollständig im Zwischenspeicher zur Verfügung steht. Wer Interesse an einer derartigen Lösung hat, sollte in der Java-Dokumentation mal nach ImageObserver schauen.


Links:
http://moes.pmnet.uni-oldenburg.de/bttvgrab/ Homepage des bttvgrab-Programmes

Platz für Kommentare & Fragen:
(selbst eintragen)

    -Fernsehen ohne Ton? - 24.9., Arnd Flemmer
        -RE: Fernsehen ohne Ton? - 26.9., Ronny Ziegler

 

Weitere Ausgaben Linux NetMag
[ #1 | #2 | #3 | #4 | #5 | Main ]