You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:06:21