md
Webcam en streaming sécurisé avec MJPG-Streamer sur un Raspberry Pi
2018-04-11
Mise à jour : 2018-04-23

Il existe un certain nombre de blogues qui expliquent comment diffuser la sortie vidéo d'une caméra web connectée à un Raspberry Pi. Plusieurs sont malheureusement périmés. C'est le sort de toutes les instructions, les choses changent. Je ne peux donc pas dire combien de temps sera utile ce billet montrant comment j'ai ajouté MJPG-Streamer à mon serveur domotique.

Table des matières

  1. Matériel
  2. Logiciel
  3. Sécurité
  4. Autres Clients : VLC, Kodi et Domoticz
  5. Un nouveau script
  6. Contrôle à distance
  7. Caméra lente
  8. Téléchargements

  1. Matériel
  2. Un Raspberry Pi Modèle B + v1.2 héberge mon système domotique basé sur Domoticz. C'est la quatrième itération de l'ordinateur monocarte de la Fondation Raspberry Pi qui date de juillet 2014. Il utilise un système Broadcom BCM2835 sur puce (SoC) ainsi que 512 Mo de RAM partagée entre le CPU (ARM1176jZF-S: 32 bits, à coeur unique, 700 MHZ, ARM v6) et le GPU (Broadcom BCM2837). Puisque le Raspberry Pi fonctionne comme un serveur sans tête, le minimum de 16 Mo de RAM est alloué au GPU. C'était le premier Raspberry Pi à avoir quatre ports USB 2.0 et à utiliser une carte microSD pour le stockage. Bien qu'il y ait un port Ethernet 100 Mbit/s sur la carte, la connexion au réseau local est réalisé avec c'est avec un dongle WiFi.

    Le système d'exploitation est Raspbian (Jessie) une version de Debian 8 modifiée pour le Raspberry Pi. Il existe une version plus récente, mais il y avait des problèmes associés aux bibliothèques libssl1 et libssl-dev à l'installation de Domoticz avec Stretch (Debian 9) que je ne pouvais pas surmonter (voir SSL protocol issue #2062). J'ai donc dû utiliser la dernière version de Jessie Lite qui est toujours disponible auprès de la Fondation Raspberry Pi.

    La dernière version de Domoticz (version 4.9700) fonctionne avec la dernière version de Raspbian Stretch Lite (version: juin 2018, noyau: 4.14).

    Cependant, j'ai rencontré des problèmes avec la connexion sécurisée du flux vidéo, comme décrit ci-dessous. Pour une raison quelconque, je peux obtenir des instantanés sécurisés via le serveur proxy lighttpd sécurisé, mais pas le flux vidéo. Si jamais je résolvais ce mystère, je mettrais à jour ce billet.

    2018-08-04.

    La caméra est une Webcam HD C270 de Logitech achetée il y a quelques années pour utilisation avec un ordinateur portable. Elle est capable de diffuser des vidéos à une résolution de 720p (1280x720 pixels, soit un format 16: 9). Le fabricant ne fournit pas de pilotes Linux pour la caméra, mais elle fonctionne avec un Raspberry Pi à cause de V4L2 (Video4Linux version 2).

    Après avoir branché l'appareil sur un port USB, et en attendant un court moment, il apparaît comme un périphérique USB.

    pi@domo:~ $ lsusb Bus 001 Device 005: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270 Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

    Puisque Video4Linux est fourni avec Raspbian, on peut s'en servir pour connaître les formats vidéos supportés par la caméra.

    pi@domo:~ $ v4l2-ctl --list-formats ioctl: VIDIOC_ENUM_FMT Index : 0 Type : Video Capture Pixel Format: 'YUYV' Name : YUYV 4:2:2 Index : 1 Type : Video Capture Pixel Format: 'MJPG' (compressed) Name : Motion-JPEG

    C'est très bien que le C270 supporte le format MJPG. Cela signifie que la caméra elle-même compresse chaque image JPG avant de la transmettre à l'ordinateur via la liaison USB. Toutes les webcams ne prennent pas en charge ce format. Dans ce cas, le Raspberry Pi aurait à effectuer une compression des images avant de les diffuser sur HTTP. Cette tâche consommerait trop de ressources d'un modeste Raspberry Pi Model B+. Plus à ce sujet plus loin.

  3. Logiciel
  4. La source évidente des instructions pour MJPG-Streamer est son créateur, mais ce dernier en a arrêté le développement sur SourceForge. Il semble que le successeur désigné est Liam Jackson (j'espère que je ne fais pas une erreur avec le nom) dont la nouvelle version est sur un site github.

    M. Jackson a considérablement simplifié l'installation: il y a deux prérequis puis on continue avec le logiciel lui-même. Il n'est plus nécessaire de faire les modifications qu'on retrouve dans plusieurs articles sur le Web.

    pi@domo:~ $ sudo apt-get install cmake libjpeg8-dev ... After this operation, 19.9 MB of additional disk space will be used. Do you want to continue? [Y/n] y ... pi@domo:~ $ wget https://github.com/jacksonliam/mjpg-streamer/archive/master.zip ... pi@domo:~ $ unzip master.zip ... pi@domo:~ $ cd mjp*g-* pi@domo:~/mjpg-streamer-master $ cd mjpg-* pi@domo:~/mjpg-streamer-master/mjpg-streamer-experimental $ make ... pi@domo:~/mpjg-streamer-master/mjpg-streamer-experimental $ sudo make install ... pi@domo:~/mjpg-streamer-master/mjpg-streamer-experimental $ cd $home

    Cela termine l'installation de base. L'exécutable est placé dans le répertoire /usr/local/bin/ qui est inclus dans la variable d'environnement PATH, le sentier de recherche. Les plug-ins d'entrée et de sortie se trouvent dans le répertoire /usr/local/lib/mjpg-streamer, les pages du serveur Web intégré se trouvent dans le répertoire /usr/local/share/mjpg-streamer/www.

    pi@domo:~ $ which mjpg_streamer /usr/local/bin/mjpg_streamer pi@domo:~ $ ls /usr/local/lib/mjpg-streamer input_file.so input_raspicam.so output_file.so output_rtsp.so input_http.so input_uvc.so output_http.so output_udp.so pi@domo:~ $ ls /usr/local/share/mjpg-streamer/www bodybg.gif javascript.html jquery.ui.widget.min.js cambozola.jar javascript_motiondetection.html LICENSE.txt control.htm javascript_simple.html rotateicons.png example.jpg java_simple.html sidebarbg.gif favicon.ico jquery.js spinbtn_updn.gif favicon.png jquery.rotate.js static.html fix.css JQuerySpinBtn.css static_simple.html functions.js JQuerySpinBtn.js stream.html index.html jquery.ui.core.min.js stream_simple.html java_control.html jquery.ui.custom.css style.css java.html jquery.ui.tabs.min.js videolan.html

    Je n'ai pas pris la peine de configurer la variable d'environnement LD_LIBRARY_PATH comme prescrit dans la page README. Démarrer MJPG-Streamer fonctionne avec un ou plusieurs plug-ins d'entrée et un plug-in de sortie. Ceci est expliqué dans le paragraphe Usage. J'ai utilisé les pluings input_uvc and the output_http.

    pi@domo:~ $ mjpg_streamer -i "input_uvc.so --help" MJPG Streamer Version.: 2.0 --------------------------------------------------------------- Help for input plugin..: UVC webcam grabber --------------------------------------------------------------- The following parameters can be passed to this plugin: [-d | --device ].......: video device to open (your camera) [-r | --resolution ]...: the resolution of the video device, can be one of the following strings: QQVGA QCIF CGA QVGA CIF PAL VGA SVGA XGA HD SXGA UXGA FHD or a custom value like the following example: 640x480 [-f | --fps ]..........: frames per second (activates YUYV format, disables MJPEG) [-q | --quality ] .....: set quality of JPEG encoding [-m | --minimum_size ].: drop frames smaller then this limit, useful if the webcam produces small-sized garbage frames may happen under low light conditions [-e | --every_frame ]..: drop all frames except numbered [-n | --no_dynctrl ]...: do not initalize dynctrls of Linux-UVC driver [-l | --led ]..........: switch the LED "on", "off", let it "blink" or leave it up to the driver using the value "auto" [-t | --tvnorm ] ......: set TV-Norm pal, ntsc or secam [-u | --uyvy ] ........: Use UYVY format, default: MJPEG (uses more cpu power) [-y | --yuv ] ........: Use YUV format, default: MJPEG (uses more cpu power) [-fourcc ] ............: Use FOURCC codec 'argopt', currently supported codecs are: RGBP ... pi@domo:~ $ mjpg_streamer -o "output_http.so --help" MJPG Streamer Version.: 2.0 --------------------------------------------------------------- Help for output plugin..: HTTP output plugin --------------------------------------------------------------- The following parameters can be passed to this plugin: [-w | --www ]...........: folder that contains webpages in flat hierarchy (no subfolders) [-p | --port ]..........: TCP port for this HTTP server [-l ] --listen ]........: Listen on Hostname / IP [-c | --credentials ]...: ask for "username:password" on connect [-n | --nocommands ]....: disable execution of commands ---------------------------------------------------------------

    Le programme est lancé avec la commande suivante. Le diffusion sera effectué à la résolution maximale de la caméra, mais à un rythme relativement lent de 10 images par seconde. Si l'option -n n'est pas spécifiée, il y aura plusieurs messages d'erreur, mais la diffusion en continue fonctionnera. Le port TCP 8085 a été spécifié pour la sortie afin de s'assurer qu'il n'y avait aucune interférence avec quoi que ce soit d'autre.

    pi@domo:~ $ /usr/local/bin/mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -n -f 10 -r 1280x720" \ > -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8085 -w /usr/local/share/mjpg-streamer/www" MJPG Streamer Version.: 2.0 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 1280 x 720 i: Frames Per Second.: 10 i: Format............: JPEG i: TV-Norm...........: DEFAULT o: www-folder-path......: /usr/local/share/mjpg-streamer/www/ o: HTTP TCP port........: 8085 o: HTTP Listen Address..: (null) o: username:password....: disabled o: commands.............: enabled

    En utilisant top dans une autre session ssh, j'ai pu voir que mjpg_streamer utilisait moins de 1% du temps CPU et moins de 2% de la RAM disponible quand il était inactif.

    pi@domo:~ $ top --------------------------------------------------------------------------------- top - 12:38:34 up 13:53, 2 users, load average: 0.19, 0.20, 0.17 Tasks: 90 total, 1 running, 89 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.0 us, 3.1 sy, 0.0 ni, 95.5 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st KiB Mem: 493252 total, 158916 used, 334336 free, 25176 buffers KiB Swap: 102396 total, 0 used, 102396 free. 86032 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23822 pi 20 0 5100 2488 2148 R 1.3 0.5 1:50.51 top 694 root 20 0 162388 13256 10668 S 1.0 2.7 8:14.22 domoticz 24893 pi 20 0 49952 9040 8680 S 0.7 1.8 0:15.07 mjpg_streamer 364 avahi 20 0 3984 2704 2380 S 0.3 0.5 0:14.96 avahi-daemon

    J'ai ensuite regardé le flux vidéo de mon ordinateur de bureau avec un navigateur Web à l'adresse suivante: http://domo.local:8085/stream_simple.html. Avec mes tablettes, je dois utiliser l'adresse IP explicite du Raspberry Pi, car Android ne semble pas prendre en compte le protocole Zeroconf. Comme on peut le voir ci-dessous, mjgp_streamer utilisait un peu plus de 8% du temps de CPU et pas plus de mémoire quand il était actif.

    top - 12:40:35 up 13:55, 2 users, load average: 0.37, 0.20, 0.16 Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.4 us, 7.1 sy, 0.0 ni, 85.7 id, 0.0 wa, 0.0 hi, 5.7 si, 0.0 st KiB Mem: 493252 total, 162780 used, 330472 free, 25140 buffers KiB Swap: 102396 total, 0 used, 102396 free. 86032 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 24893 pi 20 0 49952 9040 8680 S 8.2 1.8 0:05.06 mjpg_streamer 23822 pi 20 0 5100 2488 2148 R 1.6 0.5 1:48.06 top 694 root 20 0 162388 13256 10668 S 1.0 2.7 8:12.03 domoticz 373 mosquit+ 20 0 5504 3772 3356 S 0.7 0.8 1:57.21 mosquitto

    Ce sont de très bons résultats, ce qui signifie qu'il devrait certainement être possible d'exécuter la diffusion du flux vidéo en continu avec le Raspberry Pi B+ pourtant relativement peu performant.

    Je devrais souligner que la première fois que j'ai regardé la vidéo avec le navigateur, la vue était grandement déformée, mais l'appareil photo était clairement connecté. Le logiciel mjgp_streamer peut être arrêté avec la combinaison CtrlC. J'ai relancer le logiciel (il a fallu quelques essais) et ensuite l'image affichée sur le bureau était enfin correcte.

    Il y aura trois serveurs HTTP fonctionnant sur le Raspberry Pi:
    • Le logiciel de domotique Domoticz dispose d'un serveur intégré qui écoute aux ports TCP 8080 et 443 par défaut.
    • Un serveur HTTP autonome lighttpd qui utilise le port TCP 80. Bien que cela ne soit pas fait par défaut, si HTTPS est activé, j'utiliserais probablement le port TCP par défaut 443.
    • Le logiciel qu'on installe MJPG-Streamer a un serveur intégré qui écoute sur le port TCP 8080 par défaut.
    Il y a clairement un potentiel de conflit ici et les ports devront être assignés avec soin. C'est pourquoi le port par défaut n'a pas été utilisé pour diffuser la vidéo de la caméra USB.

  5. Sécurité
  6. La raison principale pour diffuser en direct la vidéo depuis la webcam connecté au serveur de domotique est de surveiller l'intérieur de la maison quand je suis à l'extérieur. Or il est important de penser à la sécurité lorsqu'on expose un réseau local au monde extérieur dangereux. Je me rappelle avoir lu quelque part que les caméras IP parmi les sources les plus fréquentes de violations de la sécurité sur l'Internet et c'est exactement ce qui se fait ici, en transformant une webcam en une caméra IP./p>

    Au minimum, la protection par mot de passe du logiciel doit être activée. Regardez les options -c ou --credentials du plug-in de sortie HTTP.

    pi@domo:~ $ mjpg_streamer -i "/usr/local/lib/mjpg-streamer/input_uvc.so -n -f 10 -r 1280x720" \ > -o "/usr/local/lib/mjpg-streamer/output_http.so -p 8085 -w /usr/local/share/mjpg-streamer/www/ \ > -c stream:michel" MJPG Streamer Version.: 2.0 i: Using V4L2 device.: /dev/video0 i: Desired Resolution: 1280 x 720 i: Frames Per Second.: 10 i: Format............: JPEG i: TV-Norm...........: DEFAULT o: www-folder-path......: /usr/local/share/mjpg-streamer/www/ o: HTTP TCP port........: 8085 o: HTTP Listen Address..: (null) o: username:password....: stream:michel o: commands.............: enabled

    Dorénavant, une fenêtre de vérification du nom d'utilisateur et du mot de passe apparaîtra à chaque connexion au serveur HTTP de MJPG_Streamer.

    Autrement, le nom d'utilisateur et le mot de passe peuvent être ajoutés au URL:
       username:password@<ip_of_raspberry_pi>:<mjgp_streamer_http_port>.
    Dans cet exemple particulier, il faudrait mettre stream:michel@192.168.1.22:8085 (ou stream:michel@domo.local)

    Ceci n'est qu'un début et pas très sécuritaire de toute façon. Le nom d'utilisateur et le mot de passe seront envoyés en texte clair. Il serait préférable d'utiliser le cryptage TLS. Malheureusement, ce n'est pas aussi simple qu'on le souhaiterait, car le serveur intégré de MJGP-Streamer ne gère pas le protocole HTTPS. J'ai trouvé deux solutions de contournement potentielles, mais j'en ai testé qu'un seul.

    La solution non testée est stunnel qui peut être utilisé pour ajouter des fonctionnalités TLS à des serveurs comme NNTP, SMTP et HTTP sans modifier leur code source. Voici quelques références sur le sujet.

    1. Secure webcam streaming with mjpg-streamer and stunnel de Cristiano Urban (Cris' hacks).
    2. Securing mjpg streamer de Siva Dirisala.

    L'autre solution, celle que j'utilise, repose sur les plus grandes capacités du serveur HTTP lighttpd fonctionnant déjà sur le Raspberry Pi. Pour les quelques malheureux qui n'ont pas lu tous mes billets précédents, il sert à la mise à jour sans fil du micrologiciel des commutateurs basés sur l'ESP8266 utilisés dans ma maison. L'idée est simple, accédez à lighttpd avec une connexion HTTPS sécurisée sur un port spécifié et laissez ce serveur transmettre la demande non sécurisée au serveur de MJPG-Streamer. J'avais souvent vu le termes « proxy » et « proxy inverse » mais je n'étais jamais entré dans le vif du sujet. J'ai réaliser cette façon de faire et c'est étonnamment facile. Cependant, qu'on ne me pose aucune question, ceci est le résultat de nombreuses recherches sur le web dans les petites heures du matin et beaucoup d'essais et d'erreurs. Je me sens comme l'un de ces proverbiaux singes qui parviennent à produire un sonnet de Shakespeare sur un clavier.

    Il suffit de deux petites additions au fichier de configuration de lighttpd. En premier il faut ajouter, au début du fichier, le module proxy parmi les modules chargés par le serveur. Deuxièmement, il faut une définition du serveur proxy à la fin de fichier.

    pi@domo:~ $ sudo nano /etc/lighttpd/lighttpd.conf
    server.modules = ( "mod_access", "mod_alias", "mod_compress", "mod_proxy", <-- ajouter ce module "mod_redirect", # "mod_rewrite", ) ... ajouter cette définition à la fin : # reverse proxy to provide https wrapper around mjpg_streamer # that is listening on TCP port 8085 at IP 192.168.1.22 # $SERVER["socket"] == ":4433" { ssl.engine = "enable" ssl.pemfile = "/home/pi/domoticz/server_cert.pem" proxy.server = ( "" => ( ("host" => "127.0.0.1", "port" => 8085) ) ) }

    Étant du genre paresseux, j'ai utilisé le certificat autosigné qui était installé avec le serveur Domoticz, mais tout certificat SSL pourrait être utilisé. Si lighttpd était situé sur un autre ordinateur du réseau local, l'adresse de l'hôte devrait être l'adresse IP du Raspberry Pi sur lequel MJPG-Streamer est en cours d'exécution. Puisque les deux serveurs sont sur la même machine, j'ai utilisé le IP du localhost. Comme ça, il ne sera pas nécessaire de modifier ce fichier de configuration si l'IP du Rapsberry Pi devait changer.

    Il faut repartir le serveur pour que ces modifications soient prises en charge. Du coup, ausis bien vérifier que lighttpd redémarre correctement.

    pi@domo:~ $ lighttpd -f /etc/lighttpd/lighttpd.conf -t Syntax OK pi@domo:~ $ pi@domo:~ $ sudo systemctl restart lighttpd.service pi@domo:~ $ sudo systemctl status lighttpd.service ● lighttpd.service - Lighttpd Daemon Loaded: loaded (/lib/systemd/system/lighttpd.service; enabled) Active: active (running) since Tue 2018-04-10 15:42:14 ADT; 5min ago Process: 1275 ExecStartPre=/usr/sbin/lighttpd -t -f /etc/lighttpd/lighttpd.conf (code=exited, status=0/SUCCESS) Main PID: 1284 (lighttpd) CGroup: /system.slice/lighttpd.service └─1284 /usr/sbin/lighttpd -D -f /etc/lighttpd/lighttpd.conf Apr 10 15:42:14 domo lighttpd[1275]: Syntax OK Apr 10 15:42:14 domo systemd[1]: Started Lighttpd Daemon.

    Il est temps de vérifier que la configuration du proxy fonctionne. Sur l'ordinateur de bureau connecté au même réseau que le Raspberry Pi, j'ai pointé le navigateur Web à l'adresse suivante:

      https://192.168.1.22:4433/index.html
    (ou https://domo.local:4433/). Comme un certificat SSL autosigné est utilisé, le navigateur va rouspéter et il sera nécessaire de créer une exception. Cela doit être fait qu'une seule fois par navigateur. À partir de là, les pages Web de MJPG-Streamer seront immédiatement accessibles. Cependant, comme les autres navigateurs, Chromium affiche un avertissement inquiétant à propos du lien non sécurisé.

    Qu'importe, les communications entre le navigateur Web et MJPG-Streamer sont cryptées; c'est que le navigateur n'aime pas le certificat autosigné.

    Cette vérification a été faite localement. Pour accéder au flux vidéo depuis l'extérieur du réseau local, une adresse DNS dynamique et le port TCP utilisé par lighttpd (et non le port non crypté utilisé par MJPG-Streamer) doivent être transmis par le routeur du réseau local. J'ai déjà discuté tout cela dans un billet précédent : 3. Création d'un nom de domaine dynamique, 4. Mise à jour de l'adresse IP de destination, et 5. Réacheminement de ports.

    Ensuite, allez au routeur et réacheminez un port TCP, disons 4433 pour la simplicité ou ce que vous voulez tant qu'il n'y a pas de conflit, à l'adresse IP et au port HTPPS sur lequel le proxy lighttpd écoute. Dans mon cas, il s'agit de 192.168.1.22 et 4433.

    Mon adresse DNS dynamique pour atteindre le Raspberry Pi est modom.twiligthparadox.com. Donc, pour voir la vidéo diffusée par MJPG-Streamer, j'entre l'une des adresses suivantes dans un navigateur Web.
      https://stream:michel@modomo.twilightparadox.com:4433/stream.html
      https://modomo.twilightparadox.com:4433/stream.html.
    Comme prévu, j'ai dû ajouter une exception dans Firefox à cause du certificat autosigné et le navigateur a affiché un avertissement sur l'icône sécurisée HTTPS.

    Au risque de se répéter, la communication entre le navigateur et MJPG-Streamer est cryptée.

  7. Autres Clients : VLC, Kodi et Domoticz
  8. Voici des explications rapides sur la façon d'accéder au flux vidéo à partir de trois clients qui ne sont pas des navigateurs Web.

    VLC

    Comme expliqué dans la documentation du logiciel de diffusion en continu, la vidéo peut être visionnée avec VLC de VideoLAN. Dans l'interface graphique, cliquez sur le menu Média en haut de la fenêtre, puis sélectionnez Ouvrir un flux réseau... (Ctrl-N). Entrez l'URL suivante:

      http://192.168.1.22:8085/?action=stream

    Une fenêtre de dialogue apparaîtra vous demandant le nom d'utilisateur et le mot de passe. On peut aussi spécifier le nom d'utilisateur et le mot de passe dans l'URL.

      http://stream:michel@192.168.1.22:8085/?action=stream

    L'application peut également être lancée à partir d'un terminal:

    michel@hp:~$ vlc http://192.168.1.22:8085/?action=stream

    Sur mon ordinateur de bureau, je peux utiliser le nom d'hôte local, domo.local, au lieu de l'adresse IP. Sur mes tablettes Android, ce n'est pas possible et je dois utiliser l'adresse IP numérique explicite.

    Bien sûr, si je voulais utiliser le flux crypté, j'utiliserais le protocole HTTPS avec le port 4433. Et si je le faisais depuis un ordinateur non connecté à mon réseau local, j'utiliserais le nom de domaine dynamique.

      https://[stream:michel@]modomo.twilightparadox.com:4433/?action=stream

    Comme je suis paranoïaque, je n'inclurai probablement pas le mot de passe et le nom d'utilisateur dans l'URL, ce qui permettrait de ne jamais les transmettre en clair.

    Kodi

    Pour montrer le flux dans Kodi, j'ai simplement suivi les instructions sur le Wiki. Cela ne pourrait pas être plus simple en principe. Depuis Kodi est sur un appareil Android sur le réseau local, j'ai créé un fichier texte simple, nommé webcam.strm, avec le contenu suivant.

    http://stream:michel@192.168.1.22:8085/?action=stream

    Le nom de fichier peut être quelque chose de raisonnable, je suppose, mais l'extension doit être .strm en tout temps, je pense.

    Le plus dur était de copier ce fichier sur le stockage de l'appareil. J'ai utilisé deux méthodes différentes. Le plus simple est de copier le fichier de mon bureau sur une clé USB, puis de connecter ce dernier à l'appareil Android et de copier le fichier dans un sous-répertoire du répertoire SDCard qui est ensuite accessible à partir de Kodi.

    L'autre méthode consistait à installer et à démarrer un serveur SSH/SFTP, puis à utiliser Filezilla pour copier le fichier. J'ai utilisé le serveur SSH/SFTP - Terminal par Banana Studio. Je me suis connecté sur le port 2222 en tant qu'utilisateur ssh sans mot de passe en utilisant le protocole de transfert de fichiers SFTP - SSH et cela a fonctionné sans problème. De plus, il n'y avait pas besoin de monter et descendre les escaliers.

    Quelle que soit la façon dont le fichier strm est créé sur l'appareil, il est préférable de l'ajouter à vos Favoris pour un accès rapide et facile. Utilisez le système de menu Kodi pour trouver le fichier, mettez-le en surbrillance et appuyez sur C pour l'ajouter aux favoris.

    Je ne sais vraiment pas grand-chose, en fait, rien du tout pour être honnête, sur les appareils Android TV et encore moins au sujet de Kodi, alors j'arrête cette discussion ici.

    Domoticz

    Autant que je sache, Domoticz ne transmet pas la vidéo en continu. Je dis seulement cela parce que, de temps en temps, je vois quelqu'un demander comment s'y prendre pour faire la lecture en continu d'un flux vidéo à partir de ce logiciel. Lorsque l'icône de flux vidéo est activée, je crois que Domoticz transmet simplement une séquence d'instantanés ce qui implique la création d'un fichier local pour chaque image transmise. J'utilise depuis le début la capacité du système domotique qui prend un instantané avec une caméra connectée lorsqu'un événement spécifique se produit et envoie cette image par courrier électronique. Je l'ai installé de sorte que cette image soit prise environ 2 secondes après la mise en marche ou l'extinction d'une lumière (c'est mieux lorsque la lampe est allumée). C'est un moyen peu coûteux de vérifier que tout fonctionne quand je suis absent.

    J'avais l'habitude de faire ça avec uvccapture comme expliqué dans la page Wiki de Domoticz intitulée Camera Setup. Je ne veux pas installer uvccapture puisque MJPG-Streamer contrôlera probablement la webcam en tout temps. Ce n'est pas un problème car le logiciel prend aussi des instantanés. Tout comme avec uvccapture et pour la diffusion en continu, cela se fait avec une URL, mais différente bien entendu :

      http://stream:michel@192.168.1.22:8085/?action=snapshot

    L'image montre comment configurer les paramètres de la caméra dans Domoticz.

  9. Un nouveau script
  10. Il existe de nombreux exemples de scripts bash pour démarrer et arrêter MJPG-Streamer datant de quelques années. J'en ai juste adapté un, mais je ne me souviens plus exactement lequel. J'ai enregistré le fichier sous le nom de webcam-streamer dans un répertoire caché appelé .local/bin dans mon répertoire personnel.

    pi@domo:~$ mkdir -p .local/bin pi@domo:~$ nano.local/bin/mjpg-streamer
    #!/bin/bash # adjust these INPUT_PLUGIN="/usr/local/lib/mjpg-streamer/input_uvc.so"; DEVICE="/dev/video0"; FRAMES="10"; RESOLUTION="1280x720"; OUTPUT_PLUGIN="/usr/local/lib/mjpg-streamer/output_http.so"; PORT="8085"; CREDENTIALS="-c stream:michel" # the following are defaults and should not need to be changed EXEC="/usr/local/bin/mjpg_streamer" WEB_DIR="/usr/local/share/mjpg-streamer/www"; # mjgp_streamer often does not start on first try. Why ? start_streamer(){ for i in {1..5} # try up to 5 times do ${EXEC} -b -i "${INPUT_PLUGIN} -n -d ${DEVICE} -f ${FRAMES} -r ${RESOLUTION}" -o "${OUTPUT_PLUGIN} -p ${PORT} -w ${WEB_DIR} ${CREDENTIALS}" > /dev/null 2>&1 sleep $((1+i)) # waiting progressively longer if pgrep mjpg_streamer > /dev/null then echo "mjpg_streamer started" return fi done echo "could not start mjpg_streamer" } # Carry out specific functions when asked to by the system case "$1" in start) if pgrep mjpg_streamer > /dev/null then echo "mjpg_streamer already running" else start_streamer fi ;; stop) if pgrep mjpg_streamer > /dev/null then killall mjpg_streamer echo "mjpg_streamer stopped" else echo "mjpg_streamer is not running" fi ;; restart) if pgrep mjpg_streamer > /dev/null then killall mjpg_streamer echo "mjpg_streamer stopped" else echo "mjpg_streamer is not running" fi start_streamer ;; status) pid=`ps -A | grep mjpg_streamer | grep -v "grep" | grep -v mjpg_streamer. | awk '{print $1}' | head -n 1` if [ -n "$pid" ]; then echo "mjpg_streamer is running with pid ${pid}" echo "mjpg_streamer was started with the following command line" cat /proc/${pid}/cmdline ; echo "" else echo "mjpg_streamer is not running" fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 ;; esac exit 0

    Le script essaie jusqu'à cinq fois avant d'abandonner lors du démarrage ou du redémarrage du logiciel de diffusion de la webcam. Pour une raison inconnue, démarrer le service échoue souvent lors des premiers essais.

    Le script doit être rendu exécutable et le répertoire dans lequel il se trouve sera ajouté au chemin de recherche d'environnement en éditant le fichier caché .profile dans mon répertoire personnel.

    pi@domo:~$ chmod +x .local/bin/webcam-streamer pi@domo:~$ mkdir -p .local/bin pi@domo:~$ nano .profile
    # set PATH so it includes user's private .local/bin if it exists if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi

    La modification ne prendra effet qu'au prochain redémarrage. La dernière étape consiste à ajouter une entrée de redémarrage dans crontab.

    pi@domo:~ $ crontab -e
    # Start the webcam on reboot @reboot /home/pi/.local/bin/webcam-streamer start && sleep 5 && /home/pi/.local/bin/webcam-streamer restart

    Notez comment la tâche de redémarrage cron lance le logiciel, puis le redémarre environ cinq secondes plus tard. La raison de ceci peut être tirée de l'image suivante qui est ce qu'on obtient avec seulement un lancement du logiciel après un redémarrage.

    La webcam fonctionne, mais quelque chose ne va pas. Stopper, puis repartir le service (ce que « restart » fait) arrête le flux fantomatique. Bien sûr, votre kilométrage peut varier avec différents équipements.

    Le besoin de lancer plus d'une fois MJPG-Streamer au démarrage et le flux fantomatique sont des problèmes persistants. J'ai réinstallé le logiciel sur une copie propre d'une version entièrement mise à jour de Rasbian Jessie sans aucune amélioration.

    Références
    1. Raspberry Pi Webcam Over the Internet Using MJPG-Streamer de Jacob Salmela, 2014-05-31.
    2. Setup Guide: Raspberry Pi | MJPEG Streamer Install & Setup & FFMpeg Recording de Austin St. Aubin, 2018-03-11.
    3. Raspberry Pi camera board video streaming de Miguel Mota, 2013-07-25, mise à jour 2014-01-19.

  11. Contrôle à distance
  12. Que faire si, pour une raison quelconque, MJPG-Streamer ne fonctionne pas correctement et je suis loin de la maison? À mon avis, la solution la plus simple était de créer un commutateur virtuel dans mon système domotique pour activer le script de démarrage. Ceci est rapidement fait dans Domoticz, voici un rappel de la marche à suivre.

    1. Cliquer sur l'onglet Réglages.
    2. Cliquer sur le choix Matériel dans le menu.
    3. Si le matériel virtuel Dummy (Does nothing, ...) existe déjà, passez à l'étape suivante.
      • Compléter les champs
           Nom: = Virtuel, and
           Type: = Dummy (Does nothing... qu'on sélectionne dans la liste déroulante.
      • Cliquer sur le bouton Ajouter au bas de la page. Le matériel virtuel sera rajouté au tableau au haut de la page.
    4. Cliquer sur Créer capteurs virtuels dans le matériel virtuel.
    5. Nommer le capteur (Web Cam On/Off dans cet exemple, mais choisir un nom plus adapté en réalité) et fixer le Type de capteur: à Interrupteur.
    6. Cliquer sur le bouton OK. Un message confirmant la création du dispositif apparaîtra brièvement à l'écran.
    7. Cliquer sur l'onglet Réglages à nouveau.
    8. Cliquer sur le choix Dispositifs dans le menu.
    9. Repérer le numéro d'index (colonne idx) de l'interrupteur nouvellement créé.
    10. Il faut maintenant définir les actions du dispositif virtuel.

    11. Cliquer sur l'onglet Interrupteurs.
    12. Cliquer sur le bouton Modifier de l'interrupteur virtuel créé auparavant.
    13. Dans le champ Action On:, entrer script:///home/pi/.local/bin/webcam-streamer start.
    14. Dans le champ Action Off:, entrer script:///home/pi/.local/bin/webcam-streamer stop.
    15. Cliquer sur le bouton Sauvegarder.
    16. Cliquer sur le bouton Retour pour revenir à l'onglet des interrupteurs.

    On peut voir sur l'image ci-dessus que j'ai aussi changée l'icône car celle d'une ampoule ne me semblait pas appropriée pour ce commutateur. L'icône d'une webcam est en fait tirée d'une icône déjà dans le dossier www/images de Domoticz. Voir Domoticz: give a facelift by customizing the icons pour plus de détails.

    Donc, je peux toujours lancer ou terminer la diffusion en continu de la webcam en utilisant ce contrôle. Mais il y a un problème. L'état du périphérique virtuel ne correspond pas nécessairement au statut du service. Il est cependant facile de modifier le fichier de script vu ci-dessus pour tenir compte de cet état. J'en ai aussi profité pour modifier l'installation de MJPG-Streamer. Avec un peu d'expérience je me suis rendu compte que je ne voulais pas d'un service toujours en marche. Je n'aimais pas que le voyant vert de la webcam soit toujours allumé. En principe la DEL devrait être contrôlable avec l'option -l (ou --led) du plug-in input_uvc.so mais cela ne fonctionne pas. De toute façon, j'avais un sentiment gênant que je pourrais être voyeur dans ma propre maison en train d'espionner famille et amis. Conséquemment, je préfère que la caméra ne fonctionne que lorsque la maison est vide. Bizarrement, je n'ai aucun scrupule à ce que la caméra IP extérieure soit allumée en permanence.

    Voici les changements apportés au script. On ajoute eu début du fichier des constantes qui devront être ajustées pour contenir la véritable adresse IP du Rasberry Pi hébergeant le programme de domotique et le véritable numéro d'index du dispositif virtuel créé dans Domoticiz.

    pi@domo:~ $ nano .local/bin/webcam-streamer
    # adjust these # Domoticz URL="http://192.168.1.22:8080" IDX="65"

    La fin du fichier est modifiée aussi. Après l'énoncé case...esac, il y a quelque lignes de code qui mettent à jour le statut de l'interrupteur virtuel créé dans Domoticz pour que ce dernier reflète l'état du service MJPG-Streamer. Il y a une option supplémentaire, « update », qu'on retrouve comme possibilité dans l'énoncé case et qui ne fait rien sauf continuer vers la mise à jour du statut de l'interrupteur.

    update) ;; *) echo "Usage: $0 {start|stop|restart|status|update}" exit 1 ;; esac if pgrep mjpg_streamer > /dev/null then ONOFF="1" else ONOFF="0" fi curl "${URL}/json.htm?type=command&param=udevice&idx=${IDX}&nvalue=${ONOFF}" exit 0

    Qu'importe l'option start, stop, restart ou update le script enverra une requête HTML au serveur Web de Domoticz. Si l'option status est choisie, il n'y aura pas de requête envoyée et il en sera de même si aucune option n'est spécifiée ou s'il y a erreur.

    Maintenant, la seule chose que le service cron fait est de mettre à jour le statut de l'interrupteur virtuel dans Domoticz. Il le fait au démarrage, implicitement lorsque MJPG-Streamer est arrêter et ensuite qu'une fois par heure, puisque je ne pense pas qu'il s'agit de quelque chose d'urgent

    pi@domo:~ $ crontab -e
    ... # m h dom mon dow command # ## Start the webcam on reboot and then stop it to get rid of ghost images @reboot /home/pi/.local/bin/webcam-streamer start && sleep 10 && /home/pi/.local/bin/webcam-streamer stop # # Once an hour on the 25th minute update Domoticz webcam status 25 * * * * /home/pi/.local/bin/webcam-streamer update #

    Pour m'assurer que la diffusion vidéo en direct se fasse pendant que la maison est vide, j'ai modifié le script enable_timers.sh qui contrôle le planning conditionnel dans Domoticz. C'est assez simple d'ajouter à la fin du fichier ceci.

    if [ "$ACTION" = "enabletimer" ] then ACTION="start" else ACTION="stop" fi #echo "/home/pi/.local/bin/webcam-streamer $ACTION" /home/pi/.local/bin/webcam-streamer $ACTION

  13. Caméra lente
  14. Lorsque ma webcam est utilisée au format pixel YUYV, MJPG-Streamer se charge de compresser le flux vidéo avant de l'envoyer. Cela occupera plus de la moitié du temps CPU. Cela pourrait être acceptable dans un système multicœur, comme le Raspberry Pi 3 ou l'Orange Pi Zero, mais cela me semble inacceptable avec le Raspberry Pi B+ ou un modèle plus vieux avec un seul coeur.

    Cependant, la dernière section offre une solution partielle. Ne faire fonctionner MJPG-Streamer qu'au moment précis où l'on veut voir le flux vidéo. En d'autres termes, je n'inclurais pas le démarrage automatique dans le fichier crontab ni dans le script de planning conditionnel. Le logiciel serait contrôlé de façon ponctuelle avec l'interrupteur virtuel dans Domoticz. Regarder une vidéo de son propre salon n'est pas l'activité la plus divertissante, alors je suppose que cela ne se fera pas longtemps ce qui ne devrait pas trop nuire au fonctionnement du système domotique. Il faut cependant tester que le Raspberrry Pi aura assez de punch pour traiter la requête HTTP pour éteindre le MJPG-Streamer quand il est en cours d'exécution.

    Si quelqu'un fait cela, je serais heureux d'entendre comment cela fonctionne dans la pratique.

  15. Téléchargements
  16. Voici les versions complètes des fichiers dont il est question ci-dessus.