3

我正在尝试从 python 运行 ffmpeg 并获得一些合理的输出。不管 ffmpeg 的日志级别设置了什么,我从 Popen.communicate() 得到的唯一输出是错误的。但是,内容不是错误。我尝试了相同的代码来运行其他命令(ls),并且输出和错误输出似乎都可以。

我检查了这里和谷歌,不幸的是什么也没找到。大多数示例使用 os 或 commands 模块,而不是子进程。

这是我的测试代码:

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

4

2 回答 2

3

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

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

抱歉……我太专注于 Python 部分,完全忽略了非常明显的事情。:-)

于 2013-02-16T15:35:55.537 回答
0

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

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

import subprocess 

with open("stderr.log", "wb") as logfile:
    subprocess.check_call(command, stderr=logfile)
于 2013-02-16T15:51:52.250 回答