使用 FFMPEG 选择带有 -ss 输入的视频过滤器
Posted
技术标签:
【中文标题】使用 FFMPEG 选择带有 -ss 输入的视频过滤器【英文标题】:Using FFMPEG select video filter with -ss on input 【发布时间】:2018-07-14 20:06:35 【问题描述】:我目前正在使用这样的 ffmpeg 命令,我想在视频中(例如)6 到 8 秒之间选择非常特殊的视频帧:
ffmpeg
-t 10
-i test/timer.mp4
-ss 6
-vf "select=eq(ceil(n * 1 / 29.97) + 1\, ceil((n+1) * 1 / 29.97)) * lt(n\, 8 * 29.97)"
tmp/%07d.png
但是,这使得 ffmpeg 将整个视频解码长达 6 秒,因为 -ss
在 -i
之后。如何更改此命令以仍然根据 absolute 时间戳对视频进行视频过滤?例如,
ffmpeg
-ss 6
-t 4
-i test/timer.mp4
-vf "select=eq(ceil(n * 1 / 29.97) + 1\, ceil((n+1) * 1 / 29.97)) * lt(n\, 8 * 29.97)"
tmp/%07d.png
不等效,因为n
现在指的是视频中在 6 秒后开始的帧号。这最终会选择不同的帧。
在输入视频上使用-ss
时,有什么方法可以引用输入视频的绝对时间戳或帧号?
【问题讨论】:
您是否要选择显示不跨越秒边界的帧? @Gyan close - 在这个例子中,我想要绝对呈现确实跨越秒边界的帧。更一般地说,我想以一种非常具体的方式下采样到某个 fps。 【参考方案1】:您可以添加 -copyts
来传达源时间戳,但您将无法使用 n
引用馈送到过滤器的帧索引。
假设一个恒定速率的 29.97 视频流,使用
ffmpeg
-ss 6 -to 10
-copyts
-i test/timer.mp4
-vf "select='trunc(t+1001/30000+TB)-trunc(t)'" -vsync 0
tmp/%07d.png
我使用了 29.97 的确切有理值。
【讨论】:
【参考方案2】:也许您可以使用其他变量,例如t
(PTS 时间)。您可能需要用start_t
等进行减法,以使时间从零开始。请参阅https://www.ffmpeg.org/ffmpeg-all.html#select_002c-aselect 了解选择过滤器可用的所有变量。
如果您选择连续范围的帧,那么trim 过滤器可能更易于使用。
【讨论】:
我试过start_t
和t
,但当我在-i
之前使用-ss
时,start_t
看起来总是0。我不是在尝试选择连续范围的帧 - 更像是以非常特定的方式以特定 fps 选择帧。
@mwlon 我明白了,如果你使用 -copyts 有什么不同吗?关于 fps,fps、framerate 或 framestep 过滤器有用吗?以上是关于使用 FFMPEG 选择带有 -ss 输入的视频过滤器的主要内容,如果未能解决你的问题,请参考以下文章
带有 yup420 输出问题的 MOBILE FFMPEG 过滤器复合体