Vap*_*ire 14 ffmpeg thumbnails video-processing
我已经非常密集地浏览了互联网,但我找不到我需要的东西,只是它的变化并不是我想要使用的东西.
我有几个不同长度的视频,我想从开始到结束从每个视频中提取20个图像,以显示视频最广泛的印象.
所以一个视频是16m 47s长=> 1007s =>我必须每隔50秒制作一个视频快照.
所以我想使用ffmpeg的-r开关,其值为0.019860973(eq 20/1007),但ffmpeg告诉我帧速率太小了......
我想出来的唯一方法就是编写一个脚本,用一个被操纵的-ss开关调用ffmpeg并使用-vframes 1,但这对我来说非常慢而且有点偏离,因为ffmpegs会对图像本身进行计算...
有什么建议或指示吗?
谢谢,Vapire
Gho*_*ode 17
我知道我参加聚会有点晚了,但我认为这可能会有所帮助:
对于每个人都有问题,ffmpeg为每一帧生成一个图像,这就是我如何解决它(使用blahdiblah的答案):
首先,我抓住了视频中的总帧数:
ffprobe -show_streams <input_file> | grep "^nb_frames" | cut -d '=' -f 2
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用select来抓取帧:
ffmpeg -i <input_file> -vf "select='not(mod(n,100))'" <output_file>
Run Code Online (Sandbox Code Playgroud)
但是,无论mod(n,100)被设置为什么,ffmpeg都会吐出太多帧.我不得不添加-vsync 0来纠正它,所以我的最终命令看起来像这样:
ffmpeg -i <input_file> -vsync 0 -vf "select='not(mod(n,100))'" <output_file>
Run Code Online (Sandbox Code Playgroud)
(其中100是你想要使用的帧频,例如,每100帧)
希望拯救别人一点麻烦!
Ter*_*Tan 15
我也试图找到这个问题的答案.我利用了拉德里的答案,但发现它有一个错误.
ffmpeg -i video.avi -r 0.5 -f image2 output_%05d.jpg
Run Code Online (Sandbox Code Playgroud)
每2秒产生一帧,因为-r表示帧速率.在这种情况下,每秒0.5帧,或每2秒1帧.
使用相同的逻辑,如果您的视频长度为1007秒,并且您只需要20帧,则每50.53秒需要一帧.转换为帧速率,每秒0.01979帧.
所以你的代码应该是
ffmpeg -i video.avi -r 0.01979 -f image2 output_%05d.jpg
Run Code Online (Sandbox Code Playgroud)
我希望帮助某人,就像它帮助了我一样.
您可以尝试将视频转换为N个图像吗?
ffmpeg -i video.avi image%d.jpg
Run Code Online (Sandbox Code Playgroud)
更新:
或者每2秒提取一次帧:
ffmepg -i video.avi -r 0.5 -f image2 output_%05d.jpg
Run Code Online (Sandbox Code Playgroud)
更新:
要获得视频时长:
ffmpeg -i video.avi 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//
Run Code Online (Sandbox Code Playgroud)
然后,取决于您的编程语言,您将其转换为秒.例如,在PHP中,您可以这样做:
$duration = explode(":",$time);
$duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]);
Run Code Online (Sandbox Code Playgroud)
其中$ time是视频时长.你可以执行$ duration_in_seconds/20
ffmepg -i video.avi -r $duration_in_seconds/20 -f image2 output_%05d.jpg
Run Code Online (Sandbox Code Playgroud)
通常,ffmpeg会在帧到来时处理帧,因此基于总持续时间/帧总数的任何内容都需要进行一些预处理.
我建议编写一个简短的shell脚本来获取使用类似内容的帧总数
ffprobe -show_streams <input_file> | grep "^nb_frames" | cut -d '=' -f 2
Run Code Online (Sandbox Code Playgroud)
然后使用select视频过滤器挑选出您需要的帧.所以ffmpeg命令看起来像
ffmpeg -i <input_file> -vf "select='not(mod(n,100))'" <output_file>
Run Code Online (Sandbox Code Playgroud)
除了代替每第100帧,100将被shell脚本中计算的数字替换为总共20帧.