まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Pi Camera et Streaming video

dsc00329.jpgMe revoici donc, après les petits ennuis matériel évoqués, avec l'idée de streamer la caméra du Raspberry en IP.


dsc00330.jpgAu 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

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 dsa

Laisser le chemin par défaut (/home/pi/.ssh/id_dsa) et laisser la demande de passphrase vide.

  • Copier la clé publique sur le serveur :
sudo ssh-copy-id -i /home/pi/.ssh/id_dsa.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

1. Le jeudi, 18 septembre 2014, 09:37 par Simplearetenir

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.

2. Le jeudi, 18 septembre 2014, 19:25 par Makoto

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.

3. Le mercredi, 1 octobre 2014, 16:21 par Progi1984

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.

4. Le jeudi, 2 octobre 2014, 20:09 par MaKoTo

Comme je l'évoquais, c'est quelque chose que je n'ai pas réussi à faire pour le moment.

5. Le mercredi, 4 février 2015, 15:11 par Olivier

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 :/

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet