如何用FFmpeg获取视频平均码率与峰值码率及码率计算疑问
如何用FFmpeg获取视频的平均码率与峰值码率?附码率计算不符的解惑
一、正确获取平均码率的方法
FFmpeg配套的ffprobe工具是精准获取码率的首选,推荐两种方式:
- 直接提取视频流平均码率:避免音频、字幕等其他流干扰,直接输出视频流的统计平均码率(CBR编码时与标称码率一致,VBR编码时为实际平均):
输出结果单位为bps,除以1000即可得到常用的kb/s单位。ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4 - 手动验证视频流平均码率:如果想自己计算,先提取视频流单独的大小,再结合时长计算:
- 提取视频流大小:
ffprobe -v error -select_streams v:0 -show_entries stream=size -of default=noprint_wrappers=1:nokey=1 input.mp4 - 套用公式:
(视频流大小 × 8) / 视频时长 = 平均码率(bps),除以1000转换为kb/s。
- 提取视频流大小:
二、获取峰值码率的方法
FFmpeg没有直接输出峰值码率的命令,但可以通过帧级分析计算:
- 提取所有视频帧的数据包大小(单位:字节):
ffprobe -v error -select_streams v:0 -show_entries frame=pkt_size -of csv=p=0 input.mp4 - 结合帧率计算单帧码率:比如帧率为30fps,每帧间隔是1/30秒,单帧码率公式为
(帧大小 × 8) / (1/帧率)(单位:bps),找出所有帧码率的最大值就是峰值码率。
另外,也可以用转码命令间接参考峰值:
ffmpeg -i input.mp4 -f null -
执行结束后,最后一行输出的bitrate=xxx kbits/s是处理过程中的实时码率峰值参考,虽不如帧分析精准,但足够快速判断。
三、你的码率计算不符问题解惑
你之前的计算犯了一个常见的细节错误:混淆了字节(Byte)和比特(Bit)的转换关系!
- 正确的总码率(包含视频+音频+容器元数据)计算公式是:
代入你的数据:总码率(kb/s)= (文件总大小 × 8) / 时长 / 1000(114915563 × 8) / 179 / 1000 ≈ 5136 kb/s - 而
ffmpeg -i显示的4997 kb/s是视频流单独的码率,剩下的5136 - 4997 ≈ 139 kb/s是音频流+容器元数据的码率,完全匹配逻辑。 - 你之前直接用
文件大小/时长得到字节每秒,却误当成了kb/s,忘记乘以8(1字节=8比特),导致数值差了8倍,才出现642kb/s与4997kb/s的巨大差异。
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

