使用FFMPEG选择视频过滤器,输入端带有-ss

时间:2018-07-14 20:06:35

标签: 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之后,因此ffm​​peg最多可以将整个视频解码6s。如何更改此命令以仍然基于绝对时间戳对视频进行视频过滤?例如,

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时,是否有任何引用输入视频的绝对时间戳或帧号的方法?

2 个答案:

答案 0 :(得分: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的确切有理值。

答案 1 :(得分:0)

也许您可以改用其他变量,例如t(PTS时间)。您可能需要用start_t进行减法,以使时间从零开始。有关选择过滤器可用的所有变量,请参见https://www.ffmpeg.org/ffmpeg-all.html#select_002c-aselect

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