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.
fuente
Respuestas:
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 lascene
expresió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):Eso sí, no podrás usar
-vcodec copy
cuando uses filtros de video.fuente