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

Python subprocess调用ffprobe获取视频码率输出为0的问题

问题根本原因

subprocess.call()的返回值不是外部命令的打印输出,而是子进程的退出状态码:

  • 当ffprobe命令正常执行完成时,会返回状态码0,这就是你所有检测结果都为0的来源——你拿到的根本不是码率值,是进程执行成功的状态标记。
  • 你在终端直接执行命令时看到的码率,是ffprobe写入到标准输出流(stdout)的内容,subprocess.call()默认不会捕获这部分内容,只会把输出直接透传到当前Python进程的终端,不会把内容作为结果返回。
正确实现代码

你需要显式捕获子进程的标准输出,才能拿到码率数值,Python 3.7+ 推荐使用subprocess.run()实现:

import subprocess

resp = subprocess.run(
    [
        'ffprobe', '-i', pname1,
        '-v', 'quiet',
        '-show_entries', 'format=bit_rate',
        '-hide_banner',
        '-of', 'default=noprint_wrappers=1:nokey=1'
    ],
    capture_output=True,  # 捕获标准输出、标准错误流
    text=True  # 把输出内容按字符串返回,默认是字节流
)
# 去除输出末尾的换行符后转成整数,即为码率值
bit_rate = int(resp.stdout.strip())

如果是低于3.7的Python版本,可以用subprocess.check_output()实现相同效果:

bit_rate = int(
    subprocess.check_output(
        [
            'ffprobe', '-i', pname1,
            '-v', 'quiet',
            '-show_entries', 'format=bit_rate',
            '-hide_banner',
            '-of', 'default=noprint_wrappers=1:nokey=1'
        ]
    ).strip()
)
注意事项
  • 不要随意添加shell=True参数,你当前用列表拆分命令参数的写法可以规避命令注入风险,是更安全的实现方式。
  • 必须对捕获到的输出做strip()处理: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:12:22