如何用FFmpeg/ffprobe一键统计视频每秒的画面帧数?
单条命令统计视频每秒帧数的方法
问题描述
我需要统计相机拍摄的视频中每秒的画面帧数(由于拍摄机制限制,无法保证帧率恒定,需对此进行验证)。目前我需分开运行FFmpeg和ffprobe:首先用FFmpeg裁剪视频,命令为:
ffmpeg -ss 00:00:00 -to <desired time in seconds> -i <in_video> -c copy <out_video>
再用ffprobe统计片段帧数,命令为:ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -print_format csv <out_video>
请问是否存在单条命令可输出视频每秒的帧数?
解决方案
可以用单条命令直接统计原视频每秒的帧数,无需提前裁剪,以下是两种高效实现方式:
方法1:ffmpeg + awk 组合统计
ffmpeg -i <in_video> -vf "showinfo" -f null - 2>&1 | grep "n:" | awk '{split($8,a,"="); split($10,b,"="); sec=int(b[2]); frames[sec]++} END {for(s in frames) print "第" s "秒:" frames[s] "帧"}'
- 逻辑:通过
showinfo滤镜输出每帧的时间戳信息,用grep筛选出帧数据行,再用awk提取秒数并分组统计该秒内的帧数,最后按秒输出统计结果。
方法2:ffprobe + awk 组合统计(更简洁)
ffprobe -v error -select_streams v:0 -show_entries frame=pkt_pts_time -of csv=print_section=0 <in_video> | awk '{sec=int($1); count[sec]++} END {for(s in count) print "第" s "秒:" count[s] "帧"}'
- 逻辑:用
ffprobe直接导出每帧的显示时间戳(pkt_pts_time),通过awk将时间戳取整为秒,按秒分组统计帧数,最终输出每秒的实际帧数。
两种方法都能直接验证视频帧率是否恒定,结果直观展示每秒的帧数变化,省去了额外的视频裁剪步骤。
内容的提问来源于stack exchange,提问作者citygoar
相关产品推荐
相关产品推荐

