ffmpeg - 删除顺序重复的帧

met*_*ira 40 ffmpeg duplicates

有没有办法检测视频中的重复帧ffmpeg.

我尝试用-vf旗帜select=gt(scene\,0.xxx)改变场景.但是,它对我的​​情况不起作用.

Gya*_*yan 55

使用mpdecimate过滤器,其目的是"删除与前一帧没有太大差异的帧以降低帧速率".

  • 这将生成一个控制台读数,显示过滤器认为哪些帧是重复的.

    ffmpeg -i input.mp4 -vf mpdecimate -loglevel debug -f null -

  • 生成删除了重复项的视频

    ffmpeg -i input.mp4 -vf mpdecimate,setpts=N/FRAME_RATE/TB out.mp4


setpts滤波器表达在帧频fps的视频产生光滑时间戳.请参阅ffmpeg什么是视频时间刻度,时基或时间戳的时间戳说明?

  • @MarkNeu 不,它引用了 ffmpeg 检测到的 FPS (3认同)
  • 是否将“ FRAME_RATE”替换为帧频? (2认同)

Vla*_*čík 19

我也遇到了这个问题,Gyan上面的优秀答案让我开始了,但结果却是去同步音频所以我不得不探索更多选择:

mpdecimate vs decimate过滤器

  • mpdecimate 是我在SO和互联网上找到的标准建议,但我不认为它应该是第一个选择
    • 它使用启发式,因此可能会跳过一些重复的帧
    • 您可以使用frac参数调整检测,但如果可以的话,这可能是您想要避免的额外工作
    • 它不是真的应该mp4容器()一起使用,但我使用的mkv是这个限制不适用于我的情况,但很高兴知道它
  • decimate 精确地删除帧,但它仅对定期出现的重复项有用

检测到的实际帧速率

  • 所以你有多个帧的多媒体文件,最好确保检测到的帧速率与实际帧速率匹配
  • ffprobe in.mkv将输出检测到的FPS; 它可能看起来像这样

    Stream #0:0: Video: h264 (Main), yuvj420p(pc, bt709, progressive), 1920x1080, SAR 1:1 DAR 16:9, 25 fps, 25 tbr, 1k tbn, 50 tbc (default)

  • 如果您in.mkv在媒体播放器中打开媒体,可以找到当时步进一帧的实际帧速率; 然后计算推进播放时间1秒所需的步骤,在我的情况下它是30 fps

  • 对我来说不是一个大惊喜,因为每6帧都是重复的(5个好的帧和1个重复),所以在25个好的帧之后还有5个重复

什么是 N/FRAME_RATE/TB

FRAME_RATE 变量与文字FPS值(例如25)

  • 这就是了解您检测到的和实际FPS很重要的原因
  • 如果检测到的FPS与您的实际FPS相匹配(例如两者都是30 fps),您可以愉快地使用FRAME_RATE变量N/FRAME_RATE/TB
  • 但如果检测到的FPS不同,则必须FRAME_RATE自行 计算
    • 在我的情况下,我的实际FPS是每秒30帧,我每隔6帧移除一次,所以目标FPS是25,这导致N/25/TB
      • 如果我使用FRAME_RATE(我实际上尝试过),它将采取错误检测到的25帧fps,即FRAME_RATE=25,通过mpdecimate过滤器运行它将删除每第6帧,它将更新到FRAME_RATE=20.833所以N/FRAME_RATE/TB实际上将N/20.833/TB 是完全错误

使用或不使用setpts

关于asetpts的说明

  • 它与setpts做同样的工作,但对于音频
  • 它并没有真正为我修复desync音频,但你想使用它这样的东西 -af asetpts=N/SAMPLE_RATE/TB
  • 也许你应该SAMPLE_RATE根据删除的重复帧的比例来调整,但在我看来像是额外的不必要的工作,特别是当我的视频在开始时同步音频时,所以最好使用命令来保持它而不是以后修复它的方式

TL;博士

如果通常建议的命令不起作用,请尝试:ffmpeg -i in.mkv -vf mpdecimate,setpts=N/FRAME_RATE/TB out.mkv

ffmpeg -i in.mkv -vf mpdecimate out.mkv

要么

ffmpeg -i in.mkv -vf decimate=cycle=6,setpts=N/25/TB out.mkv

(cycle=6因为每第6帧都是重复的,N/25/TB因为删除重复后视频将有25 fps(避免FRAME_RATE变量);根据您的用例进行调整)