在不丢失有用帧的情况下降低视频帧速率


5

我有一个来自安全摄像头的视频,最初以低帧速率录制,可能是15 fps,也许是10 fps,甚至可能更低。此后它被其他人转换为25 fps(不改变持续时间)。我假设已经添加了额外的重复帧,并且可能这也略微扭曲了原始帧的显示时间。

我想用ffmpeg将视频重新编码为其原始帧速率,而不丢弃任何实际运动的有用帧。如果我只是使用fps过滤器,它将不会选择它保留哪些帧,并且我认为由于舍入错误,它可能最终保留一些重复的帧并永久丢失有用的帧,使事情变得更糟。在任何情况下,我都不知道告诉过滤器的是什么号码,因为我不确切知道原始帧率是多少!

如何使用ffmpeg继续修复此视频?

ffmpeg -i "orig.mp4" -an -vcodec h264 -vf "fps=???" "fixed.mp4"

它似乎不太可能完成,特别是如果你不知道转换器使用的确切“算法”。听起来有点像下拉问题。
Tom Yan

Answers:


6

我设法修复了我的文件。我找到了mpdecimate过滤器,它从视频流中删除了重复或接近重复的帧。首先我试过:

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

-loglevel debug在转码过程中添加了更多信息。信息显示mpdecimate了框架的作用,这是很多很多这种模式:

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

也就是说,它一直连续丢失4帧作为重复,并保持每5秒。这表明原始帧率是现在的1/5。我很幸运!由于视频的当前25 fps是原始帧速率的倍数,因此保持和丢弃帧的时间错位不应该存在问题。因此,我重新编码原始视频没有比这更复杂-vf "fps=5",输出似乎没问题。为了确保,我通过mpdecimate过滤器输出了输出,并将所有剩余的帧检测为“保持”。所以原始文件并没有像我想象的那么混乱。


2

如果额外的帧是重复的而不是插值,那么以下可能有效:

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

我们的想法是选择不与前一帧重复的所有帧。然后根据指定的输出速率重新生成PTS。您可能需要向上或向下调整场景值以使检测过滤器正确。如果视频显示比实时更快或更慢,则分别降低或提高速率(和设定分母值)。


我认为这可行,但我发现很难正确调整它。我最终找到了“mpdecimate”过滤器并使用了它,因为它似乎给每个帧一个更明确的“欺骗或不欺骗”结果。
Boann 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.