Popen.communicate()在运行ffmpeg时仅返回错误

时间:2013-02-14 11:26:31

标签: python ffmpeg subprocess

我正在尝试从python运行ffmpeg并获得一些合理的输出。无论ffmpeg的日志级别设置如何,我从Popen.communicate()获得的唯一输出是错误的。但是内容不是错误。我尝试使用相同的代码来运行其他命令(ls),并且输出和错误输出似乎都没问题。

我在这里查了一下谷歌并且遗憾地一无所获。大多数示例使用os或命令模块,而不是子进程。

这是我的测试代码:

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中有错误吗?

2 个答案:

答案 0 :(得分:1)

在ffmpeg的情况下,我似乎误解了stdout和stderr。所有“控制台输出”通常都指向stderr。将stderr重定向到stdout将解决问题。这是如何:

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

对不起这个...我太专注于Python部分,我完全忽略了很明显的事情。 : - )

答案 1 :(得分:0)

默认情况下ffmpeg会记录到stderr,即您会看到预期的行为。

要将命令的stderr输出保存到文件,您不需要.communicate()

import subprocess 

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