我目前正在使用这样的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最多可以将整个视频解码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
时,是否有任何引用输入视频的绝对时间戳或帧号的方法?
答案 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过滤器可能更易于使用。