ffmpeg entfernt Teile ohne Bewegung

ffmpeg entfernt Teile ohne Bewegung

Ich habe eine IP-Überwachungskamera (192.168.0.8), die RTSP-Inhalte über das Netzwerk übertragen kann.

Ich kann diesen (RAW-)Inhalt unverändert speichern, indem ich den nächsten ffmpeg-Befehl von meinem Computer aus verwende:

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

Ich kann die Größe auch spontan ändern:

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

Aber wie speichert man nur das Video, das nur Teile der Bewegungserkennung enthält?

Ich habe versucht, es mit ffmpegs zu lösenSzenenwechselfilter, aber kein Glück.

Mein Ziel: Eine allgemeine Videoüberwachungslösung zu haben, die erkennt, wenn sich jemand in der Nähe der Kamera bewegt, und dies in der Videodatei speichert. Mir ist klar, dass dies möglicherweise nicht spontan aus dem Stream heraus möglich ist, daher ist es für mich in Ordnung, zunächst eine große Datei zu speichern, sie dann mit einem weiteren ffmpeg-Befehl zu verarbeiten und eine neue Videodatei zu generieren, die nur die bewegungserkannten Teile enthält. Wenn Sie mir einen Rat geben können, was genau ich genauer erforschen sollte, wäre ich sehr dankbar.

Mein Kamerastream wird ohne Ton übertragen. So kann ich aus dem Originalvideo eine Reihe von Bildern generieren, dann geeignete Bilder auswählen und dann aus den Bildern ein neues Video speichern.

Antwort1

Ich würde es genau so machen wie du gesagt hast und eine große Datei des Streams speichern und dann dieselect FFMPEG-Filtermit dem sceneAusdruck, der die Ähnlichkeit aufeinanderfolgender Frames vergleicht: select=gt(scene\,0.003)zum Beispiel. Je höher die Zahl, desto mehr Änderungen zwischen den Frames werden ignoriert. Bei schnellen Tests müssen Sie je nach Art des Filmmaterials möglicherweise bis auf 0,00001–0,00005 heruntergehen.

Kombinieren Sie das mit demsetpts Filter, das die „Startzeit“ von Videobildern ändert, und Sie würden am Ende etwa Folgendes erhalten (für ein 25-fps-Video):

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

Beachten Sie, dass Sie es nicht verwenden können, -vcodec copywenn Sie Videofilter einsetzen.

verwandte Informationen