我在通过python(2.6.1)子进程使用mencoder(SVN-r30531-4.2.1)时遇到问题。我正在尝试加入两个完全相同的大小,编解码器等的mp4文件。两者都没有音频。我用来测试的代码是:
import subprocess
mp4merge = [ "mencoder", "in1.mp4", "in2.mp4", "-ovc", "copy", "-oac", "copy", "-of", "lavf", "-o", "out.mp4" ]
try:
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while pMerge.poll() == None:
for l in pMerge.stderr.readlines():
print l
if pMerge.poll() is not None:
print "Complete"
except subprocess.CalledProcessError:
print "fail"
它不起作用,只是无限期挂起。但是,当我通过终端(OS X 10.6.4)运行完全相同的命令时,它可以工作。命令是:
mencoder in1.mp4 in2.mp4 -ovc copy -oac copy -of lavf -o out.mp4
您可以下载视频from here。我非常有信心视频不是问题,因为它可以在终端上运行。
答案 0 :(得分:2)
这里的问题是pMerge.stderr.readlines()
会一直阻塞,直到流程结束。在继续之前,它会读取所有行。
由于mencoder向stdout写了很多东西,stdout缓冲区被填充,mencoder在它继续之前等待它清空。所以这个过程永远不会结束。
这是一种做同样的方法,不会挂起:
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr
允许您逐行读取输出的另一个选项是将stderr重定向到stdout,然后只读取stdout,(不要使用readlines(),因为它会阻塞直到读取所有行):
pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT)
for line in pMerge.stdout:
print line,
这会将stderr重定向到stdout,因此缓冲区不会填充。