web-dev-qa-db-fra.com

ffmpeg enlever les pièces sans mouvement

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

Je suis capable d'enregistrer ce contenu (RAW) sans modifications à l'aide de la commande suivante FFMPEG de mon ordinateur:

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

Je suis aussi capable de 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 contenant uniquement des pièces de détection de mouvement?

J'ai essayé de le résoudre à l'aide de FFMPEG -filtres de changement de scène, mais pas de chance.

Mon objectif - avoir une solution de surveillance vidéo commune, qui détecte lorsque quelqu'un se déplace près de la caméra et enregistrez-le dans le fichier vidéo. Je comprends que cela ne serait peut-être pas possible de le faire à la volée du flux. Il est donc correct pour moi de sauvegarder un grand fichier, puis de le traiter avec une autre commande FFMPEG et de générer un nouveau fichier vidéo contenant uniquement des pièces détectées de mouvement. Si vous pouvez me donner des conseils, que dois-je rechercher davantage, je serai vraiment reconnaissant.

Mon flux de caméra est transmis sans son. Donc, je peux générer un ensemble d'images de la vidéo d'origine, puis choisir des images correctes, puis enregistrer une nouvelle vidéo des images.

15
rfedorov

Ce que je ferais, c'est exactement comme vous l'avez dit, puis vous enregistrez un gros fichier du flux, puis utilisez le filtre selectFFMPEG filtre avec l'expression scene, Cela compare la similitude des cadres consécutifs: select=gt(scene\,0.003) par exemple. Plus le nombre est élevé, plus le changement entre les cadres est ignoré, dans des tests rapides, vous devrez peut-être aller aussi bas que 0.00001-0.00005 selon le type de métrage que vous avez affaire.

Combinez cela avec le setpts -- filtre , qui modifie l'heure de début des cadres vidéo, et vous vous retrouveriez avec 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

Pensez vous, vous ne pourrez pas utiliser -vcodec copy Lorsque vous utilisez des filtres vidéo.

8
shinmai