Python 子进程 (ffmpeg) 仅在我按 Ctrl-C 程序时启动?

Python subprocesses (ffmpeg) only start once I Ctrl-C the program?

我正在尝试使用 Cygwin 和 Python 2.7.运行 并行执行一些 ffmpeg 命令。

我大概是这样的:

import subprocess
processes = set()

commands = ["ffmpeg -i input.mp4 output.avi", "ffmpeg -i input2.mp4 output2.avi"] 

for cmd in commands:
  processes.add(
    subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
  )

for process in processes:
  if process.poll() is None:
    process.wait()

现在,一旦我到达这段代码的末尾,整个程序就会等待。所有 ffmpeg 进程都已创建,但它们处于空闲状态,即使用 0% CPU。 Python 程序一直在等待。只有当我按下 Ctrl-C 时,它突然开始编码。

我做错了什么?我是否必须 "send" 启动它们的进程?

这只是一个猜测,但 ffmpeg 通常会在 stderr 或 stdout 上产生大量状态消息和输出。您正在使用 subprocess.PIPE 将 stdout 和 stderr 重定向到管道,但您从未从中读取过这些内容,因此如果管道缓冲区已满,ffmpeg 进程将在尝试向其写入数据时阻塞。

当你杀死父进程时,管道在其末端关闭,并且可能(我没有检查过)ffmpeg 通过不再写入管道来处理错误,因此解除阻塞并开始工作。

因此,要么使用父进程中的 process.stdoutprocess.stderr 管道,要么 redirect the output to os.devnull 如果您不关心它。

除了 所说的,ffmpeg 可能还会询问您是否要覆盖 output.avi 并等待您输入 "y"。要强制覆盖,请使用“-y”命令行选项 (ffmpeg -i $input -y $output)。