【问题标题】:FFMPEG scene detection: overlay original frame numberFFMPEG场景检测:叠加原始帧号
【发布时间】:2020-12-21 12:20:29
【问题描述】:

我能够使用ffmpeg -i video.mp4 -vf "select=gt(scene\,0.003),setpts=N/(30*TB)" frame%d.jpg (source) 从视频文件中提取与前一帧不相似的所有帧

我想将帧号叠加到每个选定的帧上。我尝试将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 添加到过滤器 select 和setpts 之后,但是 %{frame_num} 返回1, 2, 3, ... (source)

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

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

【问题讨论】:

    标签: select ffmpeg scene drawtext


    【解决方案1】:

    你在正确的轨道上。先使用 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

    【讨论】:

    • 谢谢,这几乎可以完美运行。它吐出的帧与我的第一个命令完全相同,只是添加了文本。但之后它会继续写入最后一帧的副本,帧号会递增,直到达到原始 video.mp4 中的总帧数。像这样:16, 42, 181, 182, 183, ... , 500 在这种情况下,有没有办法在 181 处“中止”?
    • 调整后的叠加过滤器。
    • ffmpeg 菜鸟在这里。 setpts=N/(30*TB) 有什么用?
    • 修剪后的帧可以在时间上相距很远,并且将保留其原始时间戳,因此输出的视频将保留其原始时长。 setpts 是重新定时帧,使它们以 30 fps 播放。
    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2016-06-26
    相关资源
    最近更新 更多