ffmpeg remove peças sem movimento

15

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.

rfedorov
fonte
Deseja implementar este sistema ou encontrar um produto pronto para usar?
Woitg
@WOEITG Eu só preciso de qualquer solução livre de trabalho para Ubuntu 15.04+
rfedorov
Para o Windows, existe um software chamado ispy, que você pode configurar para gravar na detecção de movimento. Como você está solicitando uma solução Linux, o zoneminder.com deve ser um produto semelhante. Infelizmente eu não tenho uma resposta directa à sua pergunta, mas um porque eu gostaria de uma resposta também
MyNameWouldGoHere

Respostas:

7

O que eu faria é fazer exatamente como você disse, salvar um grande arquivo do fluxo e usar o select filtro FFMPEG com a sceneexpressã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):

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

Lembre-se, você não poderá usar -vcodec copyquando usar filtros de vídeo.

shinmai
fonte