【问题标题】:subprocess in python does not produce the outputpython中的子进程不产生输出
【发布时间】:2021-12-16 22:36:49
【问题描述】:

我有这个 ffmpeg 命令:

ffmpeg -y -i 6.mp4 -vf scale=1280:-2,setsar=1:1 -c:v libx264 -c:a copy 720p.mp4

我想通过 python 代码来实现它。为此,我使用了 subprocess 函数,并为此使用了以下代码:

subprocess.call(['ffmpeg.exe','-y','-i', pname1,'-vf','scale=','1280:-2','setsar=','1:1','-c:v', 'libx264', '-c:a', 'copy', pname2])

pname1pname2 是输入和输出文件的名称。这个程序运行没有任何错误,但它什么也没产生。你知道是什么问题吗?

【问题讨论】:

  • “运行没有任何错误”——你怎么知道的?如果您不打算存储和检查返回的对象,我还强烈建议您传递check=True。此外,如果您不设置 stdout=subprocess.PIPEstderr=subprocess.PIPE,您将看不到从 Python 写入的输出,因此需要检查从 Python 进程本身继承的 stdout 和 stderr。
  • 在尝试放入 Python 代码之前,您是否验证了您的 ffmpeg 命令是否有效?

标签: python python-3.x ffmpeg


【解决方案1】:

要查看进程在做什么,您可以通过替换来捕获输出:

subprocess.call(["command"])

与:

subprocess.check_output(["command"], stderr=subprocess.STDOUT)

https://docs.python.org/3.9/library/subprocess.html#subprocess.check_output

所以你的电话会变成:

ffmpeg_output = subprocess.check_output(
    ['ffmpeg.exe','-y','-i', pname1,'-vf','scale=','1280:-2','setsar=','1:1','-c:v', 'libx264', '-c:a', 'copy', pname2],
    stderr=subprocess.STDOUT
)
print(ffmpeg_output)

【讨论】:

  • (我认为这更适合作为描述调试提示的注释;answer 应该是解决问题的正确方法;问题不是应将应回答的问题推回,直到 OP 添加足够的信息以允许回答)。
  • 除此之外:您不需要合并 stderr 和 stdout 来检查它们——一个可以(而且,我认为应该)将它们分开并捕获两者,默认情况下使用 @ 987654325@。另外,添加check=True,当退出状态为非零时,您将得到一个异常,而无需使用check_* 函数之一。
【解决方案2】:

正确的语法是:

subprocess.call(['ffmpeg.exe', '-y', '-i', pname1, '-vf', 'scale=1280:-2,setsar=1:1', '-c:v', 'libx264', '-c:a', 'copy', pname2])

列表中的每个元素(在第一个元素之后)代表一个参数。
FFmpeg 的单独参数可以通过它们之间的空格来标识(在命令行中执行 FFmpeg 时)。

执行原始命令时,我收到一条错误消息:

[NULL @ 0000020fb89bc2c0] 无法为 '1280:-2' 找到合适的输出格式 1280:-2: 参数无效

错误信息打印到stderr(通常打印到控制台)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    相关资源
    最近更新 更多