Lire un flux vidéo d’une webcam avec un Raspberry Pi

Je veux qu’un Raspberry Pi lise et serve un flux vidéo issu d’une caméra IP (en wifi ou ethernet). J’ai choisi d’installer motion car il me permettra de détecter les mouvements puis de déclencher des alertes. Dans cet article, j’explique seulement comment installer motion puis visualiser le flux vidéo sur une page web, en streaming.

Ce qu’il faut

  • un Raspberry Pi (un B+, avec une carte sd qui contient tout ce qui a été créé dans l’article Mise en service d’un Raspberry Pi – ie pour moi avec l’image radio-pi-2016-06-10-8h.img et Raspbian Jessie)
  • une caméra web, pour moi connectée par cable ethernet, une Foscam FI8905W, avec une IP fixe).

Changer le nom du Pi et vérifier

regarder l’adresse IP du pi sur le routeur local (pour moi 192.168.1.16)

se connecter au pi en ssh et changer son nom (hostname)

ssh root@192.168.1.16
raspi-config

puis dans 9- advanced options, aller dans A2 hostname et renommer le Pi (pour moi, « nautilus »). Finir et accepter le Reboot

Maintenant je peux me connecter à ce pi avec ssh root@nautilus .

Noter que je me connecte en root, ce qui n’est pas conseillé. Mais ça m’évite de taper « sudo  » devant chaque commande !

Installer motion

on installe des utilitaires nécessaires puis motion.

apt-get install -y libjpeg62-turbo libjpeg62-turbo-dev  libavformat-dev  libavcodec-dev  libavutil-dev libc6-dev zlib1g-dev libmysqlclient18 libmysqlclient-dev libpq5
apt-get install motion

apt-get update
apt-get upgrade

Ca prend pas mal de temps (plusieurs minutes).

Pendant ce temps, préparer la page html qui servira à débugger et vérifier.

Préparer une page html de débogage et vérification

Créer un fichier page-test.html sur un PC, qui contient le code suivant :

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<title>premier test d'affichage caméra</title>
<link href="A-style.css" rel="stylesheet" media="all" type="text/css"> 
</head>
<body>
<H1>Tableau de bord maison</h1>

<section class="streaming">
<h3>streaming caméra IP Foscam FI8905W</h3>
<p>en continu - directement de la caméra (IP fixe 192.168.1.201)</p>
<img name="FoscamCamera" src="http://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD" width="600" height="450" alt="Live Feed" style="background-color: #009999" />
</section>

<section class="streaming">
<h3>streaming caméra IP Foscam FI8905W via pi nautilus</h3>
<p>en continu - directement à la caméra</p>
<img src= "http://nautilus:8081/?action=stream" width="640" height="480" title="Camera devant maison"/>
</section>

</body>
</html>

Evidemment, il faut remplacer USER et PWD par les bons codes de la caméra utilisée.

Dans le même répertoire, placer un fichier A-style.css

html, body {
 background-color: #d8da3d ;
 margin: 0;
 padding: 0;
 }
body {
  padding-left: 11em;
  font-family: Georgia, "Times New Roman",
        Times, serif;
  color: purple;
  background-color: #d8da3d 
}
 
h1 {
	font-family: Helvetica, Geneva, Arial,
        SunSans-Regular, sans-serif }

a:link {
	color: blue 
}

a:visited {
	color: purple 
}

Et maintenant, dans l’explorateur de fichiers, cliquer à droite sur page-test.html et choisir ouvrir avec votre navigateur favori (chrome pour moi).

On voit le flux vidéo de la caméra en direct mais évidemment pas celui qui passe par le pi puisqu’on n’a pas encore fini d’installer et de configurer motion.

page web de test et deboguage de motion sur Raspberry Pi
page web de test et deboguage de motion sur Raspberry Pi

Evidemment, si la première partie de la page n’affiche pas le flux vidéo de la caméra, chercher comment régler la caméra. Pour moi ça fonctionne avec une caméra Foscam FI8905W réglée comme suit :

  • adresse IP fixe 192.168.1.201
  • un administrateur (il faudrait sans doute que ce soit seulement un visiteur pour limiter les risques) nommé USER avec mot de passe PWD
  • firmware version 11.35.2.63
  • Device Embeded Web UI Version 2.4.20.11

Il est impératif de vérifier que http://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD permet bien la visualisation du flux vidéo provenant de la caméra. Sinon la configuration de motion ne fonctionnera pas !

installer motion comme un « service »

Redémarrer le pi avec init 6  ou reboot .

On veut que motion démarre en même temps que le Pi . Pour cela motion doit être installé comme un service.

Dans /etc/default/motion  (attention si vous n’utilisez pas Raspbian Jessie, je crois que c’est un autre répertoire), modifier la ligne suivante (no devient yes) :

start_motion_daemon=yes

Pour donner les bons droits d’accès aux fichiers et répertoires nécessaires à motion (les fichiers et répertoires sont ceux qui sont définis dans motion.conf) :

# /etc/motion/motion.conf et thread_.conf en 775 et propriétaire root/motion
chown -R root:motion /etc/motion/
chmod -R 775 /etc/motion/   #664 will not work when motion runs as a service

# /usr/bin/motion : 755
chmod 755 /usr/bin/motion

#var/run/motion (pour motion.pid)
mkdir /var/run/motion
touch /var/run/motion/motion.pid
chmod 755 /var/run/motion/motion.pid

#/home/al/motion/ en niveau 777 et propriétaire root / motion 
# dans /home/al/motion/ créer le fichier motion.log en niveau 777 
# thread0.conf (foscam) : /home/jf/motion/log/foscam 
# thread1.conf (tablette) : /home/jf/motion/log/galaxy 
mkdir /home/jf/motion 
mkdir /home/jf/motion/log 
mkdir /home/jf/motion/log/galaxy 
mkdir /home/jf/motion/log/foscam 
touch /home/jf/motion/log/motion-log.log 
chown -R root:motion /home/jf/motion/ 
chmod -R 755 /home/jf/motion/ 
chmod 777 /home/jf/motion/log/motion-log.log

Redémarrer le pi avec init 6  ou reboot .

Maintenant, on doit voir motion parmi tous les services en cours de fonctionnement, avec un « + » devant :

service --status-all

Une liste de services s’affiche, en ordre alphabétique. Lorsqu’il y a [+] devant le service est démarré, sinon il y a [-] devant.

Raspberry Pi (jessie) avec Motion comme un service

On voit dans cette copie d’écran que motion est démarré.

et si on veut voir le statut de motion

service motion status –l

Logiquement il y a des lignes en rouge, en particulier [ALR] [VID] vid_v4lx_start: Failed to open video device /dev/video0: . C’est normal puisqu’on n’a pas configuré motion.

Dans ce qui suit, on utilisera les commandes suivantes pour arrêter, démarrer ou redémarrer le service motion :

service motion stop
service motion start
service motion restart

Maintenant, il nous reste à configurer motion.

configurer motion

Nous voulons que motion lise le flux vidéo de la caméra à l’adresse IP 192.168.1.201 et qu’il autorise l’accès par un appareil sur le réseau.

Note si on a plus d’une caméra, il faut régler motion.conf et ajouter autant de fichier thread.conf qu’il y a de caméra : voir les précisions (en anglais) de l’auteur de motion ici. Tout à la fin de motion.conf, il y a des instructions aussi.

J’ai installé de cette façon une deuxième caméra à partir d’une vieille tablette android : une caméra IP avec une vieille tablette android ?

Avant de modifier /etc/motion/motion.conf, en faire une copie qu’on appellera par exemple motion.conf.OLD. motion.conf doit avoir des droits d’accès en 664.

Editer motion.conf et régler les lignes comme suit, dans l’ordre du contenu du fichier (pour moi This config file was generated by motion 3.2.12+git20140228 , ça m’indique la version de motion pour lesquelles cette configuration fonctionne).

Pour mieux comprendre les options de réglages que l’on a, voir le wiki de l’auteur de motion, ici.

daemon on

logfile /home/jf/motion/log/motion-log.log
log_level 6 # on le laisse à ce niveau par défaut pour l'instant

v4l2_palette 8    # 17 ne marche pas correctement

width 640 #320 # lié à la caméra pour moi 640
height 480 # lié à la caméra
framerate 2 #2 image par seconde

# pour netcam_url, remarquer le ';' devant et le supprimer ! 
netcam_url http://USER:PWD@192.168.1.201:80/videostream.cgi?user=USER&pwd=PWD

; netcam_userpass value # laisser en commentaire avec ; devant
netcam_keepalive on
ffmpeg_output_movies on

; si on ne commente pas, erreur [0] [ALR] [ALL] conf_cmdparse: Unknown config option "sdl_threadnr"
; erreur pas grave mais remplit le fichier log
# sdl_threadnr 0 

target_dir /home/jf/motion/log  # Target base directory for pictures and films

# on utilise la commande http qui fonctionne en direct dans notre page web de déboguage
stream_port 8081

stream_localhost off   # permet l'accès en local

webcontrol_port 8085

webcontrol_localhost off   # on bloque l'accès

Ensuite on redémarre motion avec service motion restart . Puis Puis service motion status -l  nous indique si tout va bien.

Motion bien configuré sur Raspberry Pi

Tout va bien mais erreur Unknown config option « sdl_threadnr ». Je n’ai pas trouvé comment la résoudre et ça ne paraît pas géner le fonctionnement de motion.

Tester le bon fonctionnement

Si le flux de la caméra ne s’affiche pas correctement dans la deuxième partie de notre page de test page-test.html , ouvrir /home/al/tmp/motion.log et identifier l’erreur qui bloque motion.

on peut aussi arrêter le service motion (service motion stop ) et taper seulement motion , qui affiche des indications d’erreurs éventuelles.

affichage (embed) du flux motion

Et maintenant ?

Dans l’article suivant de cette série , nous verrons comment configurer motion pour qu’il détecte les mouvements et alerte.

5
Poster un Commentaire

avatar
  S’abonner  
plus récent plus ancien Le plus populaire
Notifier de
Benjamin
Invité
Benjamin

Bonjour, Je n’arrive pas a avoir de visualisation de la camera, j’ai un écrans gris, avec marquer « Unable to open video device ». J’ai tester avec tout les palettes « v4l2_palette » disponible et aucune ne marche. Avec la ligne « service motion status –l » rien n’est en rouge, ci-joint un morceau du fichier motion-log.log et du terminal: terminal: « pi@RPi3-1:/etc/motion $ service motion status -l ● motion.service – LSB: Start Motion detection Loaded: loaded (/etc/init.d/motion; generated; vendor preset: enabled) Active: active (running) since Fri 2019-08-02 16:05:32 CEST; 5min ago Docs: man:systemd-sysv-generator(8) Process: 2651 ExecStop=/etc/init.d/motion stop (code=exited, status=0/SUCCESS) Process: 2660 ExecStart=/etc/init.d/motion start (code=exited, status=0/SUCCESS) CGroup:… Lire la suite »

Henri
Invité
Henri

Bonjour,
Merci beaucoup pour tutoriel !

J’ai réussi à installer Motion, visualiser les deux streaming, l’un directement de la caméra via mon navigateur sur Mac et l’autre via mon raspberry Pi 3 b+ … mon seul souci est que j’ai un écran noir sur le streaming du raspPi que je n’arrive pas à débugger. Dans le log, j’ai des messages disant que soit le keep-alive n’est pas setup (pourtant il est sur ON dans le fichier de config) ou bien c’est une histoire de mjpeg compression failure … ca commence à me dépasser!

Merci pour ton retour,

MarcB
Invité
MarcB

Génial ton article ! Je teste également cette solution avec deux cameras IP
et la camera pour Raspberry …