我尝试使用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}$
这两个管道的
stderr
通道究竟是怎么处理的?在编码器/解码器通常会产生大量的stderr输出,作为状态更新;此输出通过管道传输到您的进程,缓冲区将变满。也许您应该在(无用的,我认为)
.communicate
调用之前添加一些伪的ffmpeg.stderr.read()
调用,或者更好的是完全删除stderr=PIPE
参数。在更新
对于
>/dev/null
等效项,请执行以下操作:显然,您可以对所有要忽略的
nulfp
重复使用相同的nulfp
。在很难看出谁需要传递管道,呃,我的意思是你应该使用NetBeans中的调试器来帮助收集更多线索。管道可能不是最好的方法,也许使用临时文件可以简化事情。在
相关问题 更多 >
编程相关推荐