Encourager FUNIX

La consultation du site est totalement libre et gratuite, sans publicités. Les dons sont néanmoins appréciés pour payer l'hébergement et encourager son auteur


Systèmes de vidéosurveillance - présentation de motionplus

Systèmes de vidéosurveillance

Présentation de motionplus

30 octobre 2025


Présentation

Cette section a pour objectif de vous présenter différents outils pour monter un système de vidéosurveillance basé sur Linux avec l'utilisation de caméras de surveillance indépendantes (IP ou Wifi), analogique, numérique ou de simples webcams, autrement appelé CCTV. Sont présentés dans cette section Zoneminder, Frigate et motionplus, ils permettent tous d'intégrer un large panel de caméras, de faire de la détection automatique de mouvement et de créer des évènements, ils sont basés également sur un serveur web, permettant via un navigateur de les configurer, de visualiser en temps réel les caméras et de gérer les évènements, que ce soit sur un poste fixe ou sur un mobile. Zoneminder et Frigate sont bien plus évolués et dispose de fonction d'apprentissage automatique et de reconnaissance d'objet, contrairement à motionplus qui est un outil bien plus simple et moins lourd à mettre en œuvre. On pourra considérer également que ZoneMinder est bien plus usine à gaz que Frigate qui s’intègre dans home assistant.
Cette section est décomposée en plusieurs pages:

[retour haut de la page]

Installation

Le programme motionplus est un utilitaire de détection de mouvement à partir de diverses sources vidéo, webcam, flux vidéo, caméra IP, wifi ou que sais-je encore disposible sur le réseau. Il intègre un serveur httpd où les vidéos peuvent être visualisées en temps réel, on peut également visualiser les évènements, c'est à dire tout mouvement ayant fait l'objet d'un enregistrement. L'utilisation d'une base de donnée est nécessaire pour gérer les évènements.

Le site officiel est https://motion-project.github.io/ on y découvre le programme d'origine motion et une version refondue appelée motionplus présentée ici dans cette page, qu'on décompresse en tapant

tar xvfz motionplus-release-0.2.2.tar.gz

cela donne le répertoire motionplus-master on récupérera préalablement les packages lib64microhttpd-devel et lib64camera-devel, on verra plus loin comment utiliser un serveur Apache httpd. On revient dans le répertoire dans lequel on tape

autoreconf -fiv;./configure --with-ffmpeg=/usr/local/lib --with-mariadb=/usr/local/mysql

L'option with-ffmpeg pointe vers le répertoire où se trouvent les bibliothèques de ffmpeg  compilées par mes soins pour éviter qu'il utilise la version du système. Voilà le résultat

   **************************
      Configure status      
      motionplus 0.2.2
   **************************

CPPFLAGS:  -D_THREAD_SAFE    -I/usr/include/p11-kit-1  -I/usr/include/webp  -I/usr/include/libcamera  -I/usr/local/include  -I/usr/include/opencv4  -I/usr/local/mysql/include/mysql/   -D_REENTRANT  

LIBS:  -pthread   -ljpeg  -lmicrohttpd  -lwebpmux -lwebp -lsharpyuv  -lcamera -lcamera-base  -L/usr/local/lib -lavutil -lavformat -lavcodec -lswscale -lavdevice  -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_barcode -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_shape -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_ml -lopencv_videostab -lopencv_videoio -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core  -L/usr/local/mysql/lib/ -lmariadb  -lsqlite3  -lpulse -pthread  -lpulse-simple  -lasound  -lfftw3

LDFLAGS:


OS                    : linux-gnu
pthread_np            : no
pthread_setname_np    : yes
pthread_getname_np    : yes
XSI error             : no
webp support          : yes
V4L2 support          : yes
libcamera support     : yes
FFmpeg support        : yes
  libavformat version : 61.1.100
OpenCV                : yes
  version             : 4.6.0
SQLite3 support       : yes
MYSQL support         : no
PostgreSQL support    : no
MariaDB support       : yes
ALSA support          : yes
PulseAudio support    : yes
FFTW support          : yes

Install prefix:       /usr/local

La base de données est nécessaire pour gérer les évènements, pour ffmpeg voir la page outils de base pour la vidéo et pour MySQL la page correspondante. On tape maintenant

make

puis en tant que root make install. On crée ensuite la base de donnée motionplus

mariadb -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10952
Server version: 11.4.2-MariaDB Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database motionplus;
Query OK, 1 row affected (0,001 sec)

[retour haut de la page]

A présent on va modifier le fichier de configuration, un fichier de configuration motionplus-dist.conf par défaut a été créé sous /usr/local/etc/motionplus/ on le renomme motionplus.conf. Vous trouverez ci-dessous les modifications qui ont été opérées

;*************************************************
;*****   Camera
;*************************************************
device_name
device_id
target_dir /emile/photo/motion

La variable target_dir pointe à l'endroit où seront stockés snapshots et vidéos, je l'ai placé dans l'arborescence de mon serveur Apache pour qu'ils puissent être visibles.

(...)

;*************************************************
; Device config files - One for each device.
;*************************************************
camera /usr/local/etc/motionplus/camera1.conf
camera /usr/local/etc/motionplus/camera2.conf
camera /usr/local/etc/motionplus/camera3.conf

Définition des caméras qui seront utilisées et qui seront décrites dans les fichiers mentionnés ci-dessus

(...)

;*************************************************
;*****   Scripts
;*************************************************
on_event_start
/usr/local/bin/motionmail
on_event_end

script à lancer s'il y a un évènement en cours. Le script contient simplement

#!/bin/bash
mail -s "Evenement motion" olivier.hoarau@funix.org

(...)

;*************************************************
;*****   Picture
;*************************************************
picture_output off
picture_filename %v-%Y%m%d%H%M%S-%q

;*************************************************
;*****   Movie
;*************************************************
movie_output on
movie_max_time 120
movie_quality 45
movie_container mp4
movie_filename %v-%Y%m%d%H%M%S

pour chaque évènement c'est une vidéo utilisant le conteneur mp4 (et le codec x265) qui sera utilisée, il faut mettre picture_output à on pour avoir des snapshots

(...)

;*************************************************
;*****   Base de donnée
;*************************************************

database_type mariadb
database_dbname motionplus
database_host mariadb-serveur
database_port 3306
database_user root
database_password password

Ces dernières directives permettent d'accéder à la base de données motionplus. Le logiciel n'intègre pas par défaut de système d'alerte par mail ou sms, en revanche on dispose du paramètre on_motion_detected qui permettra de lancer un script qui pourra faire cette alerte.

Maintenant pour une connexion sécurisée avec mot de passe et chiffrement TLS on rajoutera les lignes suivantes

;*****   Web Control
;*************************************************
webcontrol_port 8080
webcontrol_localhost off
webcontrol_parms 3
webcontrol_auth_method digest
webcontrol_authentication user:motdepasse
webcontrol_tls on
webcontrol_cert /etc/ssl/public/apache.crt
webcontrol_key /etc/ssl/apache/apache.key

je me suis servi du certificat perso et de la clé définis par ici.

Pour davantage de détails sur le fichier de configuration, voir cette page https://motion-project.github.io/motionplus_config.html

On définit maintenant les fichiers de configuration des caméras, exemple ci-dessous avec une caméra IP accessible via rtsp et une webcam.

; /usr/local/etc/motionplus/camera1.conf
;
; This config file was generated by motionplus 0.2.2

;*************************************************
; Configuration options specific to camera 1
;*************************************************

;*************************************************
;*****   Camera
;*************************************************
device_name MyCam1
device_id 101

;*************************************************
;*****   Source
;*************************************************
netcam_url rtps://admin:password@192.168.2.110

;*************************************************
;*****   Image
;*************************************************
width 1280
height 720

;*************************************************
;*****   Overlays
;*************************************************
text_left CAMERA 1

;*************************************************
;*****   Movie
;*************************************************
movie_filename CAM01_%t-%v-%Y%m%d%H%M%S

et le fichier pour la deuxième caméra

; /usr/local/etc/motionplus/camera2.conf
;
; This config file was generated by motionplus 0.2.2

;*************************************************
; Configuration options specific to camera 2
;*************************************************

;*************************************************
;*****   Camera
;*************************************************
device_name Patio
device_id 102

;*************************************************
;*****   Source
;*************************************************
v4l2_device /dev/video0

;*************************************************
;*****   Image
;*************************************************
width 352
height 288

;*************************************************
;*****   Overlays
;*************************************************
text_left Camera2
text_right Patio\n%Y-%m-%d\n%T-%q

;*************************************************
;*****   Movie
;*************************************************
movie_filename CAM02_%t-%v-%Y%m%d%H%M%S

[retour haut de la page]

Utilisation

On lance maintenant motionplus, le propriétaire du process doit pouvoir écrire dans le répertoire désigné par target_dir (évitez root...). Voilà le résultat

oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/motionplus.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_edit_stream_preview_method: Invalid stream_preview_method combined
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera1.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera2.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] conf_process: Processing config file /usr/local/etc/motionplus/camera3.conf
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: Logging to syslog
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: MotionPlus 0.2.2 started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] log_init: Using log type (ALL) log level (NTC)
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] mytranslate_init: Language: English
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][STR][00:motionplus] webu_init_webcontrol: Starting webcontrol on port 8080
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][STR][00:motionplus] webu_init_webcontrol: Started webcontrol on port 8080
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ENC][00:motionplus] motpls_av_init: libavcodec  version 61.3.100
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ENC][00:motionplus] motpls_av_init: libavformat version 61.1.100
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][00:ml00:camera-sud] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][02:ml02:Piece2] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:motionplus] main: Motionplus pid: 1331263
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][VID][01:ml01:Piece1] netcam_start: Opening Netcam
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_handler: Norm: Camera handler thread [5] started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][01:ml01:Piece1] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_handler: Norm: Camera handler thread [6] started
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Camera (Piece2) connected
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Camera (Piece1) connected
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 17:09:33 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc:
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: ******************************************************
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: The network camera is sending pictures at 0x0
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: resolution but config is 1280x720. If possible change
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: the netcam or config so that the image height and
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: width are the same to lower the CPU usage.
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc: ******************************************************
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][00:ml00:camera-sud] netcam_ntc:
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:ml00:camera-sud] mlp_ring_resize: Resizing buffer to 4 items
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_handler: Norm: Camera handler thread [3] started
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_init: Camera 103 started: motion detection Enabled
oct. 25 17:09:35 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][01:ml01:Piece1] mlp_init: Camera 102 started: motion detection Enabled
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Camera (camera-sud) connected
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Netcam capture FPS is 21.
oct. 25 17:09:36 ultra.kervao.fr motionplus[1331263]: [NTC][NET][03:nc03:camera-sud] netcam_connect: Norm: Camera source is 20 FPS
oct. 25 17:09:37 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][00:ml00:camera-sud] mlp_init: Camera 101 started: motion detection Enabled

Vous constaterez qu'en passant devant la webcam les vidéos s'accumulent sous /emile/photo/motion, ça marche !! Le log donnera la ligne suivante à chaque mouvement identifié comme évènement.

[NTC][ALL][ml01:MyCam2] mlp_detected_trigger: Motion detected - starting event 1

L'application dispose d'une interface web visible à l'URL http://localhost:8080/. On y voit en temps réel les différentes vues

La configuration est possible de l'interface

Les évènements sont accessibles via Recordings


Tout d'abord pour que motionplus soit lancé via systemd, on veillera que le paramètre daemon soit bien à off dans le fichier de configuration

;*************************************************
;*****   System
;*************************************************
daemon off
;log_file
log_level 6
log_type ALL

On va créer ensuite le ficher /usr/lib/systemd/system/motionplus.service qui contiendra

[Unit]
Description=Motion - monitor live video, trigger responses, record video/stills.
After=local-fs.target network.target

[Service]
User=apache
EnvironmentFile=-/usr/local/etc/motionplus
ExecStart=/usr/local/bin/motionplus -n
Type=simple
ExecReload=@KILL@ -HUP $MAINPID
Restart=on-failure
RestartSec=5
# Don't restart if unconfigured / misconfigured  e.g. daemon disabled
# in defaults file.  See also /usr/include/sysexits.h or sysexits(3)
RestartPreventExitStatus=78

[Install]
WantedBy=multi-user.target

Et on lancera motionplus en tapant

systemctl start motionplus

la commande suivante

systemctl status motionplus

donnera

● motionplus.service - Motion - monitor live video, trigger responses, record video/stills.
     Loaded: loaded (/usr/lib/systemd/system/motionplus.service; disabled; preset: disabled)
     Active: active (running) since Fri 2024-10-25 17:09:33 CEST; 52min ago
   Main PID: 1331263 (motionplus)
      Tasks: 17 (limit: 9239)
     Memory: 120.2M
        CPU: 42min 59.330s
     CGroup: /system.slice/motionplus.service
             └─1331263 /usr/local/bin/motionplus -n

oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_handler_reconnect: Norm: Reconnecting with camera....
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Camera (Piece1) connected
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 18:00:49 ultra.kervao.fr motionplus[1331263]: [NTC][NET][06:nc06:Piece1] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_handler_reconnect: Norm: Reconnecting with camera....
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Camera (Piece2) connected
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Netcam capture FPS is 15.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][NET][05:nc05:Piece2] netcam_connect: Norm: Unable to determine the camera source FPS.
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][ALL][02:ml02:Piece2] mlp_detected_trigger: Motion detected - starting event 17
oct. 25 18:01:17 ultra.kervao.fr motionplus[1331263]: [NTC][EVT][02:ml02:Piece2] on_movie_start_command: File saved to: /media/motion/CAM03_103-17-20241025180117.mp4

pour le rendre actif en permanence on tapera

systemctl enable motionplus

Maintenant vous pouvez ouvrir les port de votre serveur pour que l'interface web motionplus soit accessible sur internet.

Pour que les fichiers enregistrés n'explosent pas le disque, vous pouvez supprimer les fichiers à partir de l'interface ou alors vous pouvez créer une tâche cron qui à intervalle régulier va supprimer les fichiers qui ont plus de 5 jours (par exemple), voilà le contenu du fichier exécutable nettoyage  à rajouter dans /etc/cron.weekly (exécution une fois par semaine)

#!/bin/bash
find /emile/photo/motion -type f -name "*.mkv" -mtime +5 -exec rm {} \;

Attention il faudra supprimer les évènements correspondant dans la base de donnée mariadb.
 
[Retour page d'accueil FUNIX] [retour haut de la page ]