Video 使用FFMPEG选择视频滤波器,输入为-ss

Video 使用FFMPEG选择视频滤波器,输入为-ss,video,ffmpeg,Video,Ffmpeg,我目前正在使用一个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 但是,由于-ss位于-i之后,这使得ffmpeg对整个视频的解码时间长达6秒。如何更改此命令,使其仍然

我目前正在使用一个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
但是,由于
-ss
位于
-i
之后,这使得ffmpeg对整个视频的解码时间长达6秒。如何更改此命令,使其仍然基于绝对时间戳对视频进行视频过滤?比如说,

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
现在指的是视频中6s后开始的帧编号。这最终会选择不同的帧


当在输入视频上使用
-ss
时,是否可以引用输入视频的绝对时间戳或帧号?

也许您可以使用其他变量,如
t
(PTS-time)。您可能需要使用
start\t
等进行减法,以获得从零开始的时间。有关选择过滤器可用的所有变量,请参见


如果您选择了一个连续的帧范围,那么过滤器可能更容易使用。

您可以添加
-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的精确有理值。

您是否试图选择其表示不跨越秒边界的帧?@Gyan close-在本例中,我想要绝对表示不跨越秒边界的帧。更一般地说,我想以一种非常具体的方式将样本减少到某个fps。我尝试了
start\u t
t
,但在
-I
之前使用
-ss
时,似乎
start\u t
总是0。我并不是想选择一个连续的帧范围,更像是以一种非常特殊的方式在某个fps上选择帧。@mwlon我明白了,如果使用-copyts,有什么区别吗?关于fps,fps、帧速率或帧步过滤器是否有用?