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 rapidamente:
ffmpeg -i "rtsp://192.168.0.8/stream=0.sdp" -vf "scale=640:-1" test640.mp4
Mas como salvar apenas o vídeo que contém apenas partes de detecção de movimento?
Tentei resolvê-lo usando os filtros de mudança de cena do ffmpeg , mas sem sorte.
Meu objetivo - ter uma solução comum de monitoramento de vídeo, que detecta quando alguém está se aproximando da câmera e salva no arquivo de vídeo. Entendo que talvez não seja possível fazê-lo em tempo real a partir do fluxo, por isso não há problema em salvar um arquivo grande primeiro, 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 agradecido.
O fluxo da minha câmera é transmitido sem som. Assim, posso gerar um conjunto de imagens do vídeo original, escolher imagens apropriadas e salvar o novo vídeo das imagens.
fonte
Respostas:
O que eu faria é fazer exatamente como você disse, salvar um grande arquivo do fluxo e usar o
select
filtro FFMPEG com ascene
expressão que compara a semelhança de quadros consecutivos:select=gt(scene\,0.003)
por exemplo. Quanto maior o número, mais alterações entre os quadros são ignoradas. Em testes rápidos, você pode precisar chegar a 0,00001-0,00005, dependendo do tipo de filmagem com que está lidando.Combine isso com o
setpts
filtro , que modifica o "horário de início" dos quadros de vídeo, e você terá algo como (para um vídeo de 25fps):Lembre-se, você não poderá usar
-vcodec copy
quando usar filtros de vídeo.fonte