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
相关产品推荐
相关产品推荐

