我有一个使用问题的mencoder(SVN-r30531-4.2.1)通过一个Python(2.6.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

您可以从这里下载视频。我确信影片不是万阿英,蒋达清,因为它从终端工作的事实。

有帮助吗?

解决方案

这里的问题是,pMerge.stderr.readlines()块永远直到过程结束。它读取所有的线,然后再继续。

由于mencoder的写了很多的标准输出,标准输出缓冲器被填充和MEncoder正在等待它清空,然后才能继续。所以该过程从未结束。

下面是一个方式做同样的,不会挂:

pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE)
stdout, stderr = pMerge.communicate()
print stdout
print stderr

另一个,允许你读取输出行由行选项是把stderr重定向到stdout,然后只读标准输出,(不使用readlines方法(),因为它的块,直到所有的行被读取):

pMerge = subprocess.Popen(mp4merge, stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT)
for line in pMerge.stdout:
    print line,

此重定向标准错误到stdout所以你的缓冲器不会继续进行。

scroll top