TP réseau-multimédia embarqué sur Raspberry-Pi (RPi) et streaming vidéo

P.Bakowski

Une carte Raspberry-Pi intègre un processeur ARMv6 (.hf), un GPU (VideoCore IV), 512MB RAM, et un ensemble d'interfaces: 2 ports USB, 1 port Ethernet, une sortie HDMI, une sortie AV, et une sortie audio.

Dans notre TP de 3 heures nous allons mettre en oeuvre un réseau multimédia sur la base de 6 RPi , 6 Webcams et d'un commutateur Ethernet. L'ensemble peut être intégré dans les équipements d'une salle informatique avec des PC traditionnels.

Chaque RPi doit être connecté à un écran par sa sortie HDMI, à une souris et un clavier USB. Selon le besoin, l'extension du port USB est prise un charge par un adaptateur multi-port externe avec une alimentation indépendante.

La Webcam doit être connectée directement à RPi, le clavier/souris indirectement sur l'adaptateur USB.

Dans notre configuration chaque RPi fonctionne avec le système Raspbian (Debian wheezy) complété par un ensemble des logiciels réseaux/multimédia:

 

Fig 1. Configuration du réseau client-serveur multimédia

Avant de commencer le TP nous allons configurer notre réseau avec 6 RPi et 1 commutateur Ethernet (ce réseau peut être intégré dans le réseau Ethernet/Internet de la salle informatique)

Les RPi peuvent récupérer une adresse IP dynamique à partir du serveur DHCP ou être configurés manuellement avec une adresse IP statique.  Chaque RPi/Raspbian est configuré (par défaut) avec le nom d'utilisateur - pi et le mot de passe raspberry.

La configuration de l'adresse IP passe par l'édition du fichier interfaces situé dans le répertoire /etc/network.

Attention: Cette édition doit être effectuée un mode root

commande: sudo vi interfaces

Exemple d'un fichier interfaces:

auto lo

iface lo inet loopback

iface eth0 inet dhcp

#iface eth0 inet static

#address 192.168.1.2

#netmask 255.255.255.0

Après la configuration de l'adresse il faut rebooter le système par: sudo reboot

1. Analyse de la configuration

L'analyse (port scan) du réseau peut être effectuée par la commande: nmap.  Par exemple:

 

nmap -v -sn 192.168.1.1-40 permet détecter les interfaces actives

nmap -d 192.168.1.1-40 est un scan détaillé (interfaces et services)

observer la disponibilité des services : ssh (port 22), ftp (ports 20 et 21), http (port 80), .. (le service ssh est nécessasaire pour lancer les applications/programmes à distance)

2. Lecture d'un fichier vidéo en local

Sur RPi/Raspbian nous disposons d'un lecteur multimédia optimisé pour la GPU: omxplayer La lecture d'un fichier vidéo (x264) est lancée par la commande:

omxplayer -o hdmi/local nom_du_fichier.mkv

L'option -o sélectionne la sortie audio soit par HDMI soit par la sortie audio locale. Vous trouverez un ficher vidéo encodé en x264 dans le répertoire video.

omxplayer peut être contrôlé par quelques touches du clavier par exemple (p pause).

3 . Lecture d'un fichier vidéo à distance

Chaque RPi dispose d'un serveur ssh. Ce service permet de se connecter sur un autre RPi et de lancer l'execution des commandes/programmes dans une fenêtre-terminal. Dans cet exercice nous nous connectons sur un autre RPi pour lancer la lecture d'une vidéo.

ssh pi@192.168.1.33 (le mot de passe demandé est: raspbberry)

Remarque: La présentation du vidéo est lancée sur l'écran du RPi distant.

4. Serveur de Webcam - mjpg_streamer

Le serveur mjpg_streamer permet de créer des pages dynamiques avec les images/vidéos captées sur la Webcam et enregistrées en local sur un serveur Web spécifique (port 8080). Ces pages peuvent être lues directement dans un navigateur Firefox ou Chrome. La lecture de ces pages sur le navigateur disponible sur RPi peut être limitée aux images.

Le Sserveur mjpg_streamer est déjà installé sur le RPi. Il suffit de lancer la commande avec les options nécessaires pour la création de pages/fichiers html. En entrée, sur la Webcam on ne peut utiliser que la résolution 320x240 avec le format YUYV. Le nom et le montage de la Webcam sont fournis par la commande:

v4l2-ctl --list-devices 

Microsoft LifeCam VX-800 (usb-bcm2708_usb-1.2):

/dev/video0

Les formats disponibles pour la capture sont fournis par la commande:

v4l2-ctl -d /dev/video0 --list-formats

ioctl: VIDIOC_ENUM_FMT

Index : 0

Type : Video Capture

Pixel Format: 'YUYV'

Name : YUV 4:2:2 (YUYV)

Dans notre cas le lancement du streamer passe par l'exécution du script mystreamer préparé dans le répertoire HOME:

./mystreamer &      -  lancement du script

Le programme du streamer est enregistré dans le répertoire:

/home/pi/webcams/mjpg-streamer/mjpg-streamer

Le même répertoire contient les fichiers qui localisent le driver de la Webcam et les fichiers pour la lecture de la vidéo via un navigateur Web.

Le programme est lancé (par défaut) de la façon suivante (voir le script ci-joints):

./ mjpg_streamer -i "./input_uvc.so -y -r 320x240" -o "./output_http.so -w ./www"

Pour tester son exécution on se connecte via un navigateur Web à partir d'un autre ordinateur en fournissant l'adresse du RPi et le port numéro 8080. Les pages générées par défaut par le streamer peuvent être modifiées pour encadrer l'image de la Webcam dans une présentation adaptée à votre application.

Exercice:

a. Modifier les paramètres de la Webcam via l'interface de contrôle disponible dans la page initiale du mjpg_streamer (saturation, contraste, ...)

b. A partir des exemples simples fournis dans le répertoire:

/home/pi/webcams/mjpg-streamer/mjpg-streamer

Editer les fichiers Web pour:

Attention: ne modifiez pas des pages initiales listées ci-dessous, copiez les dans vos fichiers avec un prefixe my_...:

puis éditez vos propres pages Web:

 

Notez comment ces pages sont liées au driver de la Webcam

Annexe:

Voici le contenu du fichier script (mystreamer) permettant de lancer le streamer avec les paramètres par défaut:

 

#this is the script to start the execution of mjpg_streamer

#in directory ~/webcams/mjpg-streamer/mjpg-streamer

cd $HOME/webcams/mjpg-streamer/mjpg-streamer

 

#execution of mjpg_streamer with input and output parameters

 

#input parameters: -i "input_uvc.so -d /dev/video0 -r 320x240"

#input parameters (minimum): -i "input_uvc.so"

#to query the input plugins "input_uvc.so":

#./mjpg_streamer --input "input_uvc.so --help"

 

#output parameters: -o "./output_http.so -w ./www"

#to query for the output plugin "output_file.so":

#./mjpg_streamer --output "output_file.so --help"

#to query for the output plugin "output_http.so":

#./mjpg_streamer --output "output_http.so --help"

#to specify certain device, framerage, resolution for the input plugin:

#./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 320x240 -f 10"

#to specify the output file written every 15 seconds:

 

#mkdir pics

#./mjpg_streamer -o "output_file.so -f pics -d 15000"

 

./mjpg_streamer -i "./input_uvc.so -y -r 320x240" -o "./output_http.so -w ./www"

 

Dans ce fichier, enregistré à la racine de votre compte (pi), vous pouvez modifier ou ajouter certains paramètres: par exemple le nombre de trames par seconde à capter par la Webcam.