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

问题描述

我能够使用 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 添加到过滤器 after select 和 setpts,但是 %{frame_num} 返回 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...