Python子进程(ffmpeg)只在我按Ctrl-C程序启动一次?

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

我尝试使用cygwin和python 2.7并行运行几个ffmpeg命令。

这大概就是我所拥有的:

1
2
3
4
5
6
7
8
9
10
11
12
13
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时,它才会突然开始编码。

我做错什么了?我是否必须"发送"一些东西到流程以启动它们?


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

当您终止父进程时,管道将在其末端关闭,并且可能(我还没有检查)ffmpeg通过不再写入管道来处理错误,因此被取消阻塞并开始工作。

因此,如果您不在乎,它会在父进程中使用process.stdoutprocess.stderr管道,或者将输出重定向到os.devnull


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