Comme je l'ai dit dans un précédent billet, cette année l'école nous fait réaliser un projet de 9 semaines, par binômes.

Le but de notre projet est de réaliser un système d'enregistrement de CV classiques et de CV vidéos. La partie CV classique est déjà en cours de test, il ne reste donc plus que la partie CV vidéos.
Nous utilisons pour cela une caméra IP Axis 207 reliée au réseau de notre école. Vous me direz : "Pourquoi utiliser une camera réseau et non pas les webcam personnelles des étudiants ?". On a choisi cette solution d'une part pour des raisons d'uniformisation de l'information : les étudiants seront tous filmés sur le même fond, dans le même environnement, ce qui garantira une bonne qualité de son et de lumière pour n'importe quel élève. D'autre part cela permettra aussi d'éviter les dérives d'utilisation que peut trouver à tester un étudiant quelque peu farfelu... ;) En plus de tout ça, n'importe quel élève sans webcam pourra bénéficier de ce service.

Techniquement, c'est assez original... je pense que l'on doit pouvoir trouver ce genre d'architecture dans les systèmes de surveillance d'entreprises, mais simplement pour enregistrer des CV vidéos, ça doit être une grande première !

Voici un petit schéma de ce qui doit être réalisé (désolé pour la qualité qui n'est pas au rendez-vous) :

Comme je l'ai dit dans un précédent billet, cette année l'école nous fait réaliser un projet de 9 semaines, par binômes.

A : Le flux de la webcam est capté par l’étudiant
B : Le flux de la webcam est capté par le serveur
C : L’étudiant et le serveur communiquent ensemble

Le point critique est le point B qui consiste à rapatrier les données de la caméra vers le serveur (Linux, Ubuntu 8.04 en dev, Fedora en production) et de les enregistrer dans un fichier. Nous travaillons sur ce point depuis mardi dernier avec plusieurs solutions comme : VLC, FFmpeg...

Plusieurs problèmes à ce niveau avec le flux délivré par notre caméra Axis en MPEG4/AAC :

  • VLC récupère le flux snas problème, il l'affiche, avec le son mais ne l'enregistre pas au moment de l'encodage (on veut récupérer un fichier au format FLV)
  • Pas de panique, on sait que VLC fait appel notamment à FFmpeg lors de certains encodages. On récupère le flux et on l'enregistre, sans encoder. Puis on se sert de FFmpeg directement pour voir comment il réagit : Surprise ! Pas de stream audio en entrée, alors qu'à l'écoute, il y a bien quelque chose. Autre fait marquant : un FPS de 1000, alors que qu'il est réglé à 15 dans la config de la caméra...
  • On rit jaune, mais on teste autre chose : GStreamer aimerait les caméra Axis ! Oui tout à fait. Mais malheureusement, pas le son non plus... ? Mais qui est donc le vilain petit canard ? Toutes les librairies d'encodage ou alors les cameras Axis ?
  • Courage, on essaye avec MEncoder et là... miracle ! Tout fonctionne à merveille et en plus, on fait tout ce qu'on veut en une seule commande.
La voici :

mencoder [source] -o [destination] -of lavf \
    -oac mp3lame -lameopts abr:br=32 -srate 44100 -ovc lavc \
    -lavcopts vcodec=flv:vbitrate=3000:mbd=2:mv0:trell:v4mv:cbp:last_pred=3


La source peut être un fichier ou un flux, la destination aussi je suppose (voir la documentation). En tout cas la source peut être un flux RTSP (celui que diffuse notre caméra). Dans ce cas, on peut écrire un code du genre :

#!/bin/sh

# usage :
# rec.sh [src] [dst] [length]
# example: sh rec.sh rtsp://172.16.14.120:554/mpeg4/media.amp /home/me/thewebcam.flv 30
# will record a video stream from 172.16.14.120 in /mpeg4/media.amp file with the port 554 by rtsp protocol
# Note : It has been tested with a Axis 207 IP camera
# Please make sure that out file extension is flv and check the audio sample rate and video rate compatibility !

echo "# Start record..."
echo "#     From :   $1"
echo "#     To :     $2"
echo "#     Length : $3"

mencoder $1 -o $2 -of lavf \
    -oac mp3lame -lameopts abr:br=32 -srate 44100 -ovc lavc \
    -lavcopts vcodec=flv:vbitrate=3000:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 \
    -vf scale=480:360 &
sleep $3s

echo "# Stop record..."
killall mencoder
echo "# Record stopped"


Peut-être qu'il y a aussi moyen d'arrêter l'encodage de manière moins brutale mais je n'ai pas encore réfléchi à la question.
En tout cas pour capturer et encoder directement un flux d'une camera IP Axis qui diffuse un flux merdique (ou pas) comme la notre, c'est une bonne solution.

En ce qui concerne notre projet... il ne nous reste plus qu'à interfacer ce machin avec le site web mis en place pour ça... et c'est les vacances :p