www.starend.org

TechNIX

Tags

webcam camE debian linux

Serveur de webcam autonome

17/05/2007

1/Introduction

J'utilise une machine de récupération (K6 à 166MHz, 64Mo de RAM, 9Go de disque dur, sans ventilateur) pour faire l'acquisition automatique d'une webcam. Avec disponibilité depuis internet et archivage de toutes les images capturées mais non dispo en ligne. L'image est capturée toutes les 10 secondes, proposée immédiatement en ligne ainsi de la miniature (50%) des 5 dernières (soit en tout 1 minute de visuel).

On n'a pas accé directement à cette machine depuis internet, en fait. On passe par le serveur principale www.starend.org . En fait un site virtuel dans apache qui répond aux demandes pour webcam.starend.org et se contente d'aller chercher (mod_proxy) la page sur la machine webcam. Le site virtuel n'accepte que les connexions en https (ssl). Les clients qui arrivent en http sont redirigées (redirect) automatiquement vers la connexion https. Par ce système, la machine webcam est déchargée de la partie crypto (gourmande en ressource) de ssl.

/page_web.png" border=0 />
La face visible.

/webcam1a.jpg" border=2 />
/webcam1b.jpg" border=2 />
La face cachée.

2/Installation des programmes

Installer camE, apache, et libapache-mod-php4 gspca :

root@webcam1#aptitude install came apache libapache-mod-php4 gspca

La configuration utilisé par camE, dans '/webcam/camErc' :

[ftp]
do = 0

[grab]
device = /dev/video0
temp_file = /webcam/capt.jpg
lag_reduce = 2
text   = %d/%m/%Y %H:%M %Z -
#width  = 352
#height = 288
width  = 320
height = 240
percent = 100

#colour = 50
brightness = 90
#contrast = 50
#hue = 50
#whiteness = 50

logfile = /webcam/camElog
infofile = /webcam/camEinfo
archive = /webcam/archives
archive_subdirs = 1
archive_ext = jpg
archive_shot_every = 1
archive_thumbnails_dir    = /webcam/miniatures
archive_thumbnails_create = 1
archive_thumbnails_width  = 160
archive_thumbnails_height = 120
quality = 85
input  = 0
norm   = 0
#title_text = StarEnd.org
#title_r = 255
#title_g = 255
#title_b = 0
#title_a = 255
title_font = FreeSans/8
text_r = 64
text_g = 255
text_b = 127
text_a = 255
#text_font = arial/8
bg_a = 0
bg_b = 0
bg_g = 0
bg_a = 50
ttf_dir = /var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType
#blockfile = /webcam/BLOCKCAM
#offline_image = /webcam/block.jpg
#uploadblockfile = /home/gilbertt/BLOCKUPLOAD
#watch_interface = ppp0
#overlay_image = /home/gilbertt/.lb.png
#overlay_x = 5
#overlay_y = 5
#action_pre_shot
#action_post_shot
#action_post_upload

Un fichier annexe '/webcam/camEinfo' :

webcam.starend.org

L'arborescence utilisé dans '/webcam' :

root@webcam# ls -Alh
total 164K
drwxr-xr-x 3 root root 4,0K 2007-03-31 17:10 archives
-rw-r--r-- 1 root root   20 2007-03-31 20:50 camEinfo
-rw-r--r-- 1 root root  300 2007-05-17 22:57 camElog
-rw-r--r-- 1 root root 1,1K 2007-04-01 11:27 camErc
-rw-r--r-- 1 root root  11K 2007-05-17 22:57 capt.jpg
-rwxr-xr-x 1 root root   84 2007-03-31 20:35 capt.sh
-rwxr-xr-x 1 root root 1,2K 2007-03-31 22:29 favicon.ico
-rwxr-xr-x 1 root root  12K 2007-04-01 02:15 gnuart.txt
-rw-r--r-- 1 root root  11K 2007-05-17 22:56 img111839.jpg
-rw-r--r-- 1 root root  11K 2007-05-17 22:56 img111840.jpg
-rw-r--r-- 1 root root  11K 2007-05-17 22:57 img111841.jpg
-rw-r--r-- 1 root root  11K 2007-05-17 22:57 img111842.jpg
-rw-r--r-- 1 root root  11K 2007-05-17 22:57 img111843.jpg
-rw-r--r-- 1 root root  11K 2007-05-17 22:57 img111844.jpg
-rw-r--r-- 1 root root 1,6K 2007-04-01 17:58 index.php
drwxr-xr-x 3 root root 4,0K 2007-03-31 17:10 miniatures
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref00
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref10
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref20
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref30
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref40
-rw-r--r-- 1 root root   14 2007-05-17 22:57 ref50
-rw-r--r-- 1 root root    2 2007-05-04 13:24 refimg
-rwxr-xr-x 1 root root  726 2007-04-01 11:36 run.sh
drwxr-xr-x 3 root root 4,0K 2007-04-01 02:14 web

3/La capture d'image

Le script de capture de l'image depuis la webcam, '/webcam/capt.sh' :

#!/bin/bash
rmmod gspca
sleep 1
modprobe gspca
sleep 1
camE -c /webcam/camErc -f -s

4/la mise en page web

Le script pricipale '/webcam/run.sh' :

#!/bin/bash
cd /webcam
echo "0" > /webcam/refimg
I00=0
I10=0
I20=0
I30=0
I40=0
I50=0

while true
do sync &
   cat /webcam/web/theme/nd.jpg > /webcam/capt.jpg
   /webcam/capt.sh &
   sleep 10
   I50=$I40
   I40=$I30
   I30=$I20
   I20=$I10
   I10=$I00
   I00=$(( $I00 + 1 ))
   cat capt.jpg > img$I00.jpg
   echo "img$I50.jpg" > /webcam/ref50
   echo "img$I40.jpg" > /webcam/ref40
   echo "img$I30.jpg" > /webcam/ref30
   echo "img$I20.jpg" > /webcam/ref20
   echo "img$I10.jpg" > /webcam/ref10
   echo "img$I00.jpg" > /webcam/ref00
   for I in $(ls img*.jpg | grep -v "img$I00.jpg" | grep -v "img$I10.jpg" | grep -v "img$I20.jpg" | \
              grep -v "img$I30.jpg" | grep -v "img$I40.jpg" | grep -v "img$I50.jpg")
   do rm $I
   done
done

La configuration d'apache pour la page web de la webcam, '/etc/apache/httpd.conf' :
on modifie la valeur de

DocumentRoot /webcam

Et on ajoute ça :

<Directory /webcam/>
    Options Indexes Includes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

La page web '/webcam/index.php' :

<html>
 <head>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-15" />
  <meta name="author" content="DENDIEVEL Stephane" />
  <meta name="robots" content="all" />
  <meta http-equiv ="refresh" content="5">
  <style type="text/css" media="all">@import "web/theme/theme001.css";</style>
  <title>webcam.starend.org</title>
  <link rel="icon" type="image/png" href="web/theme/favicon.png"/>
 </head>
 <body bgcolor="white" text="grey">

<div id="titre">
 <p><a href="http://www.starend.org/" title="http://www.starend.org/"><img src="web/theme/rose3d.png" border=0></a></p>
 <p>webcam.starend.org</p>
</div>
<div id="image">
 <p><img src="<? include("/webcam/ref00"); ?>" border=0 alt="image webcam"></p>
 <p>Rafraichissement toutes les 10s.</p>
</div>
<div id="bas">
 <center>
 <div id="mini">
  <pre><img src="<? include("/webcam/ref10"); ?>" border=0 alt="-10" width=120 height=90><br />-10s</pre>
  <pre><img src="<? include("/webcam/ref20"); ?>" border=0 alt="-20" width=120 height=90><br />-20s</pre>
  <pre><img src="<? include("/webcam/ref30"); ?>" border=0 alt="-30" width=120 height=90><br />-30s</pre>
  <pre><img src="<? include("/webcam/ref40"); ?>" border=0 alt="-40" width=120 height=90><br />-40s</pre>
  <pre><img src="<? include("/webcam/ref50"); ?>" border=0 alt="-50" width=120 height=90><br />-50s</pre>
 </div>
 </center>
</div>
<div id="copyleft">
 Images sous licence <a href="gnuart.txt" title="Licence GNUart">GNUart</a> 2007.<br />
 Webdesign : <a href="mailto:webmaster@starend.org" title="webmaster@starend.org">DENDIEVEL Stéphane</a>
</div>

 </body>
</html>

La feuille de style '/webcam/web/theme/theme001.css' :

body    {
        font: 8pt/16pt georgia;
        color: #000000;
        margin: 0px;
        padding: 0px;
        min-width: 780px;
        background: #000000 url(bg.jpg) repeat top left;
        }
p       {
        font: 10pt/16pt georgia;
        padding: 0px;
        margin: 0px;
        text-align: center;
        }
a:link  {
        text-decoration: none;
        color: #808080;
        }
a:visited {
        text-decoration: none;
        color: #a0a0a0;
        }
a:hover, a:active {
        font-weight: bold;
        text-decoration: underline;
        color: #f0f0f0;
        }

#titre  {
        height: 117px;
        background: url(gn.jpg) repeat-x bottom left;
        padding: 10;
        }
#titre p        {
        font: 20pt georgia;
        color: #ffffff;
        }

#image {
        height: 266px;
        background: url(bg2.jpg) repeat bottom left;
        padding: 10;
        font: 8pt georgia;
        color: #b0b0b0;
        }
#image p        {
        text-align: center;
        -moz-border-radius: 10px;
        margin-bottom: 10;
        }

#bas    {
        height: 150px;
        background: url(ng.jpg) repeat-x top left;
        padding: 10;
        }
#mini   {
        height: 130px;
        width: 760px;
        }
#mini pre       {
        font: 8pt georgia;
        color: #c0c0c0;
        border: 1px #c0c0c0 solid;
        background: #606060;
        padding: 10px;
        width: 120px;
        text-align: center;
        -moz-border-radius: 10px;
        margin: 5;
        float: left;
        }

#copyleft {
        font: 10pt georgia;
        color: #808080;
        text-align: center;
        }

Et les 8 images suivantes, à mettre dans '/webcam/web/theme/' :

/bg2.jpg" border=0 /> bg2.jpg

/ng.jpg" border=0 /> ng.jpg

/bg.jpg" border=0 /> bg.jpg

/gn.jpg" border=0 /> gn.jpg

/rose3d.png" border=1 /> rose3d.png

/nd.jpg" border=0 /> nd.jpg

/favicon.png" border=0 /> favicon.png

/favicon.ico" border=0 /> favicon.ico

5/L'automatisation

L'automatisation se fait par un script au chargement du système, en runlevel 2, '/etc/rc2.d/S50webcam.sh' :

#!/bin/bash
echo "Demarrage de la webcam."
/webcam/run.sh &
Licence Creative Common 2007 :: BY-NC-SA :: Webdesign DENDIEVEL Stéphane