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 fps
Filter 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"
Antworten:
Ich konnte meine Datei reparieren. Ich habe den
mpdecimate
Filter gefunden, der doppelte oder nahezu doppelte Bilder aus einem Videostream entfernt. Zuerst habe ich versucht:Ich habe hinzugefügt
-loglevel debug
, um mehr Informationen während des Transcodierens zu erhalten. Die Info zeigte, wasmpdecimate
mit den Frames geschah, was sehr viel von diesem Muster war: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 denmpdecimate
Filter geleitet und alle verbleibenden Frames als "keep" erkannt. Die Originaldatei war also nicht so durcheinander, wie ich dachte.quelle
Wenn die zusätzlichen Frames Duplikate und keine Interpolationen sind, funktioniert möglicherweise Folgendes:
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).
quelle