2013-02-14 66 views
1

我试图从python运行ffmpeg并获得一些合理的输出。无论设置什么ffmpeg的日志级别,我从Popen.communicate()获得的唯一输出是错误的。但内容不是错误。我尝试了相同的代码来运行其他命令(ls),并且对于out和err输出,它似乎都正常。运行ffmpeg时Popen.communicate()只返回err

我在这里检查过,Google很遗憾地没有发现任何东西。大多数示例使用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中有错误?

+0

尝试在终端运行完全相同的命令参数,看看会发生什么。要将实际参数作为字符串获取,您可以在Python脚本中用'echo'代替'ffmpeg'。 – sashoalm 2013-02-14 20:54:48

+0

在终端中运行命令是可以的。我做我想做的事,控制台输出不是错误。因此,我期望communican()的返回值相同的输出。这是错误的一部分。我试图与其他命令一起运行,那里是可以的。 – 2013-02-16 12:50:19

回答

1

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

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

对不起,这个...我是过于集中于我完全忽略了很明显的事情Python的一部分。 :-)

0

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

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

import subprocess 

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

谢谢。我知道check_call。我不保存输出到文件,但以某种方式处理数据。在这里放一些简短的东西,而不是很多其他代码的垃圾邮件比较容易:-) – 2013-02-16 22:10:09