Reduzieren Sie die Videobildrate, ohne nützliche Bilder zu löschen

5

Ich habe ein Video von einer Überwachungskamera, das ursprünglich mit einer niedrigen Bildrate aufgenommen wurde, vielleicht 15 fps, vielleicht 10 fps, vielleicht sogar weniger. Es wurde seitdem von einer anderen Person auf 25 fps konvertiert (ohne die Dauer zu ändern). Ich gehe davon aus, dass zusätzliche, doppelte Frames hinzugefügt wurden, und möglicherweise hat dies auch die genaue Uhrzeit, zu der die ursprünglichen Frames angezeigt werden, leicht verzerrt.

Ich möchte das Video mit ffmpeg auf seine ursprüngliche Framerate umcodieren, ohne die nützlichen Frames der tatsächlichen Bewegung fallen zu lassen. Wenn ich nur den fpsFilter verwende, ist es nicht selektiv, welche Frames gespeichert werden, und ich gehe davon aus, dass aufgrund von Rundungsfehlern einige der doppelten Frames erhalten bleiben und nützliche Frames dauerhaft verloren gehen können, was die Situation verschlimmert. Auf jeden Fall weiß ich nicht, welche Zahl ich dem Filter mitteilen soll, da ich nicht genau weiß, wie hoch die ursprüngliche Bildrate war!

Wie kann ich dieses Video mit ffmpeg reparieren?

ffmpeg -i "orig.mp4" -an -vcodec h264 -vf "fps=???" "fixed.mp4"
Boann
quelle
Es ist unwahrscheinlich, dass dies möglich ist, insbesondere wenn Sie den genauen "Algorithmus" des verwendeten Konverters nicht kennen. Klingt übrigens nach einem Pulldown-Problem.
Tom Yan

Antworten:

6

Ich konnte meine Datei reparieren. Ich habe den mpdecimateFilter gefunden, der doppelte oder nahezu doppelte Bilder aus einem Videostream entfernt. Zuerst habe ich versucht:

ffmpeg -loglevel debug -i orig.mp4 -an -vf "mpdecimate" test.mp4

Ich habe hinzugefügt -loglevel debug, um mehr Informationen während des Transcodierens zu erhalten. Die Info zeigte, was mpdecimatemit den Frames geschah, was sehr viel von diesem Muster war:

lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44032 pts_time:3.44 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:44544 pts_time:3.48 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45056 pts_time:3.52 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:45568 pts_time:3.56 drop_count:4
781>=hi keep pts:46080 pts_time:3.6 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:46592 pts_time:3.64 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47104 pts_time:3.68 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:47616 pts_time:3.72 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:48128 pts_time:3.76 drop_count:4
821>=hi keep pts:48640 pts_time:3.8 drop_count:-1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49152 pts_time:3.84 drop_count:1
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:49664 pts_time:3.88 drop_count:2
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50176 pts_time:3.92 drop_count:3
lo:0<217 lo:0<-2147483648 lo:0<-2147483648 drop pts:50688 pts_time:3.96 drop_count:4
793>=hi keep pts:51200 pts_time:4 drop_count:-1

Dh, es wurden konsequent 4 Frames hintereinander als Duplikate abgelegt und jeder 5. beibehalten. Dies zeigte, dass die ursprüngliche Bildrate 1/5 von dem war, was sie jetzt war. Ich hatte Glück! Da die aktuellen 25 fps des Videos ein Vielfaches der ursprünglichen Bildrate waren, sollte es kein Problem mit der zeitlichen Fehlausrichtung der beibehaltenen und ausgelassenen Bilder geben. Daher habe ich das Originalvideo mit nichts Komplexerem als neu transkodiert -vf "fps=5"und die Ausgabe schien in Ordnung zu sein. Um sicher zu gehen, habe ich die Ausgabe durch den mpdecimateFilter geleitet und alle verbleibenden Frames als "keep" erkannt. Die Originaldatei war also nicht so durcheinander, wie ich dachte.

Boann
quelle
2

Wenn die zusätzlichen Frames Duplikate und keine Interpolationen sind, funktioniert möglicherweise Folgendes:

ffmpeg -i orig.mp4 -an -vf "select='gt(scene\,0.001)',setpts=N/(10*TB)" -r 10 fixed.mp4

Die Idee ist, alle Frames auszuwählen, die kein Duplikat des vorhergehenden Frames sind. Dann werden die PTS gemäß der angegebenen Ausgaberate regeneriert. Möglicherweise müssen Sie den Szenenwert nach oben oder unten ändern, um den Erkennungsfilter richtig einzustellen. Wenn das Video schneller oder langsamer als in Echtzeit angezeigt wird, senken oder erhöhen Sie die Rate (bzw. setzen Sie den Nennerwert).

Gyan
quelle
Ich denke, das könnte funktionieren, aber ich fand es schwierig, es richtig abzustimmen. Ich fand den "mpdecimate" -Filter am Ende und benutzte diesen, da er ein eindeutigeres "Duplikat oder Nicht-Duplikat" -Ergebnis für jeden Frame zu ergeben schien.
Boann