I. Découverte de la (petite) bête▲
Avec un capteur d'une résolution native de 5 mégapixels (5M) et, au niveau optique, d'une lentille de focalisation fixe, la caméra peut servir d'appareil photo (résolution maximale de 2592 x 1944 pixels) ou de caméra vidéo (format HD jusqu'à 1080p). Son poids est impressionnant, car elle ne pèse pas plus de quatre grammes pour un volume de L25 x l20 x H9 (en millimètres).
II. Installation de la caméra▲
On commence par brancher la caméra sur l'interface CSI. Il faut y aller doucement et sans trop forcer. Je vous conseille de visualiser la vidéo suivante :
Cliquez pour lire la vidéo
Il faut disposer d'une distribution Raspbian à jour avant de pouvoir activer la caméra :
sudo apt-get update &&
sudo apt-get upgrade
Puis on lance ensuite l'utilitaire Raspi-config où un nouveau menu devrait vous permettre d'activer la caméra (choix numéro 5 - Activate the camera) :
sudo raspi-config
Un reboot plus tard, vous pouvez commencer à jouer avec la caméra.
III. Utilisation de la caméra pour prendre des photos▲
Première surprise un peu désagréable : la caméra n'est pas reconnue comme un device vidéo standard (accessible via /dev/videoX). En l'état actuel des choses on ne peut donc pas l'utiliser avec une bibliothèque comme GStreamer.
Pour utiliser la caméra comme appareil photo, il faut donc passer par un utilitaire installé de base dans Raspbian : Raspistill (les sources sont disponibles sur Github).
Ce logiciel est utilisable en ligne de commande.
Prenons donc notre première « photo » en résolution maximale et à main levée (2592 x 1944  pixels) :
raspistill -o image001.jpg
La même photo avec l'option de stabilisation activée (pas de grosse différence mais je ne bougeais pas) :
raspistill -ev -o image002.jpg
Il est possible de désactiver la compression JPEG en utilisant le tag --raw (mais attention la taille des images passe à plus de 5 Mo) :
raspistill --raw -o image002.jpg
Voilà un aperçu des résultats :
 |  |
Il est bien sûr possible de fixer la résolution avec les tags -h et -w. Par exemple une photo en 1280 x 1024 :
raspistill -w 1280
-h 1024
-o image003.jpg
Documentation officielle de la commande raspistill:
raspistill
==========
--width, -w Set image width <size>
--height, -h Set image height <size>
--quality, -q Set jpeg quality <0 to 100>
Quality 100 is almost completely uncompressed. 75 is a good all round value
--raw, -r Add raw bayer data to jpeg metadata
This option inserts the raw Bayer data from the camera in to the JPEG metadata
--output -o Output filename <filename>.
Specify the output filename. If not specified, no file is saved. If the filename is '-', then all output is sent to stdout.
--verbose, -v Output verbose information during run
Outputs debugging/information messages during the program run.
--timeout, -t Time before takes picture and shuts down.
The program will run for this length of time, then take the capture (if output is specified). If not specified, this is set to 5 seconds
--timelapse,-tl Timelapse mode.
The specific value is the time between shots in milliseconds. Note you should specify %d at the point in the filename where you want a frame count number to appear. e.g.
-t 30000 -tl 2000 -o image%d.jpg
will produce a capture every 2 seconds, over a total period of 30s, named image1.jpg, image2.jpg..image15.jpg.
--thumb, -th Set thumbnail parameters (x:y:quality)
Allows specification of the thumbnail image inserted in to the JPEG file. If not specified, defaults are a size of 64x48 at quality 35.
--demo, d Run a demo mode <milliseconds>
This options cycles through range of camera options, no capture is done, the demo will end at the end of the timeout period, irrespective of whether all the options have been cycled. The time between cycles should be specified as a millisecond value.
--encoding, -e Encoding to use for output file
Valid options are jpg, bmp, gif and png. Note that unaccelerated image types (gif, png, bmp) will take much longer to save than JPG which is hardware accelerated. Also note that the filename suffix is completely ignored when encoding a file.
--exif, -x EXIF tag to apply to captures (format as 'key=value')
Allows the insertion of specific exif tags in to the JPEG image. You can have up to 32 exif tge entries. This is useful for things like adding GPS metadata. For example, to set the Longitude
--exif GPS.GPSLongitude=5/1,10/1,15/100
would set the Longitude to 5degs, 10 minutes, 15 seconds. See exif documentation for more details on the range of tags available; the supported tags are as follows.
IV. Utilisation de la caméra pour capturer des vidéo▲
Tout comme pour les photos, il faut passer par l'utilitaire Raspivid (les sources sont disponibles sur Github). Le logiciel va permettre de générer des vidéos au format H.264.
Capturons notre première vidéo en full HD (1080p) pendant 10 secondes (-t 10000) :
raspivid -t 10000
-o video001.h264
La vidéo est stockée au format H.264 dans le fichier video001.h264. Pour lire cette vidéo sur votre Raspberry, vous pouvez utiliser la commande omxplayer qui va utiliser le GPU interne et afficher la vidéo d'une manière fluide sans consommation CPU.
omxplayer video001.h264
On peut voir que la qualité du capteur est au rendez-vous, la vidéo est lumineuse et fluide, comparable à ce que l'on peut obtenir avec un bon smartphone.
Pour activer la prévisualisation de la vidéo dans un coin de l'écran (position 0 x 0 et taille de 640 x 480) on peut utiliser l'option -p:
raspivid -t 10000
-p 0
,0
,640
,480
-o video0012.h264
Documentation officielle de la commanderaspivid :
raspivid
========
--width, -w Set image width <size>
Width of resulting video. This should be between 64 and 1920.
--height, -h Set image height <size>
Height of resulting video. This should be between 64 and 1080.
--bitrate, -b Set bitrate.
Use bits per second, so 10MBits/s would be -b 10000000. For H264, 1080p a high quality bitrate would be 15Mbits/s or more.
--output -o Output filename <filename>.
Specify the output filename. If not specified, no file is saved. If the filename is '-', then all output is sent to stdout.
--verbose, -v Output verbose information during run
Outputs debugging/information messages during the program run.
--timeout, -t Time before takes picture and shuts down.
The program will run for this length of time, then take the capture (if output is specified). If not specified, this is set to 5seconds
--demo, d Run a demo mode <milliseconds>
This options cycles through range of camera options, no capture is done, the demo will end at the end of the timeout period, irrespective of whether all the options have been cycled. The time between cycles should be specified as a millisecond value.
--framerate, -fps Specify the frames per second to record
At present, the minimum frame rate allowed is 2fps, the maximum is 30fps. This is likely to change in the future.
--penc, -e Display preview image *after* encoding
Switch on an option to display the preview after compression. This will show any compression artefacts in the preview window. In normal operation, the preview will show the camera output prior to being compressed. This option is not guaranteed to work in future releases.
V. Streaming depuis la Raspberry Camera▲
Entrons maintenant dans le vif du sujet avec une utilisation pratique : le streaming « live » du flux vidéo vers une autre machine de votre réseau. Les applications peuvent aller du « baby video phone » à l'« interphone vidéo » pour votre maison en passant par toutes les autres choses qui vous passent par la tête !
Actuellement, la camera dispose d'un logiciel spécifique Raspivid (dont les sources sont disponibles sur Github), pour capturer et encoder en H.264 la vidéo dans un fichier ou bien sûr le flux standard de sortie (stdout). C'est cette dernière particularité que nous allons exploiter afin de rediriger le flux vidéo vers une pipeline GStreamer qui va s'occuper du streaming vers notre machine cible (celle ou l'on souhaite voir la vidéo).
V-A. Installation des composants GStreamer▲
On commence par installer GStreamer sur notre Raspberry Pi. Pour cela, on saisit la commande suivante :
sudo apt-get install gstreamer-tools gstreamer0.10
-plugins-base gstreamer0.10
-plugins-good gstreamer0.10
-plugins-bad gstreamer0.10
-plugins-ugly
L'installation va prendre un certain temps. Passiensa !
Pour vérifier que les composants ont été correctement installés, saisir la commande suivante :
gst-inspect
Qui devrait afficher les chiffres suivants (qui peuvent varier légèrement selon votre configuration) :
Total count: 233
plugins, 695
features
V-B. Lancement de la diffusion (streaming) sur le Raspberry▲
On utilise la pipeline suivante :
raspivid -t 0
-w 1280
-h 720
-fps 25
-b 2500000
-p 0
,0
,640
,480
-o - |
gst-launch -v fdsrc !
h264parse !
rtph264pay config-interval
=
1
pt
=
96
!
gdppay !
tcpserversink host
=
192
.168
.0
.9
port 5000
Détaillons un peu cette ligne de commande. La première partie est dédiée à Raspvid et s'occupe de l'encodage H.264. Les paramètres sont très importants pour avoir une qualité vidéo conforme à vos besoins. Ainsi, dans mon exemple, je n'y suis pas allé avec le dos de la cuillère, car j'ai opté pour une résolution HD 720p (-w 1280 -h 720) à 25 images par seconde (-fps 25) pendant un temps infini (-t -1).
Pour le streaming, le paramètre de débit (bitrate, -b 2500000) est primordial, car il va fixer le débit sortant de la vidéo (à 2.5 Mbps dans mon exemple).
Ce débit est à adapter selon votre résolution. Après quelques tests, voici une table indicative des débits à utiliser :
- SD Low : -w 480 -h 260 -fps 25 -b 800000
- SD Medium : -w 640 -h 360 -fps 25 -b 1200000
- SD High : -w 960 -h 540 -fps 25 -b 1800000
- HD Ready : -w 1280 -h 720 -fps 25 -b 2500000
- Full HDÂ : -w 1920 -h 1080 -fps 25 -b 5000000
Attention au dimensionnement de votre réseau si vous utilisez des débits élevés, en effet même avec des bornes Wifi récentes, il est difficile de garder un débit constant de 5 Mbps (Full HD).
Sur le Raspberry, je conseille d'utiliser l'interface Ethernet et pas un dongle Wifi, surtout avec des résolutions importantes.
La commande passe ensuite la main à GStreamer qui va encapsuler le flux H.264 dans un conteneur RTP puis créer le serveur TCP en écoute des clients (il faudra penser à remplacer l'adresse IP par celle de votre Raspberry Pi).
V-C. Lecture de la vidéo depuis une autre machine▲
J'ai fait le test depuis mon portable Ubuntu 13.04 en saisissant la ligne de commande suivante pour récupérer et afficher la vidéo :
gst-launch-1
.0
-v tcpclientsrc host
=
192
.168
.0
.9
port
=
5000
  !
gdpdepay !
rtph264depay !
avdec_h264 !
videoconvert !
autovideosink sync
=
false
La qualité de la vidéo est très bonne, fluide. On note quelques retards quand on sollicite le réseau en parallèle mais cela semble normal vu les débits utilisés.
Ce qui est très impressionnant au niveau du Raspberry, c'est la faible consommation CPU. En effet, Raspivid ne dépasse pas les 2 % (merci le GPU) et GStreamer les 25 %. On peut sans aucun problème laisser tourner le tout sans risque de surchauffe.
VI. Conclusion▲
Pour moins de 60 €, il est donc possible d'avoir un Raspberry Pi model B + Camera qui vous ouvre la porte à pas mal de possibilités. J'espère rapidement voir apparaître une API (en Python par exemple) permettant de programmer directement la caméra.
J'espère également que cette rapide introduction sur le streaming vidéo depuis le Raspberry vous a donné des idées.
VII. Remerciements Developpez▲
L'équipe Systèmes Embarqués tient à remercier nicolargo pour la rédaction de ce tutoriel.
Nos remerciements à f-leb pour sa relecture orthographique et sa gabarisation.
N'hésitez pas à commenter cet article ! 9 commentaires