我正在尝试从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中有错误吗?
答案 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)