FFMPEG场景检测:叠加原始帧号

FFMPEG scene detection: overlay original frame number

我可以使用 ffmpeg -i video.mp4 -vf "select=gt(scene\,0.003),setpts=N/(30*TB)" frame%d.jpg (source)

从视频文件中提取与前一帧不相似的所有帧

我想将帧编号叠加到每个 selected 帧上。我尝试将 drawtext=fontfile=/Windows/Fonts/Arial.ttf: text='frame\: %{frame_num}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1: fontsize=30 添加到过滤器 after select 和 setpts,但是 %{frame_num} returns 1, 2, 3, ... ( source)

如果我将 drawtext 放在 select 和 setpts 之前,我会得到类似 16, 42, 181, ... 的帧编号(这正是我想要的),但是由于场景检测在 添加文本叠加层后 运行,因此也可以检测到叠加层的变化。

是否可以独立进行场景检测和叠加? [in] split [out0][out1] 可以单独应用过滤器,但我不知道如何再次“组合”结果。

你走在正确的轨道上。首先使用 split 创建两个流。 运行 在一个上进行场景检测,在另一个上绘制文本。然后使用覆盖在修剪后的流上绘制编号流 - 只会发出相应的修剪编号帧。

ffmpeg -i video.mp4 -vf "split=2[num][raw];[raw]select=gt(scene\,0.003)[raw];[num]drawtext=fontfile=/Windows/Fonts/Arial.ttf: text='frame\: %{frame_num}': x=(w-tw)/2: y=h-(2*lh): fontcolor=white: box=1: boxcolor=0x00000000@1: fontsize=30[num];[raw][num]overlay=shortest=1,setpts=N/(30*TB)" -r 30 frame%d.jpg