slh*_*hck 2 python subprocess ffmpeg
我正在尝试使用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()
Run Code Online (Sandbox Code Playgroud)
现在,一旦我在这段代码的末尾,整个程序就会等待.创建了所有ffmpeg进程,但它们处于空闲状态,即使用0%CPU.而Python程序一直在等待.只有当我按下Ctrl-C时,它才会突然开始编码.
我究竟做错了什么?我是否必须向流程"发送"一些内容才能启动它们?
这只是猜测,但ffmpeg通常会在stderr或stdout上产生大量状态消息和输出.您正在使用subprocess.PIPE将stdout和stderr重定向到管道,但是您从不读取它们,因此如果管道缓冲区已满,ffmpeg进程将在尝试向其写入数据时阻塞.
当你杀死父进程时,管道在它的末端被关闭,并且可能(我还没有检查)ffmpeg通过不再写入管道来处理错误,因此解除阻塞并开始工作.
因此,如果您不关心它,那么eiter会消耗父进程中的process.stdout和process.stderr管道,或者将输出重定向到os.devnull.
| 归档时间: |
|
| 查看次数: |
438 次 |
| 最近记录: |