我目前正在使用 setpts 过滤器来加速或减慢不同的剪辑,准确性对我来说非常重要(上下文:我将这些连接成一个需要完美的最终剪辑与单独的视频同步。)我一直在使用它作为一般方法:
setpts=(targetDuration/totalFrameCount)*N/TB" -r targetDuration/totalFrameCount
虽然大部分时间它都相当准确,但我想知道我是否能取得更好的效果。例如,如果我尝试将一个4秒60fps的剪辑缩小到恰好1秒,即:
ffmpeg -y -i clip_4sec.avi -filter:v "setpts=(1/240)*N/TB" -r 240/1 clip_4sec_scaled_to_1sec.avi
我实际上最终获得了992ms的剪辑。有谁知道为什么会这样?根据我的理解,只要目标持续时间是帧持续时间的倍数(1/60秒),这应该不是问题,对吗?
我可以采取更好的方法来提高准确度吗?
注意:FWIW我已经仔细检查过输入剪辑的实际帧数为240
答案 0 :(得分:2)
源为60 fps,其进出setpts过滤器的时基为1/60。在改变PTS之前,应将其设置为1/240。
ffmpeg -y -i clip_4sec.avi -filter:v "settb=1/240,setpts=(1/240)*N/TB" -r 240/1 clip_4sec_scaled_to_1sec.avi
-r
w.r.t的实施可能存在一个错误。像AVI这样的VFR复用器。