2010-08-04 63 views
0

我有一個問題,通過python(2.6.1)子進程使用mencoder(SVN-r30531-4.2.1)。我試圖加入兩個完全相同大小的mp4文件,編解碼器等。兩者都沒有音頻。我用來測試的代碼是:Python子進程+ mencoder不工作,相同的命令在終端工作

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。我非常有信心這些視頻不是問題,因爲它在終端上運行。

回答

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 

另一種選擇,讓您閱讀輸出線,由線是標準錯誤重定向到標準輸出,然後只讀標準輸出,(不要使用readlines方法(),因爲它阻止,直到所有行被讀取):

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

這stderr重定向到標準輸出,所以你的緩衝區將不會繼續進行。

+0

謝謝!這是導致問題的原因。 – betamax 2010-08-05 11:26:25

相關問題