关于使用FFmpeg/ffprobe跨格式提取视频码率及码率准确性的技术咨询
关于使用FFmpeg/ffprobe跨格式提取视频码率及码率准确性的技术咨询
Hey,我来帮你解决这两个问题~
一、跨格式提取视频码率的解决方法
你用的ffprobe -i /test_b200.webm -v quiet -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1命令在MP4上生效,但WebM不行,大概率是因为多数WebM文件采用**可变码率(VBR)**编码,这类文件的容器中往往不会直接存储stream层级的bit_rate字段,所以拿不到值。
不过有两种通用方案,几乎支持所有视频格式:
- 方案1:计算真实平均码率(最可靠)
先获取视频的总时长和文件大小,再通过公式计算:
执行命令:
命令会输出两个数值:第一个是视频时长(单位:秒),第二个是文件大小(单位:字节)。用公式ffprobe -i /test_b200.webm -v quiet -show_entries format=duration,size -of default=noprint_wrappers=1:nokey=1(文件大小 × 8) ÷ 时长就能得到平均码率(单位:bps)。比如文件大小是1000000字节、时长10秒,计算结果就是(1000000×8)/10=800000 bps(即800 kbps)。这个方法完全不受容器格式限制,只要视频能正常读取就能用。 - 方案2:尝试从编码流中读取(若存在)
可以换用JSON格式输出,看看是否存在隐藏的码率信息:
如果返回的JSON中包含ffprobe -i /test_b200.webm -v quiet -select_streams v:0 -show_entries stream=bit_rate -of jsonbit_rate字段,就能直接取用;如果还是没有,就用方案1即可。
另外,你不用怀疑是WebM转换出错——只要视频能正常播放,就不是转换的问题,只是WebM容器的特性导致部分字段未存储而已。
二、码率的准确性问题
码率的准确性要分两种编码类型来看:
- 固定码率(CBR):这类视频的码率是编码时就固定的,不管是从ffprobe拿到的
bit_rate还是计算出的平均码率,都是准确值。 - 可变码率(VBR):
- 若ffprobe能读取到
stream层级的bit_rate,这个值一般是编码时设置的目标码率或预估平均码率,属于近似值; - 而通过文件大小+时长计算出的平均码率,是基于文件实际总比特数除以总时长得到的真实平均码率,这个值是准确的。
- 若ffprobe能读取到
备注:内容来源于stack exchange,提问作者Дмитрий
相关产品推荐
相关产品推荐

