Ffmpeg enlever les pièces sans mouvement

J'ai une caméra de sécurité IP (192.168.0.8) capable de diffuser du contenu rtsp sur le réseau.

Je peux enregistrer ce contenu (RAW) sans modifications à l'aide de la prochaine commande ffmpeg de mon ordinateur:

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

Je peux également le redimensionner à la volée:

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

Mais comment enregistrer uniquement cette vidéo qui contient uniquement des pièces de détection de mouvement?

J'ai essayé de le résoudre en utilisant les filtres de changement de scène de ffmpeg, mais pas de chance.

Mon objectif: avoir une solution de surveillance vidéo commune, qui détecte quand quelqu'un se déplace près de la caméra et enregistrez-le dans le fichier vidéo. Je comprends qu'il ne soit pas possible de le faire à la volée à partir du flux, alors il est bon pour moi d'enregistrer un fichier important d'abord, puis de le traiter avec une autre commande ffmpeg et de générer un nouveau fichier vidéo contenant uniquement des éléments détectés par mouvement. Si vous pouvez me donner des conseils sur ce que je devrais rechercher plus, je serai très reconnaissant.

Le flux de mon appareil photo est transmis sans son. Donc, je peux générer un ensemble d'images à partir de la vidéo d'origine, puis choisir les images appropriées, puis enregistrer de nouvelles vidéos à partir d'images.

Ce que je ferais, c'est exactement comme vous l'avez dit, et enregistrez un grand fichier du flux, puis utilisez le filtre FFMPEG select avec l'expression de la scene , qui compare la similitude des images consécutives: select=gt(scene\,0.003) par exemple. Plus le nombre est élevé, plus le changement entre les images est ignoré, dans les tests rapides, vous devrez peut-être aller jusqu'à 0,00001-0,00005 en fonction du type de séquences vidéo que vous rencontrez.

Combinez cela avec le filtre setpts , qui modifie l'heure de début des images vidéo, et vous finirez par quelque chose comme (pour une vidéo de 25fps):

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

-vcodec copy pas que vous ne pourrez pas utiliser -vcodec copy lorsque vous utilisez des filtres vidéo.