我想使用 FFmpeg 从 MP4 文件中捕获“已更改”的帧。我有一个视频,基本上是幻灯片/屏幕截图的序列。我只想捕获已更改的帧。最好还能检查百分比变化,并且仅当变化超过 10% 时才捕获。
答案1
ffmpeg -i a.mp4 -filter_complex "select=gt(scene\,0.5)" "frames/%04d.jpg"
上面选择了引入场景变化的帧。
答案2
得票最高的答案多次输出每个唯一帧,但无法输出第一帧。
ffmpeg -i a.mp4 -filter_complex "select=bitor(gt(scene\,0.5)\,eq(n\,0))" -vsync drop "frames/%04d.jpg"
这将输出每个唯一帧一次,并将包括视频中的第一帧。
答案3
我为每一帧生成一张图像,并使用 MD5 哈希删除重复的图像:
ffmpeg -i "file.mkv" -r 1 "preffix-%d.png"
md5sum *.png | sort | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm # From https://unix.stackexchange.com/q/192701/209677
根据您的视频,您可能需要调整变化率(本例中为 0.1)。另外,请注意-vsync vfr
。
ffmpeg -i file.mkv -vsync vfr -filter_complex "select=gt(scene\,0.1)" "slides-%04d.jpg"