使用 ffmpeg 将图像与视频中的特定帧匹配

match an image to a specific frame within a video with ffmpeg

我有一些图像是通过屏幕截图从视频中截取的。我想知道这些图像在视频中出现的时间(时间戳)。有没有办法使用 ffmpeg 或其他工具以编程方式将图像与视频中的特定帧匹配?

我对不同的技术持开放态度,因为我渴望将其自动化。手动执行此操作将非常耗时。

您可以获得该图像与视频中每一帧之间的psnr,并且匹配是具有最高psnr的帧。 ffmpeg 在 tests/tiny_psnr 中有一个计算 psnr 的工具,您可以使用它来一起编写脚本,或者如果您更喜欢编码而不是脚本,ffmpeg 的 libavfilter 模块中还有一个 psnr 过滤器。

脚本,你基本上将视频解码到 FIFO,将图像解码到文件,然后使用 tiny_psnr 将 FIFO 帧与图像文件重复匹配,选择帧的帧编号最高 psnr。输出将是一个帧数,您可以将其(在命令行上使用 fps 输出)大致转换为时间戳。

编程方面,您将视频和图像解码为 AVFrame,使用 psnr 过滤器比较两者,然后查看输出帧元数据以记录程序中的 psnr 值,并搜索具有最高元数据 psnr 值的帧,对于该帧,AVFrame->pkt_pts 将是时间戳。