Mise à jour au 28/02/2006

Finalement la version 1.0.11 du module PWC fontionne parfaitement même en 640x480 !


Choix de la webcam


Commençons par le commencement. Il existe quelques webcam qui fonctionnent sous Linux. Je donne deux liens en annexe qui listent la majorité des webcams(1). Mais attention ! Certains constructeurs ont la facheuses tendances à remplacer des chipsets par d'autres dans la même série de webcam ; et parfois, ils ne changent même pas le numéro de série ! Mon choix s'est porté vers une Philips ToUcam PRO II (840k) à 45`, car il me parraissait alors qu'elle tournerait en 640x480 à 60fps... Nous n'y serons pas !

Mon pilote de périphérique : PWC


Pendant ma recherche de webcam fonctionnant sous linux, j'en ai profité pour trouver le pilote (driver) de ma future carte : pwc(2). Pour la petite histoire il y a peu il fallait deux modules pour faire fonctionner la webcam : pwc (le vieux) libre et pwcx propriétaire de décompression video. Les deux sont remplacés par un unique pwc (le nouveau) grâce à l'ingénierie inverse de pwcx ! Vous avez suivi ? La décompression video dont il est question sert à faire passer les images de la webcam vers l'ordinateur avec le cordon USB, qui peut avoir du mal à ingurgiter tout ce débit.

Ce nouveau pilote n'est pas dans le noyau officiel (à ce jour), il faut l'installer à la main ; voilà pourquoi le paragraphe d'installation est aussi long !

Installation


Si vous ne comprennez pas les commandes : RTFM (Read The Fuckin' Manual) avec "man commande", c'est très simple à comprendre !

>cd /opt  #Je vais dans le répertoire /opt
>wget http://www.saillard.org/linux/pwc/files/pwc-10.0.9.tar.bz2  #je télécharge le driver
>tar xvjf pwc-10.0.9.tar.bz2  # je décompresse
>cd pwc-10.0.9  #je vais dans de répertoire décompressé
>make  # je compile

On récupère notre binaire ./pwc.ko qu'il faut installer dans notre beau noyau :

Où se trouve le module pwc de notre noyau actuel ? ici :

>find /lib/modules/`uname -r` -name 'pwc*' -type f

Chez moi, ça donne

/lib/modules/2.6.12-13mdk/kernel/drivers/usb/media/pwc/pwc.ko.gz

Vous aurez peut-être aussi un pwcx ! Par sécurité, je l'ai renommé en pwc-old.ko.gz (et donc pwcx-old.ko.gz si besoin) Ensuite j'ai tout simplement copié ./pwc.ko dans le répertoire trouvé. Je n'ai pas eu besoin de le compresser en gz, cela est transparent. Sinon, une petite compression :

>gzip pwc.ko

et vous obtenez un magnifique pwc.ko.gz !

Pour tester s'il fonctionne, en root :

>modprobe pwc

Si tout ce passe bien le module pwc crée un périphérique /dev/videoX (et c'est tout) - certainement /dev/video0 ou /dev/v4l/video0 (v4l signifie Video For Linux). Pour voir ce que fait le noyau pendant au moment de la connection de la webcam, je vous propose la commande :

tail -f /var/log/messages

Je vais bientôt écrire un article explicatif sur les périphériques et le noyau 2.6 en général, à suivre...

Configuration vidéo


Selon votre pilote, différentes options par défaut peuvent être proposées (pour les applications ne pouvant pas les changer). Pour cela, executez cette commande en changeant "pwc" par le nom de votre driver :

>modinfo pwc | grep parm
parm: dev_hint:Device node hints (array of charp)
parm: leds:LED on,off time in milliseconds (array of int)
parm: compression:Preferred compression quality. Range 0 (uncompressed) to 3 (high compression) (int)
parm: power_save:Turn power save feature in camera on or off (int)
parm: trace:For debugging purposes (int)
parm: mbufs:Number of external (mmap()ed) image buffers (int)
parm: fbufs:Number of internal frame buffers to reserve (int)
parm: fps:Initial frames per second. Varies with model, useful range 5-30 (int)
parm: size:Initial image size. One of sqcif, qsif, qcif, sif, cif, vga (charp)

Voilà donc les options de mon pilote. Je choisis de mettre un taille d'image par defaut en "sif" (320x240) un débit par defaut à 30 ainsi que la gestion d'energie. Cela me donne :

size=sif fps=30 power_save=1

Mais où mettre ces paramètres ? Sous Linux, le fichier de configuration des modules du noyau s'appelle /etc/modprobe.conf. Je rajoute donc dans ce fichier :

install pwc /sbin/modprobe - -first-time - -ignore-install pwc \
          size=sif fps=30 power_save=1

Si vous le comprenez pas cette ligne : RTFM ! c'est simplissime !
Testons la video. Je vous propose de le faire avec mplayer par exemple. Voici la commande :

mplayer tv:// -tv driver=v4l:width=320:height=240:device=/dev/videoX:fps=30

En remplaçant /dev/videoX par votre périphérique.
Maintenant rechargeons le module avec ces nouvelles options :

>rmmod pwc ; modprobe pwc

Modprobe vous dira si vous avez fait une erreur.
Vous ne remarquez rien ? Ici on charge un module et on l'enlève du noyau et pas de reboot demandé ! Et oui, nous ne sommes pas sur un système d'exploitation propriétaire bien connu :-)

Configuration du son


Le son est géré par ALSA(3) pour les noyaux 2.6. OSS, (l'ancienne gestion du son) est devenue obsolète. Pour les vieilles applications qui n'ont pas migré vers ALSA il existe un simulateur OSS.

J'ai eu quelques difficultés à faire fonctionner le micro de la webcam, il faut bien configurer son fichier /etc/modprobe.conf. Voici les lignes que j'ai ajoutées dans le mien :

alias sound-slot-0 snd-via82xx
alias sound-card-0 snd-via82xx
options snd-via82xx index=0

alias sound-slot-1 snd-usb-audio
alias sound-card-1 snd-usb-audio
options snd-usb-audio index=1

remove snd-via82xx /sbin/modprobe -r snd-pcm-oss;\
    /sbin/modprobe -first-time -r - -ignore-remove snd-via82xx
install snd-via82xx /sbin/modprobe - -first-time - -ignore-install snd-via82xx;\
    /sbin/modprobe - -first-time - -ignore-install snd-pcm-oss;\
    /usr/sbin/alsactl restore

Explications :

Comme vous pouvez le comprendre, j'ai deux cartes sons : une carte via82xx et une carte venant de l'USB, qui n'est autre bien sûr que le micro de ma webcam ! Il s'agit donc du module "snd-usb-audio" comme nous avions "pwc" pour la video. Cette fois, ce module est disponible avec votre noyau. Il n'y a donc pas grand chose à faire. Il est même possible que les lignes dans modprobe.conf soient déjà présentes. Si elles n'y sont pas il faut au moins celles en "sound-card-X" qui chargent ALSA. J'ai ajouté personnellement quelques options comme

options snd-usb-audio index=X

qui permet de spécifier l'ordre des cartes. J'ai aussi ajouté :

/usr/sbin/alsactl restore

qui me permet d'être que ma table de mixage soit restorée. Dans le même sens, j'aurais pu ajouter :

/usr/sbin/alsactl store

dans la ligne de "remove" pour être sûr que les parametres soient bien enregistrés, mais je n'ai pas de problèmes de ce côté là. J'expliquerai aussi le fonctionnement de cela dans l'article sur le noyau 2.6 et les périphériques.

Les lignes avec "alias sound-slot-X" apportent la gestion du son par OSS.
Les lignes avec "alias sound-card-X" apportent la gestion du son par ALSA (le plus important).
La ligne sur "snd-pcm-oss" apporte la simulation OSS par ALSA quand on démarre ALSA.
Et bien sûr les lignes "remove" et "install" permettent de spécifier des options supplémentaires en cas d'installation ou de suppression du module dans le noyau.

Enregistrement


Pour l'enregistrement, il y a plusieurs façons de faire. Celle qui demande le moins de travail est certainement l'outil gv4l(4). C'est une interface graphique qui utilise Transcode(5). Transcode est un outils de conversion audio/video à la volée. A l'origine gv4l est un magnétoscope pour la TV. Mais rien ne vous empèche de l'utiliser pour filmer ! Par contre cette application est passive dans le sens où c'est à vous de spécifier le fps et la taille de l'image source (ce qui est logique pour un utilitaire qui est à l'origine un magnétoscope TV). Heureusement, nous avons mis des valeurs par défault pour notre driver pwc, rappelez-vous :

size=sif fps=30 power_save=1

Nous pouvons donc indiquer dans les paramètres, une taille en 320x240 et un fps de 30. En suive je choisis de compresser le tout avec xvid. Pour le son, j'ai trouvé cela plus sensible, mais ça fonctionne avec les pilotes ALSA.
Il y a aussi la méthode roots avec mencoder :

mencoder tv:// -tv driver=v4l:width=320:height=240:device=/dev/videoX:fps=30 -o test.raw -ovc copy


Détection de mouvement


La détection de mouvement se fait grâce au logiciel motion(6). Un man motion vous permettra de voir l'étendue impressionnante de ses capacités. Il est notamment capable d'archiver des infomations suite à une détection dans un base de données MySQL ou PostgreSQL. Il permet aussi d'envoyer des SMS et des emails avec une capture d'ecran, il est également capable de lire sur plusieurs sources en MSME TEMPS ! Voici un exemple d'utilisation :

motion -d /dev/videoX -E "sleep 1 ; mplayer tv:// -tv driver=v4l:width=320:height=240:device=/dev/videoX:fps=30"

Cette commande (que vous pouvez copier dans un detect-motion.sh par exemple) envoie la lecture de la video en cas de détection d'un mouvement, le sleep permet de laisser le temps à motion de liberer la webcam au profit de mplayer. Vous pouvez egalement rajouter l'option -D pour le mettre en tâche de fond (daemon).

Vous pouvez faire la même chose avec mencoder pour enregistrer la video. Saurez-vous trouver la commande ? Regardez quelques lignes au dessus !

Gnomemeeting


Il n'y a pas encore beaucoup de logiciels capablent discuter (avec webcam) avec nos amis maceux ou window$iens. Une méthode qui a fait ses preuves et l'utilisation de gnomemeeting(7) avec netmeeting. (Il parrait que aMSN(8) gère les webcams sur le protocole MSN, mais je désapprouve l'utilisation de protocoles fermés.) Si vos périphériques sont bien créés par le noyau, notamment ceux d'alsa dans /dev/snd, gnomemeeting les détectera dans les préférences. Il est capable de modifier la taille et le débit de l'image à envoyer.

Firewall

Voici les ports qu'il faut ouvrir surtout si on veut pouvoir réceptionner et pas seulement appeler : 5000:5016/udp 5020:5023/udp 1720/tcp 30000:30010/tcp

Bilan et échecs


Le tableau n'est pas tout rose ! Au niveau de du driver pwc. Je n'ai pas réussi à monter en 640x480. Je soupsonne que ce ne soit pas possible même avec les drivers windows. Quelqu'un peut confirmer ? De même pas moyen de monter à plus de 30 fps. Je serais très interressé par des retours d'expérience ! Dernier petit problème de pwc, la led de la webcam reste allumée tant qu'on ne l'a pas utiliser : certaine application comme gnomemeeting éteingnent correctement la led.

En ce qui concerne le son : en plus de la configuration un peu pénibre d'alsa, il faut noter que les périphériques son font n'importe quoi si on démarre la machine avec la webcam branchée. Il parrait que cela est un bug connu d'alsa. Il reste donc une impression de manque de maturité au niveau du toujours prometteur alsa poutant en version 1.0.10.

Le bilan est quand même positif. Il n'y a pas de raison aujourd'hui d'avoir peur d'acheter un webcam quand on est sous linux, pourvu qu'elle soit dans les listes de matériel supportés. De toute façon, il n'y a pas encore beaucoup de monde capable d'uploader une image en 640x480 à 60fps !

Annexe des liens