Skip to main content

Capture de la vidéo en temps réel sur un disque dur

Une journée d'enregistrement correspond à environ 8 à 10h de vidéos. Pour le WE complet, ayant 3 salles à prendre en charge, cela correspond donc à presque 60 heures de vidéo. Si vous vous contentez d'uiliser des K7 mini DV c'est autant de temps perdu à capturer la vidéo sur disque dur avant de pouvoir la compresser pour la mettre en ligne. Nous détaillerons donc ici une méthode qui permet de capturer le flux vidéo original directement de la caméra au disque dur.

Montage matériel

Montage caméra-PC-disque durLa caméra est connectée en Firewire à un ordinateur portable, qui tourne bien évidemment sous Linux, et qui est lui même connecté en USB2 à un disque dur externe. Le disque dur externe doit avoir pour caractéristique de devoir tourner en 7200 rpm.

Logiciels et bibliothèques nécessaires

  • libquicktime: librairie pour lire et écrire des fichiers vidéos quicktime/avi/mp4.
  • libiec61883: librairie nécessaire pour activer la connectique Firewire.
  • libavc1394: librairie nécessaire pour activer la connectique Firewire.
  • libraw1394: librairie nécessaire pour activer la connectique Firewire.
  • dvgrab : petit utilitaire pour capturer un signal vidéo AVI-2 émis par une caméra DV en utilisant le bus IEEE-1394, mieux connus sou le nom FireWire.
  • VLC : lecteur, serveur et encodeur vidéo open-source.

Au niveau de votre Kernel Linux vous devez activer le support FireWire (IEEE 1394).

Script de capture en temps réel

Cette année le script de capture est intitulé... capture.sh.
Simplissime, celui-ci capture le flux vidéo de la caméra en HDV et l'enregistre dans un fichier .m2t, le format de fichiers généralement utilisé par les camescopes HDV. La vidéo ainsi obtenue est précompressée en MPEG-2.

Contenu de capture.sh

#!/bin/sh
dvgrab -noavc -s 0 -f hdv $1

Lancement du script capture.sh

Veuillez déposer ce script à l'endroit ou vous voulez enregistrer vos vidéos. Veuillez vérifier que ce script est exécutable. Dès le début de la conférence à enregistrer, lancer la commande suivante:

$ ./capture.sh nom_de_ma_video

Par sécurité, nom_de_la_video ne contient aucun accent, ni espaces, ni ponctuation. Cela va créer un fichier nommé nom_de_la_video001.m2t. A la fin de la conférence un CTRL+C stoppe la procédure, et le script est relancé avec le nom de la conférence suivante en paramètre.

Voici un apperçu de ce que vous avez comme retour sur votre terminal :

Photo d'un terminal avec l'exécution du script de capture

Préparation du streaming

Le fichier m2t est envoyé par réseau au serveur de streaming, qui va le réencoder dans un format permettant une diffusion. Dans notre cas ce sera en 480x272, l'image étant encodée en mpeg-2 (1Mbs de  bitrate) et le son en mp3 (44100Hz, stéréo, 16bit, 96kbps). Le but est d'avoir une image un bon rapport taille/qualité, et d'utiliser un format le plus accessible possible par la pluspart des lecteurs vidéos.

Transfert du fichier m2t au serveur de streaming

Le script stream-client.sh utilise vlc en ligne de commande (cvlc) pour envoyer le fichier en UDP vers le serveur, ici d'adresse ip 192.168.2.100, sur le port 4567.

#!/bin/sh
cvlc $1 --file-caching=20000 --sout "#std{mux=ts,access=udp,dst=192.168.2.100:4567}"

Le script est lancé juste après celui de la capture, dans un terminal différent.

user@mylaptop $ ./stream-client.sh nom_du_fichier.m2t

Notez qu'ici on met en argument le nom du fichier m2t, c'est à dire nom_de_la_video001.m2t

Encodage et streaming depuis le serveur

Sur le serveur de streaming, il y a un script par salle d'enregistrement (stream-raw-room01.sh, stream-raw-room02.sh, etc). Chaque script récurère les fichiers envoyés depuis la salle dont il dépend, les réencode, et envoye la vidéo ainsi créée qui sera streamée par VLC en UDP sur un port spécifique à la salle.

Contenu d'un des scripts stream-raw-room0x.sh :

#!/bin/sh
# Delivered under LGPL v3 licence http://www.gnu.org/licenses/lgpl-3.0.txt
if [ -z $1 ] || [ -z $2 ] || [ -z $3 ]; then
  echo "Usage: $0 server_port server_public_ip server_public_port"
  exit 1
fi

SERVER_PORT=$1
SERVER_PUBLIC_IP=$2
SERVER_PUBLIC_PORT=$3

cvlc -vv udp://@193.191.32.10:${SERVER_PORT} --sout "#transcode{vcodec=mp2v,fps=25,vb=1000,width=480,height=272,acodec=mpga,ab=96,channels=2,samplerate=44100,deinterlace}:std{access=http,mux=ts,dst=${SERVER_PUBLIC_IP}:${SERVER_PUBLIC_PORT}}"

Pour lancer le script, exécutez par exemple la ligne suivante dans un terminal :

$ stream-raw-roow0x.sh port_du_serveur ip_publique_du_serveur port_public_du serveur

ce qui dans notre cas donnerai pour la salle principale:

$ stream-raw-roow0x.sh 4567 192.168.2.100 1000

Les internautes pourront ainsi récupérer chaque flux issu de chaque salle en utilisant un client VLC et en ouvrant un flux, ici par exemple à l'URL http://streaming.onsite.fosdem.net:10000/

 

 

La nouvelle mailling list du lug est disponible chez tuxfamily

Pour s'y inscrire la procédure est disponible ici