【问题标题】:Popen.communicate() returns only err when running ffmpeg运行 ffmpeg 时 Popen.communicate() 仅返回 err
【发布时间】:2013-01-30 04:35:53
【问题描述】:

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

【问题讨论】:

  • 尝试在终端中运行完全相同的命令参数,看看会发生什么。要将实际参数作为字符串获取,如果您在 Linux 上,可以在 Python 脚本中将 ffmpeg 替换为 echo
  • 在终端运行命令是可以的。我做了我想做的事,控制台输出不是错误。因此,我希望在通信()的输出返回值中具有相同的输出。这是错误的部分。我也尝试使用其他命令运行,一切正常。

标签: python ffmpeg subprocess


【解决方案1】:

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

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

对此感到抱歉...我太专注于 Python 部分,以至于完全忽略了非常明显的事情。 :-)

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。我知道check_call。我不将输出保存到文件中,而是以某种方式处理数据。在这里更容易放一些更短的东西而不是带有许多其他代码的垃圾邮件:-)
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2019-05-05
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多