
Eu tenho uma câmera de segurança IP (192.168.0.8) capaz de transmitir conteúdo rtsp pela rede.
Consigo salvar esse conteúdo (RAW) sem alterações usando o próximo comando ffmpeg do meu computador:
ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -acodec copy -vcodec copy test-raw.mp4
Também posso redimensioná-lo instantaneamente:
ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -vf "scale=640:-1" test640.mp4
Mas como salvar apenas aquele vídeo que contém apenas partes de detecção de movimento?
Tentei resolver isso usando o ffmpegfiltros de mudança de cena, mas sem sorte.
Meu objetivo é ter uma solução comum de monitoramento de vídeo, que detecte quando alguém está se movendo perto da câmera e salve-o no arquivo de vídeo. Eu entendo que pode não ser possível fazer isso imediatamente a partir do stream, então não há problema em salvar um arquivo grande primeiro, depois processá-lo com outro comando ffmpeg e gerar um novo arquivo de vídeo que contenha apenas partes detectadas por movimento. Se você puder me dar conselhos sobre o que exatamente devo pesquisar mais, ficarei muito grato.
O fluxo da minha câmera é transmitido sem som. Assim, posso gerar um conjunto de imagens do vídeo original, escolher as imagens adequadas e salvar o novo vídeo a partir das imagens.
Responder1
O que eu faria é fazer exatamente como você disse, salvar um arquivo grande do stream e usar oselect
Filtro FFMPEGcom a scene
expressão que compara a similaridade de frames consecutivos:
select=gt(scene\,0.003)
por exemplo. Quanto maior o número, mais a mudança entre os quadros é ignorada. Em testes rápidos, você pode precisar ir até 0,00001-0,00005, dependendo do tipo de filmagem com a qual está lidando.
Combine isso com osetpts
filtro, que modifica o "horário de início" dos quadros de vídeo, e você terminaria com algo como (para um vídeo de 25fps):
ffmpeg -i input.mp4 -vf "select=gt(scene\,0.003),setpts=N/(25*TB)" output.mp4
Lembre-se, você não poderá usar -vcodec copy
filtros de vídeo.