Select FFMPEG场景检测:覆盖原始帧编号

Select FFMPEG场景检测:覆盖原始帧编号,select,ffmpeg,scene,drawtext,Select,Ffmpeg,Scene,Drawtext,我可以使用ffmpeg-I video.mp4-vf“select=gt(scene\,0.003),setpts=N/(30*TB)“frame%d.jpg() 我希望将帧编号覆盖到每个选定帧上。我尝试添加drawtext=fontfile=/Windows/Fonts/Arial.ttf:text='frame\:%{frame\u num}':x=(w-tw)/2:y=h-(2*lh):fontcolor=white:box=1:boxcolor=0x00000000@1:fontsize

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

我希望将帧编号覆盖到每个选定帧上。我尝试添加
drawtext=fontfile=/Windows/Fonts/Arial.ttf:text='frame\:%{frame\u num}':x=(w-tw)/2:y=h-(2*lh):fontcolor=white:box=1:boxcolor=0x00000000@1:fontsize=30
到select和setpts之后的过滤器,但是%{frame_num}返回
1,2,3,…
()

如果我将drawtext放在select和setpts之前,我会得到类似于
16、42、181、
的帧号(这正是我想要的),但由于场景检测在添加文本覆盖后运行,因此也可能检测到覆盖中的更改


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

您的思路是正确的。使用“先拆分”创建两个流。在一个上运行场景检测,并在另一个上绘制文本。然后使用叠加在修剪后的流上绘制编号的流-只会发出相应的修剪编号帧


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\u 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帧%d.jpg

谢谢,这几乎是完美的。它吐出与我的第一个命令完全相同的帧,只是添加了文本。但之后,它会继续写入最后一帧的副本,帧数不断增加,直到达到原始video.mp4中的总帧数。像这样:
16,42,181,182,183,500
在这种情况下,是否有办法在181时“中止”?已调整覆盖过滤器。谢谢,现在它可以工作了!这里没有。setpts=N/(30*TB)用于什么?修剪后的帧在时间上可能相距很远,并将保留其原始时间戳,因此输出的视频将保留其原始持续时间。设置是重定时帧,以便以每秒30帧的速度播放。