La caméra du Raspberry Pi : comment streamer de la vidéo vers l’iPhone

Depuis un moment, je joue avec le Raspberry Pi, et la fondation à l’origine du projet a sorti récemment une caméra à un prix modique (moins de 25 €) avec un capteur très correct : 5 mégapixels et la possibilité de faire du 1080p. Voici donc un tutorial (assez technique, soyez prévenus) pour effectuer du streaming entre le Raspberry Pi et un appareil Apple (iPhone, iPad, Mac, etc.).

Ça marche aussi avec la caméra infrarouge (NoIR) du Raspberry Pi.

Ce qu’il faut : un Raspberry Pi, la caméra et une connexion réseau pas trop mauvaise.

Je ne vais pas vous présenter la caméra, et je vais traiter ici un cas précis. Tout ce qu’il y a savoir, c’est que la caméra utilise un capteur proche de celui de l’iPad, capable de filmer en 1080p.

La caméra

La caméra

Première chose à faire une fois que la caméra est branchée, mettre à jour le système et activer la caméra avec les trois commandes suivantes.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install dh-autoreconf
sudo raspi-config

La majorité des tutoriaux vous expliqueront comment faire du streaming avec VLC ou avec Flash, ce qui n’est pas très pratique avec un Mac ou un iPhone. Ici, on va faire du streaming en HLS (HTTP Live Streaming), un protocole Apple qui marche avec QuickTime, Safari sur Mac, iOS en général et quelques versions d’Android. Ce n’est donc pas universel, mais ça a le mérite de fonctionner.

Pour le moment, ça envoie uniquement la vidéo, avec un décalage de 20 secondes environ. Pour le son, c’est a priori possible, mais je n’ai pas de Micro USB pour le moment et la caméra du Raspberry Pi ne gère que la vidéo. Je mettrais éventuellement à jour avec le son.

Les deux caméras

Les deux caméras

Première chose, il faut un FFMPEG à jour, donc pas celui de la Raspbian. Attention, ça prend du temps et il faut un peu de place sur la carte SD (au moins 500 Mo pour être sûr), donc préférez une carte SD de 8 Go.

sudo aptitude remove ffmpeg
sudo mkdir ffmpeg
sudo chown `whoami`:users ffmpeg
git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
cd ffmpeg
./configure
make
sudo make install

La compilation peut prendre plusieurs heures.

Ensuite, il faut un petit programme qui s’appelle PSIPS, qui contient ce qu’il faut pour faire du streaming.

git clone git://github.com/AndyA/psips.git
cd psips
./setup.sh
./configure
make
sudo make install

Enfin, il faut un serveur Web. J’utilise Apache, même si Nginx est sûrement plus adapté.

sudo apt-get install apache2 php5 libapache2-mod-php5
sudo /bin/hostname -F /etc/hostname
sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart

Pour la démonstration, on va rester sur les paramètres par défaut d’Apache, qui stocke dans /var/www.

cp examples/hls.sh /var/www
cd /var/www

Maintenant, il faut modifier le fichier de script.

nano hls.sh

Il faut changer base="/usr/share/nginx/www" en base="/var/www" (en fonction de votre configuration).
Il faut changer -c:a libfaac -b:a 128k \ en -c:a aac -b:a 128k \.
Il faut changer "live/%08d.ts" < /dev/null en -strict -2 "live/%08d.ts" < /dev/null.
Il faut ajouter la ligne trap "rm stream.m3u8 segments/*.ts" EXIT à la fin du fichier.

Par défaut, le stream est en 720p à 25 images/s avec un bitrate de 1,8 mégabit/s et dure une journée. Vpous pouvez modifier la ligne qui commence par raspivid en fonction de votre installation, j’ai par exemple du inverser l’image. Un générateur en ligne permet d’obtenir la commande à utiliser.

Attention, ça reste assez violent pour la carte SD : ça écrit dessus avant d’envoyer le flux et si la carte est remplie, ça ne fonctionne plus.

Maintenant, il faut modifier le fichier index.html (nano index.html) qui se trouve dans le dossier et insérer le contenu suivant.

<html>
<head>
<title>PiVid</title>
</head>
<body>
<video controls="controls" width="1280" height="720" autoplay="autoplay" >
<source src="live.m3u8" type="application/x-mpegURL" />
</video>
</body>
</html>

Enfin (on y est presque), il suffit de lancer le script. Il va activer le streaming pour une journée, mais ça peut se modifier.

./hls.sh

Pour ouvrir le flux depuis un iPhone, un iPad, un Mac (avec Safari), il suffit de taper l’adresse IP du Raspberry Pi dans le navigateur. Dans mon cas, j’ai environ 20 secondes de décalage.

Avec QuickTime Player ou VLC, il faut ouvrir l’adresse http://IP_Raspberry/live.m3u8.

On peut aussi utiliser l’adresse Bonjour du boîtier : http://raspcamera.local./live.m3u8.

Sur iPhone

Sur iPhone


Sur un Mac

Sur un Mac

En IR

En IR

Aller plus loin

Etant donné qu’on reste sur le port 80 avec le HLS, il est assez facile d’accéder au flux depuis n’importe quel endroit, il suffit de faire une redirection du port 80 vers l’adresse IP du Raspberry Pi. Ca marche assez bien pour peu que votre connexion à Internet offre un débit correct. Je vous conseille de passer en 640 x 480 avec un débit de 700 kilobits/s, l’image reste assez correcte et une ligne ADSL rapide devrait arriver à uploader sans trop de soucis avec ce débit.

Petit truc à savoir, ça peut aider, on peut couper la LED de la caméra avec la commande suivante dans le fichier /boot/config.txt.

disable_camera_led=1

Seconde petite chose à savoir si jamais vous filmer en local, il est possible de transformer les fichiers .h264 (fichiers bruts) en .mp4 lisibles par QuickTime assez facilement. Il faut installer un petit soft (première ligne) puis lancer la seconde commande.

sudo apt-get install gpac
MP4Box -add filename.h264 filename.mp4

Pour le reste, la caméra est disponible sur RS Online pour environ 25 € et le Raspberry Pi chez eux ou chez Amazon (ça paye les bidouilles).

Pour ceux qui veulent jouer avec la version qui capte l’infrarouge, un simple projecteur infrarouge sur eBay suffit à éclairer une petite pièce, et ça se trouve pour une dizaine d’euros.