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

2024-05-15

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

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


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

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

所以要么消费process.stdout and process.stderr父进程中的管道,或者将输出重定向到os.devnull https://stackoverflow.com/questions/11269575/how-to-hide-output-of-subprocess-in-python-2-7/11269627#11269627如果你不关心它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 子进程(ffmpeg)仅在我按 Ctrl-C 程序时启动? 的相关文章

随机推荐