使用 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_tt,但当我在-i之前使用-ss时,start_t看起来总是0。我不是在尝试选择连续范围的帧 - 更像是以非常特定的方式以特定 fps 选择帧。 @mwlon 我明白了,如果你使用 -copyts 有什么不同吗?关于 fps,fps、framerate 或 framestep 过滤器有用吗?

以上是关于使用 FFMPEG 选择带有 -ss 输入的视频过滤器的主要内容,如果未能解决你的问题,请参考以下文章

带有 yup420 输出问题的 MOBILE FFMPEG 过滤器复合体

csharp 使用ASP.Net转换带有FFMPEG的视频

csharp 使用带有.net的ffmpeg从视频创建缩略图图像

带有 opencv 的 IP 摄像机:错误 ffmpeg

ffmpeg实现视频I帧提取

使用 gpu 使用 ffmpeg 转换视频