ffmpeg eliminar partes sin movimiento

15

Tengo una cámara de seguridad IP (192.168.0.8) que puede transmitir contenido rtsp a través de la red.

Puedo guardar ese contenido (RAW) sin cambios usando el siguiente comando ffmpeg de mi computadora:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -acodec copy -vcodec copy test-raw.mp4

También puedo cambiar su tamaño sobre la marcha:

ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -vf  "scale=640:-1" test640.mp4

¿Pero cómo guardar solo ese video que contiene solo partes de detección de movimiento?

Intenté solucionarlo usando los filtros de cambio de escena de ffmpeg , pero no tuve suerte.

Mi objetivo: tener una solución de monitoreo de video común, que detecta cuándo alguien se está moviendo cerca de la cámara y la guarda en el archivo de video. Entiendo que puede que no sea posible hacerlo sobre la marcha desde la transmisión, por lo que está bien que guarde un archivo grande en primer lugar, luego lo procese con otro comando ffmpeg y genere un nuevo archivo de video que contenga solo partes detectadas por movimiento. Si me puede dar consejos sobre qué debería investigar más, le agradeceré mucho.

La transmisión de mi cámara se transmite sin sonido. Por lo tanto, puedo generar un conjunto de imágenes del video original, luego elegir las imágenes adecuadas y luego guardar el nuevo video de las imágenes.

rfedorov
fuente
¿Desea implementar este sistema o encontrar un producto listo para usar?
Woeitg
@WOEITG Solo necesito una solución de trabajo gratuita para Ubuntu 15.04+
rfedorov
Para Windows, hay una pieza de software llamada ispy, que puede configurar para grabar en la detección de movimiento. Dado que solicita una solución de Linux, zoneminder.com debería ser un producto similar. Lamentablemente, no tengo una respuesta directa a su pregunta, pero hago +1 porque también me gustaría una respuesta
MyNameWouldGoHere

Respuestas:

7

Lo que haría, es hacer exactamente lo que dijiste, y guardar un gran archivo de la secuencia, luego usar el select filtro FFMPEG con la sceneexpresión, que compara la similitud de cuadros consecutivos: select=gt(scene\,0.003)por ejemplo. Cuanto mayor sea el número, se ignorará el mayor cambio entre fotogramas, en las pruebas rápidas es posible que deba bajar hasta 0.00001-0.00005 dependiendo del tipo de material de archivo con el que esté tratando.

Combina eso con el setpts filtro , que modifica el "tiempo de inicio" de los cuadros de video, y terminarías con algo como (para un video de 25 fps):

ffmpeg -i input.mp4 -vf "select=gt(scene\,0.003),setpts=N/(25*TB)" output.mp4

Eso sí, no podrás usar -vcodec copycuando uses filtros de video.

shinmai
fuente