在运行ffmpeg时,Popen.communicate()只返回错误信息

3 投票
2 回答
2290 浏览
提问于 2025-04-17 15:52

我正在尝试从Python运行ffmpeg,并希望得到一些合理的输出。不管我设置ffmpeg的日志级别是什么,我从Popen.communicate()得到的唯一输出就是错误信息。不过,这些内容并不是错误。我用同样的代码去运行其他命令(比如ls),结果输出正常,包括正常输出和错误输出。

我在这里和谷歌上查了查,但不幸的是没有找到解决办法。大多数例子使用的是os或commands模块,而不是subprocess。

这是我的测试代码:

command = [
        'ffmpeg',
        '-v', 'debug',
        '-i', '1.mov',
        '-vcodec', 'libx264',
        '-profile:v', 'high',
        '-preset', 'slower',
        '-b:v', '1000k',
        '-vf', 'scale=-1:720',
        '-threads', '0', 
        '-acodec', 'libfdk_aac',
        '-b:a', '192k',
        '-y',   
        '2.mp4',
        ]
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err =  p.communicate()
f = open('out.log', 'w')
f.write(out)
f.close()
f = open('error.log', 'w')
f.write(err)
f.close()

你见过这样的情况吗?我是不是做错了什么,还是ffmpeg本身有bug?

2 个回答

0

默认情况下,ffmpeg 会把日志信息输出到错误信息流,也就是你看到的正常情况。

如果你想把这个错误信息流的输出保存到一个文件里,其实不需要用到 .communicate() 方法:

import subprocess 

with open("stderr.log", "wb") as logfile:
    subprocess.check_call(command, stderr=logfile)
3

我好像误解了ffmpeg中的标准输出和标准错误输出。通常情况下,所有的“控制台输出”都是发送到标准错误输出(stderr)。把标准错误输出重定向到标准输出(stdout)应该能解决这个问题。具体方法如下:

p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

抱歉说这些……我太专注于Python的部分,完全忽略了这个很明显的事情。:-)

撰写回答