ffmpeg:提取帧并获取它们的确切时间戳

Man*_*ngo 6 ffmpeg command-line extract

我正在尝试每 5 秒从可变帧率视频中提取帧,并获取提取的每个帧的确切时间戳。到目前为止,这是我所拥有的:

-i inputfile -vstats_file vstats.log  -vsync 2 -vcodec png -r 0.2 -f image2pipe -
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

frame=     1 q= 0.0 f_size= 136261 s_size=      133kB **time= 5.000** br=   218.0kbits/s avg_br=   218.0kbits/s type= I
frame=     2 q= 0.0 f_size= 139382 s_size=      269kB **time= 10.000** br=   223.0kbits/s avg_br=   220.5kbits/s type= I
frame=     3 q= 0.0 f_size= 141631 s_size=      407kB **time= 15.000** br=   226.6kbits/s avg_br=   222.5kbits/s type= I
Run Code Online (Sandbox Code Playgroud)

我需要用于提取的帧的确切时间戳,以便我以后可以根据生成的缩略图准确地剪切视频。

另外,有没有办法将 vstats 打印到 stdout 而不是文件?

小智 3

我不确定你想做什么,但如果它对你有用那就没关系......

不管怎样,为了跳帧,我会使用SELECT视频过滤器(确保你启用了 libavfilter)。对于帧信息我会使用SHOWINFO视频过滤器。

您的命令应该类似于以下内容:

ffmpeg -i inputfile -vf '[in]select=not(mod(n\,150))[s1];[s1]showinfo[out]' -vcodec mpeg2video outputfile
Run Code Online (Sandbox Code Playgroud)

(其中 150 帧为 5 秒 * 30 fps)

  • showinfo 正是我所需要的,谢谢。顺便说一句,对于可变帧率视频,我使用 select='isnan(prev_selected_t)+gte(t-prev_selected_t,5)'` 每 5 秒获取一帧。 (3认同)