ffmpeg如何删除重复的画面?

下面这些命令都没有效果

 ffmpeg -i ./input.mp4 -vf mpdecimate ./output.mp4
 ffmpeg -i ./input.mp4 -vf "mpdecimate, setpts=N/FRAME_RATE/TB" -c:a copy ./output.mp4
 ffmpeg -i ./input.mp4 -vf "select='gt(scene,0.4)',setpts=N/FRAME_RATE/TB" -vsync vfr -c:a copy ./output.mp4
 ffmpeg -i ./input.mp4 -vf "select='gt(scene,0.01)',setpts=N/FRAME_RATE/TB" -vsync vfr -c:a copy ./output.mp4
阅读 1.4k
1 个回答

可以用调试模式检查

ffmpeg -i input.mp4 -vf "mpdecimate,setpts=N/FRAME_RATE/TB" -loglevel debug -f null -

这个命令会生成一个控制台读数,显示哪些帧被认为是重复的。通过查看这些信息,可以更好地理解问题所在。

带上详细参数

ffmpeg -i input.mp4 -vf "mpdecimate=hi=64*12:lo=64*8:frac=0.33,select='gt(scene,0.01)',setpts=N/FRAME_RATE/TB" -vsync vfr -c:a copy output.mp4

以下是对这个命令各个参数的补充说明和用途:

mpdecimate 滤镜

  • hi

    • 设置高阈值,用于检测帧之间的差异。默认值为 64*12
    • 值越高,越不容易删除帧,因为需要更大的差异才能检测到变化。
  • lo

    • 设置低阈值,用于检测帧之间的差异。默认值为 64*8
    • 值越低,越容易删除帧,因为即使是较小的差异也会被检测到。
  • frac

    • 设置删除帧的比例。默认值为 0.33
    • 表示如果帧之间的差异小于 33%,则删除该帧。

select 滤镜

  • gt(scene,0.01)

    • select 滤镜用于选择符合条件的帧。gt(scene,0.01) 表示选择场景变化大于 0.01 的帧。
    • scene 参数用于检测帧之间的变化,值越高,表示变化越大。

setpts 滤镜

  • setpts=N/FRAME_RATE/TB

    • 调整帧的显示时间戳(PTS)。
    • N 表示帧号,FRAME_RATE 表示帧率,TB 表示时间基准。
    • 这个设置确保帧的时间戳是连续的,避免因帧删除造成的时间戳断裂。

其他参数

  • -vsync vfr

    • 设置视频同步模式为可变帧率(VFR),确保输出视频的帧率根据实际帧数调整。
  • -c:a copy

    • 复制音频流而不重新编码,保持音频质量不变。

通过这些参数设置,可以有效地处理视频,减少不必要的帧,同时保持音频质量和同步性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏