降低视频帧速率但不丢失有用帧

降低视频帧速率但不丢失有用帧

我有一段来自安全摄像头的视频,最初以低帧率录制,可能是 15 fps,可能是 10 fps,甚至更低。后来有人将它转换为 25 fps(不改变时长)。我猜想其中添加了额外的重复帧,这可能也稍微扭曲了原始帧显示的确切时间。

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

我该如何使用 ffmpeg 修复该视频?

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

答案1

我设法修复了我的文件。我发现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。您可能需要调整场景值以正确获取检测过滤器。如果视频看起来比实时更快或更慢,则分别降低或提高速率(和 setpts 分母值)。

相关内容