Grabación Continua de Vídeo con Motion

Publicado el 23 julio 2024 por Alejsanc @cdrninformatica

En el artículo "Cámara 4G y WiFi con Raspberry Pi" expliqué como configurar Motion para detectar movimientos, grabar vídeos e imágenes de estos y enviar alertas por correo electrónico. En este artículo voy a indicar como hacer que Motion también grabe continuamente el vídeo para tener un registro completo de las imágenes captadas por la cámara.

Con el parámetro de configuración emulate_motion se puede hacer que el software Motion actúe como si detectara movimiento y grabe continuamente. El vídeo se divide en archivos de la duración indicada en el parámetro movie_max_time. Para que no se creen muchos archivos y estos no tengan un tamaño excesivo podemos indicar una duración de 1800 segundos (30 minutos).

emulate_motion on
movie_max_time 1800

Este procedimiento tiene el problema de que desactiva la detección de movimientos. Si también necesitamos detectar movimientos y realizar acciones al detectarlos, es necesario utilizar otros métodos. Por ejemplo podemos ejecutar dos procesos de Motion, uno que detecte los movimientos y otro que grabe continuamente. Para que los dos procesos puedan acceder a la vez a la cámara es necesario crear un dispositivo virtual con el módulo del kernel v4l2loopback.

# apt-get install v4l2loopback-dkms

# vi /etc/modules

v4l2loopback

# vi /etc/modprobe.d/v4l2loopback.conf

options v4l2loopback video_nr=1

Para cada proceso necesitamos un archivo de configuración diferente. Podemos utilizar el archivo original para detectar movimientos y hacer una copia para la grabación continua. En uno de los archivos hay que enviar el vídeo de la cámara al dispositivo virtual con el parámetro video_pipe. Yo lo he hecho en el archivo original. Como se va a grabar todo el vídeo con el otro proceso es posible desactivar la grabación de video en el original.

# cd /etc/motion/
# cp motion.conf motion-continuous.conf
# vi /etc/motion/motion.conf

movie_output off
video_pipe /dev/video1

En el archivo del proceso de grabación continua usamos el dispositivo virtual, activamos la emulación de movimiento, indicamos que grabe archivos de 30 minutos, desactivamos la grabación de imágenes, utilizamos un archivo "log" con el sufijo "continuous" y añadimos el prefijo "continuous" a los archivos de vídeo. También es conveniente desactivar el interfaz web y la transmisión de vídeo si están activados en el otro proceso.

# vi /etc/motion/motion-continuous.conf

log_file /var/log/motion/motion-continuous.log
video_device /dev/video1
emulate_motion on
picture_output off
movie_max_time 1800
movie_filename continuous-%t-%v-%Y%m%d%H%M%S
webcontrol_port 0
stream_port 0

Finalmente debemos crear un servicio de Systemd para iniciar y parar el proceso de grabación continua. Podemos usar una copia del servicio original de Motion. En el parámetro ExecStart hay que indicarle al programa motion, con el parámetro -c, que utilice el archivo de configuración /etc/motion/motion-continuous.conf. Con los parámetros After y Requires hacemos que el servicio se ejecute después del servicio original. Esto es necesario porque el proceso de grabación necesita que el otro proceso se ejecute antes y envíe el vídeo de la cámara al dispositivo virtual. Se debe habilitar el nuevo servicio con el comando systemctl enable.

# cd /lib/systemd/system
# cp motion.service motion-continuous.service
# vi motion-continuous.service

[Unit]
Description=Motion continuous video capture daemon
Documentation=man:motion(1)
After=motion.service
Requires=motion.service

[Service]
Type=simple
User=motion
ExecStart=/usr/bin/motion -c /etc/motion/motion-continuous.conf

[Install]
WantedBy=multi-user.target

# systemctl enable motion-continuous

En el directorio /var/lib/motion podremos ver los archivos de vídeo de grabación continua y las imágenes de los movimientos detectados.

# ls -lh /var/lib/motion/

total 120M
-rw-r--r-- 1 motion adm 7.6K Jul 22 15:35 20240722153542-12.jpg
-rw-r--r-- 1 motion adm 7.6K Jul 22 15:38 20240722153821-04.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 15:42 20240722154227-12.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 15:55 20240722155534-12.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:02 20240722160241-05.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:07 20240722160702-13.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:19 20240722161930-03.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:20 20240722162036-05.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:30 20240722163001-03.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:31 20240722163107-03.jpg
-rw-r--r-- 1 motion adm 7.9K Jul 22 16:37 20240722163735-10.jpg
-rw-r--r-- 1 motion adm  37M Jul 22 16:02 continuous-0-01-20240722153224.mp4
-rw-r--r-- 1 motion adm  37M Jul 22 16:32 continuous-0-01-20240722160224.mp4
-rw-r--r-- 1 motion adm  47M Jul 23 15:33 continuous-0-01-20240723151336.mp4
-rw------- 1 motion adm  11K Jul 22 01:25 dead.letter

Esta es una de las formas de las que disponemos para realizar la grabación continua de video. Utilizando dispositivos virtuales v4l2loopback también podemos utilizar otros programas. Y lo ideal sería que el software Motion permitiera la grabación continua a la vez que la detección de movimiento, por ejemplo añadiendo la opción continuous al parámetro movie_output o con un nuevo parámetro movie_output_continuous.

movie_output_continuous on