Pi Camera et Streaming video
Par makoto doushite le mercredi, 17 septembre 2014, 17:56 - Raspberry Pi - Lien permanent
Me revoici donc, après les petits ennuis matériel évoqués, avec l'idée de streamer la caméra du Raspberry en IP.
Au boîtier imprimé j'ai ajouté des lentilles magnétiques pour ordi-phone, afin de disposer d'un grand angle ou d'un fish-eye.
Rappel vite fait de la base pour l'installation :
Télécharger Raspbian http://www.raspberrypi.org/downloads
- Déployer l'image sur une carte SD depuis un système GNU/Linux, avec la commande DD
(attention, of=/dev/sdx à adapter pour la cible de votre carte SD, en cas d'erreur risque d'effacement d'un disque dur non désiré)
dd bs=4M if=2014-06-20-wheezy-raspbian.img of=/dev/sdx; sync
- Placer la carte SD dans le Raspberry, et le mettre sous tension.
raspi-config s'exécute tout seul au premier démarrage, configurer tous les trucs comme on veut, avec cette fois la partie camera à activer !
Pour exécuter raspi-config plus tard, simplement :
raspi-config
Après le reboot, pour rappel :
Login : pi
Pass : raspberry
Effectuer les mises à jour :
sudo apt-get install rpi-update sudo rpi-update sudo apt-get update sudo apt-get upgrade
Installer la clé wifi TL-WN725N-v2 :
- Attention, par rapport au moment ou j'ai écris l'article sur la clé wifi TL-WN725N-v2, la dernière Raspbian (2014-06-20-wheezy-raspbian) n’intègre toujours pas le module pilote, mais je constate qu'il est désormais impossible d'installer les headers nécessaires à la compilation du module !
En effet, quand on demande l'installation des headers, ce sont donc ceux du noyau en fonctionnement (uname -a) qui sont requis, et celui-ci est donc un noyau fournit par la fondation Raspberry, sans les headers, hahaha, sinon c'est pas drôle -_-
Il faut donc installer un autre noyau et ses headers, soit en le choisissant manuellement avec :
sudo aptitude search linux-headers
puis,
sudo apt-get install linux-image-3.10-3-rpi linux-headers-3.10-3-rpi
- Soit en utilisant le métapacket suivant qui dans le cas présent installe automatiquement le kernel 3.10-3-rpi
sudo apt-get install linux-image-rpi-rpfv linux-headers-rpi-rpfv
- Bien, mais il faut savoir, qu'un chargeur de démarrage tel que Grub n'existe pas sous Raspbian, alors tout se passe dans le fichier texte /boot/config.txt qu'il suffit d'éditer pour y ajouter ces lignes pour la prise en compte du noyaux qu'on vient de mettre. (Sinon le Raspberry continuera de démarrer sur le noyau par défaut kernel.img).
kernel=vmlinuz-3.10-3-rpi initramfs initrd.img-3.10-3-rpi followkernel
- À partir de là on peut reprendre l'installation normale via le billet consacré.
Tester la camera :
- Cette commande devrait afficher une image (oui même sur la console tty) durant quelques seconde, puis enregistrer le fichier image.jpg.
raspistill -o image.jpg
Monter un dossier réseau, pour enregistrer les vidéos :
- Même démarche qu'avec le médiacenter, bien pratique d'avoir un serveur ou un nas.
sudo apt-get install sshfs
- Créer une paire de clés publiques/privées pour l'utilisateur sur le client :
ssh-keygen -t rsa
Laisser le chemin par défaut (/home/pi/.ssh/id_rsa) et laisser la demande de passphrase vide.
- Copier la clé publique sur le serveur :
sudo ssh-copy-id -i /home/pi/.ssh/id_rsa.pub "-p N°-de-port pi@IP-du-serveur-nas"
- Ajouter l'utilisateur au groupe fuse (se déloguer/reloguer pour prise en compte) :
sudo usermod -a -G fuse pi
- Écrire le script cameraONsvr.sh :
nano ~/cameraONsvr.sh
#!/bin/sh sshfs -p N°-de-port pi@IP-du-serveur:/home/LOGIN-sur-serveur/video /home/pi/camera
- Créer le dossier camera
mkdir ~/camera
- Rendre le script exécutable :
sudo chmod +x ~/cameraONsvr.sh
- Pour exécuter le script à chaque démarrage, éditer le fichier /etc/rc.local et avant la ligne exit 0, inscrire ces deux lignes :
sleep 8 su -l pi -c "/home/pi/cameraONsvr.sh &"
Le Stream sur IP :
J'ai testé plusieurs logiciels, les plus emblématiques étant Motion, MJPG-Streamer, VLC ou encore GStreamer.
- Motion, utilisé avec sa version spéciale Pi, reste très lent et la visualisation du stream sur le réseau via un navigateur est inexploitable pour qui a besoin une image fluide.
- VLC ça marche, j'en parle plus bas.
- GStreamer, pas réussit à le faire fonctionner.
- MJPG-Streamer, dans sa version standard fonctionne mieux que motion, mais malgré un réglage correct, le débit d'image restitué à l'écran est très lent.
Mais il existe une version spéciale Pi qui marche très bien, c'est celle que je vais décrire tout de suite.
Le Stream sur IP live avec MJPG-Streamer raspicam :
- Installer MJPG-Streamer raspicam
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev libjpeg62-dev cmake git clone https://github.com/jacksonliam/mjpg-streamer.git ~/mjpg-streamer cd ~/mjpg-streamer/mjpg-streamer-experimental make clean all sudo mv ~/mjpg-streamer/mjpg-streamer-experimental /opt/mjpg-streamer sudo rm -rf ~/mjpg-streamer
- Une commande pour streamer, qu'on pourra intégrer dans un script à mettre au démarrage (voir plus haut) :
LD_LIBRARY_PATH=/opt/mjpg-streamer/ /opt/mjpg-streamer/mjpg_streamer -i "input_raspicam.so -fps 25 -q 10 -x 640 -y 480" -o "output_http.so -p 9000 -w /opt/mjpg-streamer/www" &
- Pour sortir sur le web, il faudra bien entendu ouvrir le port 9000 (ou autre au choix) sur le routeur ou la machin-box.
- Pour intégration à un site web, créer la page de visualisation du flux :
stream.html :
<img src="http://IP-Publique:9000/?action=stream" />
Et voici le code à intégrer à sa home page pour avoir une vignette cliquable vers la page de visualisation du flux :
<a href="http://DOMAINE.com/stream.html"><img src="http://IP-Publique:9000/?action=snapshot" width="270" height="190" /></a>
Vous pouvez, si au moment de lire ces lignes il est en marche, avoir un aperçu du flux et le visionner en cliquant sur la vignette de la colonne de droite.
Ça fonctionne très bien alors que le Pi est câblé en RJ45. En Wifi, l'image saccade, cf la suite.
Le Stream sur IP live, à haut débit, avec VLC :
J'ai testé deux résolution HD avec cette commande @15MBits/s, avec mon matériel réseau filaire (Routeur 100Még)
- Test en HD 1920x1080 25p :
raspivid -t 0 -w 1920 -h 1080 -fps 25 -b 15000000 -o - | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8555}' :demux=h264
Pour lire le flux, depuis un ordi du réseau, ouvrir VLC sur http://Adresse-ip-Raspberry:8555
Ça passe, mais l'image saute de temps en temps sur les mouvements rapides.
- Test en HD 1280x720 25p :
raspivid -t 0 -w 1280 -h 720 -fps 25 -b 15000000 -o - | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8555}' :demux=h264
Ça passe très bien :)
- Les mêmes tests en Wifi se sont révélés désastreux (en b/g).
En effet, j'ai découvert que contrairement à ce que j'avais cru comprendre cette clé wifi est limite-limite en terme d'alimentation autonome sur le port USB du Pi.
Quelque soit le débit demandé pour le flux vidéo, sans alimentation externe, la clé wifi perd rapidement 30 à 40% de qualité de signal, voire le contrôleur wlan0 s'arrête, plus de réseau nous dit ifconfig !
Avec l'alimentation externe, en baissant le flux@2MBits/s ça passe pour du 1280x720@25p, mais l'image saccade quelque peu.
Le flux@1MBits/s passe bien, mais forcément l'image est crade.
Voilà, donc pour une utilisation légère du wifi, la clé TL-WN725N-v2 se suffit à elle-même, sinon il faut l'alimenter. À voir pour faire des tests de débit en b/g/n, mais l'ancien routeur qui en était capable me fait des misères, alors bon…
Enregistrer le Stream sur IP live, à haut débit, avec VLC :
Ça se passe en deux commandes :
- Une pour générer le stream :
raspivid -t 0 -w 1280 -h 720 -fps 25 -b 15000000 -o - | cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8555}' :demux=h264
- L'autre à lancer depuis une autre machine pour le sauver :
cvlc http://IP-du-Raspberry:8555/ --sout file/ts:fichier.mp4
Enregistrer directement la vidéo sur un partage réseau :
Donc sur le montage sshfs vu précédemment :
raspivid -t 0 -w 1280 -h 720 -fps 25 -b 15000000 -o camera/vid.mp4
Aller plus loin et streamer de l'audio ?
J'ai une carte son USB et les quelques tests pour streamer le microphone ont été très peu concluants.
Je n'ai pas réussi à sortir une commande qui puisse streamer audio et vidéo en même temps, ni même une commande pour l'audio seul qui soit vraiment intéressante.
- Pour lister les cartes son disponibles :
cat /proc/asound/cards
Montre la carte bcm2835 en premier de la liste.
Pour indiquer au système qu'elle carte son mettre en premier, éditer /etc/modprobe.d/alsa-base.conf et remplacer
options snd-usb-audio index=-2
par
options snd-usb-audio index=0
Au prochain démarrage du Pi, cat /proc/asound/cards devrait montrer USB-Audio en premier.
- Vérifier les périphériques de capture disponibles :
arecord -l
- Enregistrer le micro en qualité CD :
arecord -f cd output.wav
- On peut relire le fichier avec mplayer ou bien :
aplay output.wav
- Pour streamer un fichier :
cvlc "fichier.mp3" --sout '#http{mux=mp3,dst=:8555}' --loop
En écoute sur un client du réseau avec VLC sur http://IP-du-Raspberry:8555
- Pour streamer sur un client en SSH !!
arecord -D plughw:1,0 -f dat | ssh -C user@IP-du-client aplay -f dat
Le son sort directement des enceintes du client, c'est beau !
Commentaires
Billet très intéressant comme à chaque fois. Est-ce à ton avis possible de réaliser le même montage mais en intégrant un client voip ? Pour réaliser un portier connecté. Par exemple, lorsque l'on appuie sur un bouton poussoir relié au GPIO, on lance un appel voip. Qu'en penses tu ? Une idée de tuto ?
Encore bravo pour ton blog, et continu comme ça, c'est tout bon.
Merci !
Oui, çà semble faisable théoriquement.
Reste en premier lieu à tester un client voip, mais là je ne puis en dire plus sans connaissance de cette genre de soft.
Les résultats pratiques décideront comme toujours de la viabilité d'un tel système.
Bon boulot, Makoto
Crois tu qu'il serait possible d'ajouter l'audio à cette vidéo puis la streamer avec ?
Merci d'avance pour ta réponse.
Comme je l'évoquais, c'est quelque chose que je n'ai pas réussi à faire pour le moment.
Hello,
mjpg-streamer est un moyen efficace pour streamer les images du module caméra.
En complément, voici 5 façons de transmettre un flux vidéo avec un Pi : http://www.magdiblog.fr/divers/rasp...
Il ne reste plus qu'à voir comment utiliser les compression H264 matériel :/