Un petit pense-bête pour moi, et peut-être pour toi pourquoi pas.

Je m’intéresse à Node.js, surtout pour connaître une chose de plus 🙂

L’idée est de streamer la caméra de ma p’tite framboise via un serveur web.

Après quelques recherches, Node.js devrait être capable de faire le job.
Reste encore la question des performances, mais je vais tenter le coup.
Après une bonne journée de recherche google, de lecture de forums, etc, je vais essayer de résumer toutes les parties d’infos trouvées en un seul lieu.. J’ai bien dis, essayer… :p

C’est parti, heu, armes-toi de patience, certaines parties sont…longuettes…

 

Pour te faire patienter, voici le résultat: http://www.cloudup.ch:8088/

 

J’ai également fait une petite app pour iOS, « eRaspiStream », qui pour l’instant est en attente de validation chez Apple.. Bientôt des nouvelles concerant ceci.
Update 29.06.2015
L’application n’est toujours pas validée par Apple, mais une version 1.2 est en préparation, le tout en swift2.

 

  1. Mettre à jour notre RaspberryPi, revoir les notes
  2. Installer Node.js dernière version pour arm: (pas envie de compiler)
    wget http://node-arm.herokuapp.com/node_latest_armhf.deb
    sudo dpkg -i node_latest_armhf.deb

    Vérification, on affiche les versions des deux outils qui nous intéressent:

    node -v
    npm -v

    devrait vous afficher respectivement quelque chose comme
    v0.12.1 et 2.5.1

  3. Valider Node.js
    Voici un tout petit script qui se comporte comme un serveur web, je ne décortiquerai pas ici le scripts, d’autres l’ont fait avant moi.Copier ce qui suit dans un fichier monpremiernode.js, que l’on édite avec « vi »

    vi monpremiernode.js
  4. # monpremiernode.js
    # 20150504 - eddy martignier
    # serveur web qui écoute le port 8080
    var http = require('http');
    var server = http.createServer(function(req, res) {
      res.writeHead(200);
      res.end('Mon premier script node.js fonctionne');
    });
    server.listen(8080);

    Depuis un navigateur, entrez l’adresse de votre framboise suivi de :8080, exemple:

    http://192.168.1.34:8080

    doit afficher:

    mon premier script node.js fonctionne.
  5. Compiler h264 et ffmpeg
    je te préviens, c’est long… je recherche une solution plus rapide, mais bon, on est là pour tester, alors, testons…

    cd /usr/src
    git clone git://git.videolan.org/x264
    cd x264
    ./configure --host=arm-unknown-linux-gnueabi --enable-static --disable-opencl
    make
    sudo make install

    et ffmpeg, qui met vraiment long à compiler, soyez paaaatient…
    Sur un RaspberryPi modelB v1 sans overclock, 4h10
    Sur un RaspberryPi 2, 1h02

  6. cd /usr/src
    git clone git://source.ffmpeg.org/ffmpeg.git ffmpeg
    cd ffmpeg
    sudo ./configure --arch=armel --target-os=linux --enable-gpl --enable-libx264 --enable-nonfree
    make
    sudo make install
  7. Le point:
    OK, on fait le point vite fait. On à node.js, et ffmpeg fonctionnel.
    Il va falloir s’occuper maintenant de la partie serveur, je vais pas non plus m’allonger sur le sujet, d’autres s’en sont occupés largement.
    Voici la solution que j’ai adopté, en tombant sur cet article que je t’invites grandement à lire!

    http://phoboslab.org/log/2013/09/html5-live-video-streaming-via-websockets

    C’est l’article qui m’a permis de tout rassembler.

    Voici donc la suite:

  8. JSMPEG
    est une suite de scripts javascript juste top pour ce qu’on veut faire.
    Tu peux la télécharger ici:

    https://github.com/phoboslab/jsmpeg

    – copie le fichier « stream-server.js » sur ton raspberry, par exemple dans /Scripts/streamtest/ (par scp ou what else, samba, etc… 😉 )
    – copie « jsmpg.js » et « stream-example.html » dans un dossier « raspistream » sur ton bureau ou ailleurs, tant que tu le retrouves.

  9. WebSocket pour node.js
    Sur le raspberry, aller dans /Scripts/streamtest/ (là ou tu à copié « stream-server.js »)

    npm install ws
  10. Lancer le serveur de stream:
    node stream-server.js un-mot-de-passe
  11. FFMPEG pour capturer et encoder notre RaspiCam
    Toujours sur notre raspberry, on va lancer la commande ffmpeg qui s’occupera de la capture et encodage de notre PiCam.

    ffmpeg -s 320x240 -f video4linux2 -i /dev/video0 -f mpeg1video -b 800k -r 30 http://localhost:8082/un-mot-de-passe/320/240/

    Et là… c’est le drame… on ne trouve pas de device dans /dev/video0… grrrrr, encore quelques recherches et! Yes, solution!

  12. UV4L 
    http://www.raspberrypi.org/forums/viewtopic.php?f=43&t=74949
    cet article m’apporta la solution sous forme de lien suivants:
    http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14On installe!

    curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

    Ajouter cette ligne à /etc/apt/sources.list

    deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main
  13. sudo apt-get update
    sudo apt-get install uv4l uv4l-raspicam
    sudo apt-get install uv4l-raspicam-extras

    Normalement, magie, ls /dev/video0 devrait être présent.

    On peut prendre une photo pour valider:
    dd if=/dev/video0 of=snapshot.jpeg bs=11M count=1

     

  14. On à toute les pièces, on rassemble le puzzle:
    – Le serveur node.js tourne et attends les connections de la caméra (via ffmpeg) mais aussi du client.C’est la petite limitation, il faut que le client (le navigateur donc) supporte le protocole WebSocket.
    Mais bon, petite limitation, car Safari, Firefox et Chrome sont compatible.Il est temps de lancer la commande ffmpeg:

    ffmpeg -s 320x240 -f video4linux2 -i /dev/video0 -f mpeg1video -b 800k -r 30 http://localhost:8082/un-mot-de-passe/320/240/

    Le serveur node.js vas indiquer « Stream Connected: »

  15. Et on regarde comment alors?
    Au point 8, tu as dû copier des fichiers dans un dossier « raspistream » sur ton bureau ou documents…
    Edite le fichier html, et modifie l’adresse du serveur ws:// avec l’ip de ton raspberry.
    Ouvre ensuite le fichier HTML dans un des naviguateurs compatible.
    Le serveur node.js va indiquer « New WebSocket Connection« 

 

On peut aussi dédier la tâche serveur sur une autre machine, il suffit ensuite de jouer avec la config des différentes ip 🙂

 

Voilà, pour la suite, je te laisse faire, les possibilités sont grandes, have fun! 😉

 

D’autres ressources non-citées:

  • http://www.jeffreythompson.org/blog/2014/11/13/installing-ffmpeg-for-raspberry-pi/
  • http://weworkweplay.com/play/raspberry-pi-nodejs/
  • http://openclassrooms.com/courses/des-applications-ultra-rapides-avec-node-js/une-premiere-application-avec-node-js