Lo común es realizar la detección de movimientos sobre un dispositivo conectado al ordenador y grabando en tiempo real, pero imagina que ya tienes la grabación, un archivo de vídeo de 12 horas de grabación continua: a ver quien es el guapo que zampa esas 12 horas en busca de alguna actividad.

El otro día un amigo me comentaba esta posibilidad: con la idea de obtener unas secuencias con una calidad mejor de las que puede ofrecer una triste capturadora+cámara+cctv, usar una cámara de vídeo «standard» para «grabar todo, a lo bruto» y a continuación pasar sobre ese (mega) video resultante un «detector de movimientos«.

Por supuesto, la aplicación utilizada para detectar movimientos es Motion, sinembargo Motion no viene preparado para tomar como fuente de datos un simple archivo de vídeo, asi es que lo he hecho es emitir el streaming en localhost del archivo de vídeo con la ayuda de VLC y a continuación lanzar Motion diciendole que dicho streaming es una cámara en red.

Preparar y lanzar Motion

Primero creamos un archivo sencillo de configuración para Motion donde le indicamos la ruta de la cámara que crearemos posterior con VLC. Este archivo contiene los parametros de detección de movimiento habituales: threshold, despeckle, post_capture, etc…
Un archivo de configuración básico podría ser algo como esto (copia estas líneas a un archivo fake_camara.conf) :
daemon off
width 720
height 576
framerate 100
netcam_url http://localhost:9000/video.mjpg
threshold 300
despeckle edl
gap 10
max_mpeg_time 3600
ffmpeg_cap_new on
ffmpeg_bps 800000
ffmpeg_deinterlace off
text_right ""
target_dir /home/mi-user/Desktop
movie_filename fake_video_%Y%m%d%H%M%S

Observa algunos puntos, como la url hacia la que apuntamos Motion hacia una cámara de red ubicada en http://localhost:9000/video.mjpg que crearemos a continuación, con el framerate 100 no aseguramos codificar al mismo nivel que se recibe . El resto de parámetros son bastante autoexplicativos.
Aunque no hayamos lanzando todavía el streaming ya puede iniciar Motion con estos parametros, el programa quedará a la espera de poder conectar con la cámara de red. Abre una consola y escribe:
motion -c ~/Desktop/fake_camara.conf

Enviar streaming de vídeo a Motion

Motion se encuentra a la espera de conectar una cámara de red que sirva JPEG individuales ó multipart (MJPEG). Con ayuda de VLC codificamos nuestro video ORIGINAL.MPG a dicho formato y lo volcamos en la dirección que está escuchando Motion.
vlc ORIGINAL.MPG --sout '#transcode{vcodec=mjpg,vb=1600,fps=24}:duplicate{dst=standard{access=http{mime=multipart/x-mixed-replace;boundary=--7b3cc56e5f51db803f790dad720ed50a},mux=mpjpeg,dst=0.0.0.0:9000/video.mjpg},dst=display}'
Esto lanza una ventana de VLC en la que podemos ver nuestro vídeo al mismo tiempo que el streaming que es capturado por Motion. A partir de este momento irán apareciendo en tu escritorio secuencia de vídeo «fake_video_xxxx.avi» a medida que se detecte actividad en la secuencia de vídeo.
Es importante utilizar un bitrate de compresión a mjpg (vb=1600) lo más parecido posible al que traiga el archivo original, de esta manera nos aseguramos la menor pérdida de calidad en el proceso de conversion de un formato a otro.

Algunas mejoras

He probado el sistema descrito con un vídeo de 10 minutos grabado por la cámara de vídeo a 720×576@25 y resultado ha sido bueno desde el primero momento, obteniendo los 4-5 vídeos que contenian movimiento.

Lo primero que habría que mejorar sería la recodificación constante del video original, es decir: tenemos un mpeg que codificamos a mjpeg para emitirlo en streaming y que al detectar movimiento se guarda como msmpeg4.
Evidentemente esto es absurdo, pero no debería costar mucho configurar Motion para que en lugar de capturar las partes del video que contienen movimiento se limite a producir un archivo Log de texto en el que queden recogidos los minutos:segundos.
Por lo pronto, según el modo anterior se producirian vídeos con nombres que indican la hora:minuto:segundo con lo que resulta facil saber en que posición del video original se encuentra el movimiento.

La otra cuestión es mas complicada de solucionar: la detección en tiempo real.
El método descrito requiere que si tenemos un vídeo de 24 horas de duración, tengamos al ordenador otras 24 horas procesando dicho vídeo. Esto desde luego es un incordio importante y no se me ocurre como solucionarlo.
Quizás jugando con los framerate pudieramos acelerar algo el proceso y obligar a Motion a procesar una fuente de vídeo a 240 FPs, un suponer,pero ignoro cual podría ser el resultado.