Python对管道和大文件的子处理

2024-05-23 16:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用python+ffmpeg+oggenc将任何音频文件转换为ogg。这个程序几乎可以工作。但是对于大文件(我想是大约6mb),ffmpeg进程开始在pipe_wait处休眠。我不知道它在等哪根管子。在

如果我终止ffmpeg进程,oggenc进程将继续,我将得到一个ogg文件,其中包含大约2:40的所有声音。在

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from subprocess import Popen, PIPE
from sys import argv

ffmpeg = Popen([
    "ffmpeg",
    "-i", argv[1],
    "-vcodec", "null",
    "-acodec", "pcm_s16le",
    "-ac", "2",
    "-ab", "44100",
    "-f", "wav",
    "-"
],stdout = PIPE,stderr = PIPE)

oggenc = Popen([
    "oggenc",
    "-", "--raw",
    "-q", "4",
    "-o", argv[2]
],stdin = ffmpeg.stdout,stderr = PIPE)

oggenc.communicate()
ffmpeg.communicate()

编辑:

我想我可以补充一句,这是完美的:

^{pr2}$

Tags: 文件fromimport程序进程stderrstdoutffmpeg
2条回答

这两个管道的stderr通道究竟是怎么处理的?在

编码器/解码器通常会产生大量的stderr输出,作为状态更新;此输出通过管道传输到您的进程,缓冲区将变满。也许您应该在(无用的,我认为).communicate调用之前添加一些伪的ffmpeg.stderr.read()调用,或者更好的是完全删除stderr=PIPE参数。在

更新

对于>/dev/null等效项,请执行以下操作:

nulfp = open(os.devnull, "w")
…
… = subprocess.Popen(…, stderr=nulfp.fileno())

显然,您可以对所有要忽略的nulfp重复使用相同的nulfp。在

很难看出谁需要传递管道,呃,我的意思是你应该使用NetBeans中的调试器来帮助收集更多线索。管道可能不是最好的方法,也许使用临时文件可以简化事情。在

相关问题 更多 >