2

实际上,我想检测给定视频源的“最大”(高度和宽度)刻录字幕的坐标。但为了做到这一点,我首先需要检测示例视频中每个不同字幕的框坐标,并比较它们以找到最大的。我不知道从哪里开始,所以我找到的最接近的东西(有点)是 ffmpeg 的bbox视频过滤器,它根据文档计算"the bounding box for the non-black pixels in the input frame luminance plane",基于给定的亮度值:

ffmpeg -i input.mkv -vf bbox=min_val=130 -f null -

这给了我一条线,其中包含视频中每个输入帧的坐标,例如:

[Parsed_bbox_0 @ 0ab734c0] n:123 pts:62976 pts_time:4.1 x1:173 x2:1106 y1:74 y2:694 w:934 h:621 crop=934:621:173:74 drawbox=173:74:934:621

这个想法是制作一个脚本并循环过滤器的输出,通过比较它们来检测“最大”框,并输出它的坐标和帧号作为最长字幕的代表。

bbox即使在带有白色硬字幕的相对较暗的视频中,过滤器也无法正确检测字幕框。通过反复试验并且仅针对我用来运行测试的特定视频样本,检测任何字幕框的“最佳”结果是使用min_val130 的 a(假设有意义的值min_val在 0- 255,虽然文档什么也没说)。使用drawbox过滤器ffplay测试特定帧报告的坐标,我可以看到它只正确检测到字幕的底部/左侧/右侧边界,大概是因为下图中的地球轮廓同样亮:

在此处输入图像描述

提高min_val到 230 会稍微打破之前在底部/左侧/右侧的正确边界:

在此处输入图像描述

将其提高到 240 会给我一个奇怪的结果:

在此处输入图像描述

但是即使我能够通过bbox过滤器达到完美的效果,这种技术也不是万无一失的,原因很明显(min_val应该任意选择,烧录的字幕可以是不同的颜色,字幕后面的图像可以是取决于视频源等,同样甚至更亮)。

所以如果可能的话,我想知道:

  1. 是否有过滤器或其他技术可以与 ffmpeg 一起使用来做我想做的事
  2. 是否有另一个 CLI 工具或编程库来实现这一点
  3. 任何可能有帮助的提示(也许我以错误的方式看待问题)
4

0 回答 0