ffmpeg retirer des pièces sans mouvement


15

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 en utilisant 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 parties 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 s'approche de la caméra et l'enregistre dans le fichier vidéo. Je comprends qu'il pourrait ne pas être possible de le faire à la volée à partir du flux, il est donc correct pour moi d'enregistrer un gros fichier en premier, puis de le traiter avec une autre commande ffmpeg et de générer un nouveau fichier vidéo qui ne contient que des parties détectées par le mouvement. Si vous pouvez me donner des conseils sur ce que je devrais faire de plus, je serai vraiment reconnaissant.

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


Vous souhaitez mettre en place ce système ou trouver un produit prêt à l'emploi?
Woeitg

@WOEITG J'ai juste besoin d'une solution de travail gratuite pour Ubuntu 15.04+
rfedorov

Pour Windows, il existe un logiciel appelé ispy, que vous pouvez définir pour enregistrer sur la détection de mouvement. Puisque vous demandez une solution Linux, zoneminder.com devrait être un produit similaire. Malheureusement, je n'ai pas de réponse directe à votre question, mais +1 parce que j'aimerais aussi une réponse
MyNameWouldGoHere

Réponses:


7

Ce que je ferais, c'est faire exactement ce que vous avez dit, et enregistrer un gros fichier du flux, puis utiliser le select filtre FFMPEG avec l' sceneexpression, 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 un test rapide, vous devrez peut-être descendre aussi bas que 0,00001-0,00005 selon le type de métrage que vous traitez.

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

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

Attention, vous ne pourrez pas l'utiliser -vcodec copylorsque vous utiliserez des filtres vidéo.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.