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

时间:2016-02-04 10:46:39

标签: python ffmpeg subprocess

我正在尝试使用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时,它才会突然开始编码。

我做错了什么?我是否必须向流程“发送”某些内容才能启动它们?

2 个答案:

答案 0 :(得分:6)

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

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

因此,如果您不关心父进程中的process.stdoutprocess.stderr管道,那么就会消耗baseAddressredirect the output to os.devnull

答案 1 :(得分:3)

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

相关问题