ffmpeg Teile ohne Bewegung entfernen

6797
rfedorov

Ich habe eine IP-Sicherheitskamera (192.168.0.8), mit der RTSP-Inhalte über ein Netzwerk übertragen werden können.

Ich kann diesen (RAW-) Inhalt ohne Änderungen mit dem nächsten ffmpeg-Befehl von meinem Computer speichern:

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

Ich kann es auch im laufenden Betrieb ändern:

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

Aber wie kann man nur das Video speichern, das nur Teile zur Bewegungserkennung enthält?

Ich habe versucht, es mit den Szenenwechselfiltern von ffmpeg zu beheben, aber kein Glück.

Mein Ziel - eine gemeinsame Videoüberwachungslösung, die erkennt, wenn sich jemand in der Nähe der Kamera bewegt, und diese in der Videodatei speichern. Ich verstehe, dass es nicht möglich sein kann, es im laufenden Betrieb aus dem Stream zu machen. Daher ist es in Ordnung, zuerst die große Datei zu speichern, sie dann mit einem anderen ffmpeg-Befehl zu verarbeiten und eine neue Videodatei zu generieren, die nur Teile enthält, deren Bewegung erkannt wurde. Wenn Sie mir einen Rat geben können, was genau ich recherchieren sollte, bin ich wirklich dankbar.

Mein Kamerastream wird ohne Ton übertragen. So kann ich einen Satz von Bildern aus dem Originalvideo erzeugen, dann die richtigen Bilder auswählen und dann das neue Video aus den Bildern speichern.

13
Möchten Sie dieses System implementieren oder ein gebrauchsfertiges Produkt finden? Woeitg vor 8 Jahren 0
@ WOEITG Ich brauche nur eine frei funktionierende Lösung für Ubuntu 15.04+ rfedorov vor 8 Jahren 0
Für Windows gibt es eine Software namens ispy, mit der Sie die Bewegungserkennung aufnehmen können. Da Sie eine Linux-Lösung anfordern, sollte http://www.zoneminder.com/ ein ähnliches Produkt sein. Leider habe ich keine direkte Antwort auf Ihre Frage, aber +1, weil ich auch eine Antwort hätte MyNameWouldGoHere vor 8 Jahren 0

1 Antwort auf die Frage

5
shinmai

Was ich tun würde, ist genau das, was Sie gesagt haben, und speichern Sie eine große Datei des Streams. Verwenden Sie dann den select FFMPEG-Filter mit dem sceneAusdruck, der die Ähnlichkeit aufeinander folgender Frames vergleicht: select=gt(scene\,0.003)zum Beispiel. Je höher die Zahl, desto mehr Änderungen werden zwischen den Bildern ignoriert. Bei einem Schnelltest müssen Sie je nach Art des Materials, das Sie verwenden, 0,00001-0,00005 betragen.

Kombinieren Sie das mit dem setpts Filter, der die "Startzeit" von Video-Frames ändert, und Sie erhalten so etwas wie (für ein 25fps-Video):

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

Sie können jedoch nicht verwenden, -vcodec copywenn Sie Videofilter verwenden.