Streaming depuis la Raspberry Camera

Date: 30/05/2013 | Catégories: Gstreamer,Hardware,Open-source,Planet-libre,Video | Tags: ,,,

Après une rapide présentation de la Raspberry Camera 5M (voir ce précédant billet), entrons 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 d'un "baby video phone" à  un "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 sur 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).

Installation des composants GStreamer

On commence par installer GStreamer sur notre Raspberry PI. Pour cela on saisi la commande suivante:

L'installation va prendre un certain temps. Passiensa !

Pour vérifier que les composants ont été correctement installé, saisir la commande suivante:

Qui devrait afficher les chiffres suivants (qui peuvent varier légèrement selon votre configuration):

Total count: 233 plugins, 695 features

Lancement de la diffusion (streaming) sur le Raspberry

On utilise la pipeline suivante:

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 à adapté 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

Note: attention au dimensionnement de votre réseau si vous utilisez des débits élevés, en effet même avec des bornes Wifi ressentes, il est difficile de garder un débit constant de 5 Mbps (Full HD).

Note 2: 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).

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:

La qualité de la vidéo est très bonne, fluide. On note quelques retard quand on sollicite le réseau en parallèle mais cela semble normal vu les débits utilisés.

Lecture streaming Raspberry Pi Camera 720p

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.

Conclusion

J'espère que cette rapide introduction sur le streaming vidéo depuis le Raspberry vous a donné des idées que vous aller vous empresser de nous faire partager dans les commentaires ci-dessous !

Retrouvez mes articles sur l’écosystème Raspberry Pi en cliquant ici.

  • Merci pour tes articles sur la camera du Raspberry Pi, c’est super intéressant.

    • Fabrice

      merci pour vos articles. sinon quelqu’un a réussit à faire fonctionner ?

      raspivid -t -0 -w 480 -h 260 -fps 25 -b 800000 -p 0,0,640,480 -o – |
      gst-launch -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96
      ! gdppay ! tcpserversink host=192.168.1.101 port=5000

      cela rend la main aussi.

      merci a vous

  • Laurent Decheau

    Personnellement je fais ça avec « motion », je trouve ca plus leger, surtout si tu ne te sers pas de la detection de mouvement. De plus l’aspect WEB est plus sympa pour le cross plateform.

    • A ma connaissance Motion ne fonctionne pas, pour l’instant, avec la Raspberry Camera car celle-ci n’est pas vu dans le système comme un device video standard (/dev/video).

  • Professeur Shadoko

    Très intéressant. Quel est le délai entre l’image réelle et la réception sur le poste client? Avec Motion et une webcam j’obtiens 1 seconde environ, est-ce plus court?

    • Difficile de faire une mesure précise mais je dirais moins de 500ms.

  • geronimo

    merci pour l’info, ça devient intéressant. Deux remarques:

    – quid de la lecture depuis un pc sous window$? si tu as des infos je suis preneur

    – ce qui serait vraiment le panard serait de pouvoir associer le raspberry avec le nas synology, les caméras ip reconnues sont ici;http://www.synology.fr/support/camera.php?lang=fre

    PS; pour ma première question, si j’ai bien compris pas de gstreamer sous M$ mais par contre un projet parallèle;
    http://code.google.com/p/ossbuild/
    je vais tester ça au plus vite:!

    • GStreamer existe sous Windows:
      ici – http://docs.gstreamer.com/display/GstSDK/Installing+on+Windows
      ou là – https://code.google.com/p/ossbuild/downloads/detail?name=GStreamer-WinBuilds-SDK-GPL-x86.msi

      C’est une solution un peu lourde mais qui doit fonctionner pour récupérer le flux vidéo tout comme sous GNU/LInux.

      Une autre solution est de modifier le serveur tournant sur le Raspberry pour faire du streaming RTSP lisible par exemple par VLC. Si des lecteurs peuvent faire l’exercice, cela serait super !

      • geronimo

        mais que je comprenne bien, c’est du live, aucune données de sauvegardées? j’ai demandé en parallèle chez synology si un upgrade à venir pourrait gérer les caméra raspberry. Merci en tout cas pour ton travail, je vais pouvoir enfin surveiller tous mes collègues, mouhahaha

        • Oui c’est du streaming live. Pas de sauvegarde, sauf si tu modifies la pipeline coté client pour afficher et sauver dans un fichier en même temps…

          • geronimo

            j’ai reçu ma caméra de Noël 🙂
            après test voici ce qui marche le mieux dans mon cas:
            raspivid -o – -w 920 -h 540 -t 9999999 |cvlc -vvv stream:///dev/stdin –sout ‘#rtp{sdp=rtsp://:8554/}’ :demux=h264
            ensuite je l’attaque coté client avec VLC; source ici: http://sammit.net/raspberry-pi-camera-streaming-to-vlc-player/
            je vais ensuite essayer de faire du streaming tout en lançant un time-laps de 4 photos le midi, chaque jour. je ne suis pas certains que les deux fonctionnent en simultanés…
            Enfin j’essaie de trouver une solution pour enregistrer ma vidéo « streamée » sur mon NAS, mais tu parles d’un enregistrement coté client, je souhaite plutôt trouver la solution coté serveur. A suivre!

          • ramzi

            Bonjour,
            rien ne t’empêche d’enregistrer coté serveur en lançant vlc par exemple.

  • Pingback: Visto nel Web – 81 | Ok, panico()

  • Edouard

    ça veut pas 🙁

    pi@raspberrypi ~ $ raspivid -t -1 -w 480 -h 260 -fps 25 -b 800000 -p 0,0,640,480 -o – | gst-launch -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=192.168.2.201 port=5000
    Définition du pipeline à PAUSED…
    Le pipeline est en phase de PREROLL…
    /GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:src: caps = video/x-h264, width=(int)480, height=(int)260, parsed=(boolean)true, stream-format=(string)avc, alignment=(string)au
    /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:sink: caps = video/x-h264, width=(int)480, height=(int)260, parsed=(boolean)true, stream-format=(string)avc, alignment=(string)au
    Le pipeline a terminé la phase PREROLL…
    Passage du pipeline à la phase PLAYING…
    New clock: GstSystemClock
    EOS reçu de l’élément « pipeline0 ».
    Execution ended after 5732792 ns.
    Définition du pipeline à PAUSED…
    Définition du pipeline à READY (prêt)…
    /GstPipeline:pipeline0/GstRtpH264Pay:rtph264pay0.GstPad:sink: caps = NULL
    /GstPipeline:pipeline0/GstH264Parse:h264parse0.GstPad:src: caps = NULL
    Définition du pipeline à NULL…
    Libération du pipeline…

    ça rend la main. Une idée?? J’ai du changer port 5000 par port=5000 au passage.

    • Edouard

      rien?

      • Edouard

        Bon ba j’ai trouvé, 2e erreur dans la ligne de commande indiqué, le -t 0 et non -1 pour le timeout infini! Si ça peut aider ceux qui ont une cam rpi 😉

  • Ramzi Aid

    Merveilleux, c’est exactement ce que je cherchais pour faire de mon Rasp une camera IP. j’attends la livraison de la camera pour tester tout ceci. D’ailleurs y a t-il des support pour bien fixer la camera?

  • Yoann

    Merci pour ce tuto, voici ce que j’ai essayé avec succès pour un stream rstp:

    raspivid -t 0 -w 800 -h 600 -fps 25 -g 5 -b 4000000 -vf -n -o – | gst-launch -v fdsrc ! h264parse ! gdppay ! tcpserversink host=127.0.0.1 port=5000

    Puis avec gst-rstp-0.10.8/exemples:
    ./test-launch « ( tcpclientsrc host=127.0.0.1 port=5000 ! gdpdepay ! rtph264pay name=pay0 pt=96 ) »

    Le stream est accessible, testé sur une tablette android avec RTSP Player:
    rtsp://192.168.0.10:8554/test

    Reste à savoir comment indiquer au server/client de perdre de frames et rester avec le moins de latence possible et garder des buffer vide.

    • jean

      l’idée est bonne, mais chez moi ça ne marche pas… cf mon commentaire en haut des commentaires (pour l’instant 😉 ) si tu as une idée, je suis preneur.

  • JCF

    Bonjour,

    Pour la premiere partie, apres correction port=5000 tout semble OK .. Mais pour la visualisation depuis un PC sous Mint 14, impossible : le fichier rtph264depay cree erreur de pipe ..

    Y a t il une solution ?
    Merci a tous

  • aem38

    question au passage ?

    ca serait cool de pouvoir se faire un judas « électronique » à partir de ce type de matériel …

    simplement en utilisant un RPI + module camera et couplant ca avec soit un micro pour détection audio (allume camera) et / soit capteur lumière pour détecter présence et mouvement …

    du style tu peux recevoir des notifications de passage devant la porte, voire carrément parler à la personne derrière la porte à distance … via skype ou autre VoIP

    Bref … vraiment génial ces petits modules !

  • jean

    bonjour,

    quand j’essaie de lire avec gst-launch depuis mon mac, j’ai cette erreur :
    WARNING: erroneous pipeline: no element « avdec_h264 »

    alors que le raspberry semble bien steamer… mais comment vérifier du coup ?

    merci.

    • mat

      bonjour
      essaye avec sudo app-get install gstreamer1.0-libav

  • jean

    j’ai finalement adopté la technique de Yohan, mais je n’arrive à visualiser uniquement la première image… pas de vidéo, mais une photo, alors que la bande passante est bien utilisée par vlc sur mon mac (le client). si je fais stop etque je relance le flux sur vlc, l’image se met à jour, mais reste fixe… une idée ? merci 🙂 jean

  • JL

    Sinon en plus simple

    raspivid -o – -t 9999999 -w 800 -h 600 –hflip | cvlc -vvv stream:///dev/stdin –sout ‘#standard{access=http,mux=ts,dst=:8091}’ :demux=h264

    Pour un streaming sur le port 8091

    lisible sur windows en passant par vlc>ouvrir un flux réseau http://192.168.0.50:8091/

    192.168.0.50 étant l’adresse IP de mon raspberri.

    Bon j’ai encore 2sec de latence mais au moins ça marche!

    • JL

      moins d’une seconde en diminuant la mise en cache

  • slimane

    merci pour m’avoir fait découvrir gstreamer
    j’ai une question
    comment on affiche du texte sur une vidéo h264, comme dans l’exemple, avec textoverlay?
    merci

    • slimane

      finalement, j’ai trouvé un moyen pour afficher du texte dynamique sur l’image, en passant par le widget de Qt.

  • Dhekra

    Merci pour ce tuto
    J’aimerais savoir,s’il serait passible d’envoyer le flux vidéo en Streaming avec une connexion 3G sur raspberry?
    merci

  • Ramzi Aid

    Bonjour,

    J’arrive à streamer la camera du Raspberry avec gstreamer et a le lire depuis un autre PC, par contre j’aimerai savoir comment enregistrer le flux dans un fichier (*.mp4 par exemple). je cherche mais je n’arrive pas à trouver.

    note: avec vlc ça marche très bien par contre il y a entre 3 et 4 seconde de retard alors qu’avec gstreamer c’est presque instantané.

  • walslayer

    Bonjour,

    Super l’article !
    Je voulais savoir s’il est possible de diffuser le flux vidéo de la caméra du raspberry sur un serveur distant (genre hébergé chez OVH ou autre) ?
    Ce qui serait super, c’est de ne pas toucher à la configuration de la box internet (pas d’ouverture de port ou autre).
    Merci.

  • MarionFlyAgain

    Bonjour,
    Merci pour ces supers articles, ils sont vraiment claires et très interessants.
    J’ai un problème au quel je ne trouve pas de solution. J’arrive à lancer depuis mon raspberry pi gstream (je remplace le host par m’adresse de mon pi) mais quand je tape la ligne de commande sur mon ordinateur, qui est relier en réseau ethernet au pi, j’ai une erreur : ERROR: pipeline could not be constructed: no element « tcpclientsrc ». auriez vous une idée d’où peut se trouver la faute?
    Merci d’avance

  • Deeps211

    J’ai un problème, quand je met la commande

    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
    ca me met :
    WARNING: erroneous pipeline: no element « port »

    et pourtant j’ai changé l’ip pour mettre celle de mon rpi

    • Il y a une coquille dans l’article, il manque un « = » :

      port=5000

  • TuxThib

    Bonjour,
    J’ai quelques questions. ^^ Je voudrais faire du streaming avec la caméra de mon raspberry et mon téléphone android ( avec le moins de latence possible). J’ai une pi caméra.

    Je trouve que les commande ci-dessus marche particulièrement bien. Mais je n’arrive pas à trouver comment l’intégrer dans une app android avec GStreamer.

    J’ai par exemple cette application : https://bitbucket.org/coisme/simplemjpegview_gst/wiki/Home mais le flux est en MJPEG.

    Je cherche donc l’équivalent mais qui marche avec les commandes de cet article.
    Si vous avez des idées ou des sources .

    Merci de votre aide :]

  • Pingback: Video Raspberry | Pearltrees()

  • Pingback: Video Raspberry | Pearltrees()

  • Pingback: Video Raspberry | Pearltrees()

  • Pingback: Video Raspberry | Pearltrees()

  • Magdiblog

    Le streaming vidéo avec le Pi reste un sujet à peaufiner à mon avis.

    Parmis toutes les méthodes possibles http://www.magdiblog.fr/divers/raspberry-pi-camera-5-facons-de-faire-du-streaming/, je pense effectivement que mjpg-streamer est la meilleure solution.

  • Pingback: Raspberry Pi Camera – 5 façons de faire du streaming | MagdiBlog()

  • Aryles

    Salut j’ai une simple question , la lecture de la vidéo peut-elle se faire depuis un Mac par exemple ? si oui comment . merci

  • Pingback: Raspberry - christophebtssio | Pearltrees()