如何获取MKV文件码率?解决ffprobe返回N/A的Python方案
问题原因
MKV封装默认不会在单条音视频流的元数据中写入固定bit_rate字段,之前的ffprobe命令查询的是流级别的码率,因此返回N/A。ffmpeg -i末尾输出的码率是容器维度的统计值,对应ffprobe中format分类下的bit_rate字段,不属于stream分类的查询范围。
可直接获取和
ffmpeg -i结果一致的码率的命令如下:ffprobe -i sample_5.mkv -v quiet -show_entries format=bit_rate -hide_banner -of default=noprint_wrappers=1:nokey=1
Python实现方案
直接用Python内置的subprocess模块调用ffprobe即可,无需安装第三方依赖,代码兼容元数据缺失时自动计算码率的场景:
import subprocess import os def get_mkv_bitrate(file_path: str) -> int: """ 获取MKV文件码率,返回单位为bps(比特每秒) """ # 优先读取容器层面存储的码率元数据 cmd = [ "ffprobe", "-v", "quiet", "-show_entries", "format=bit_rate", "-hide_banner", "-of", "default=noprint_wrappers=1:nokey=1", file_path ] res = subprocess.run(cmd, capture_output=True, text=True) bitrate = res.stdout.strip() if bitrate and bitrate != "N/A": return int(bitrate) # 元数据缺失时,通过 文件总比特数/时长 手动计算 duration_cmd = [ "ffprobe", "-v", "quiet", "-show_entries", "format=duration", "-hide_banner", "-of", "default=noprint_wrappers=1:nokey=1", file_path ] duration_res = subprocess.run(duration_cmd, capture_output=True, text=True) duration = float(duration_res.stdout.strip()) file_bit_size = os.path.getsize(file_path) * 8 return int(file_bit_size / duration) # 调用示例 if __name__ == "__main__": file = "sample_5.mkv" bps = get_mkv_bitrate(file) print(f"码率:{bps} bps ≈ {round(bps/1000)} kbps")
补充说明
- 如果需要单独提取纯视频流的码率(排除音频、字幕轨占用),可以将查询参数改为
stream=bit_rate:stream_type=video,但可变码率的MKV文件该字段经常为空,需要做解码统计才能拿到精准值,普通场景下容器维度的码率和ffmpeg -i展示结果完全一致,可直接使用。 - 运行代码前请确认ffprobe已安装并加入系统环境变量,可在命令行直接调用。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

