FFMPEG - 如何提取帧并删除连续重复的帧作为图像

5
有没有什么方式(通过脚本或者调用ffmpeg时可能错过的参数),可以从avi文件中提取帧并忽略顺序重复的帧,因此可以查看图片只关注差异/变化?我经常需要在工作中记录会议,很多时候,当我们在电话中交谈时,我所看到的客户屏幕并没有发生变化。会议结束后,我需要将这些图像作为我们的文档和规范收集的一部分。我知道我可以输出每一帧并将它们通过任何给定的重复文件删除工具运行,但这将删除所有重复帧。所以,如果提取的帧如下所示:A、A、A、B、B、B、B、C、C、A、A、C、C、C、B、B、B...通过典型的重复文件删除程序处理,我将得到:A、B、C。我想要的是:A、B、C、A、C、B。我目前使用的提取图像的命令是:ffmpeg.exe -i file.avi -ss 0 -sameq -f image2 -r 1 images%5d.png。我之前获取了每一帧(从上面去掉-r 1),但那样会生成太多的帧,难以处理,因为这些在线会议可能持续数小时,所以现在我从文件中每秒获取一帧。最好是一个基于Windows的解决方案,但是如果其他平台有可用的解决方案,我相信其他人也会感兴趣。非常感谢任何解决方案或指引。
3个回答

6
你是否尝试使用-vsync 0选项?这可以帮助解决问题。

这差不多了,但是当我尝试时,fdupes 仍然找到更多连续相同的帧来削减。 - Camille Goudeseune
1
在我的情况下(低帧率),每个帧被复制了50次。使用这个选项,每1000个非复制的帧只有1个被复制。 - user2518618
1
对我来说,确切地出现了与输入帧数相同的输出。也许其他评论者看到了一些全黑的转场帧,这些帧可能会重复出现? - David Parks
一样。它给了我准确的输入帧数。其他人这个功能是怎么工作的? - Innat

2

1

您可以通过mpdecimate视频滤镜(接着使用setpts滤镜以获得正确的时间)来实现。
使用以下选项:

-vf mpdecimate,setpts=N/FRAME_RATE/TB

也许您的原始命令无法正常工作,您需要使用它先将原始视频转换为没有重复帧的视频:
ffmpeg.exe -i file.avi -vf mpdecimate,setpts=N/FRAME_RATE/TB outfile.avi

然后使用outfile.avi来生成图像序列。
(如果需要,过滤器mpdecimate可以通过其选项hilofrac进行调整,但默认值效果良好。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接