0

Python (2.6.1) サブプロセスを介して mencoder (SVN-r30531-4.2.1) を使用すると問題が発生します。サイズ、コーデックなどがまったく同じ 2 つの 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

動画はこちらからダウンロードできます。ターミナルから動作するため、ビデオは問題ではないと確信しています。

4

1 に答える 1

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

出力を 1 行ずつ読み取ることができる別のオプションは、stderr を stdout にリダイレクトしてから、stdout のみを読み取ることです (すべての行が読み取られるまでブロックされるため、readlines() は使用しないでください)。

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

これにより、stderr が stdout にリダイレクトされるため、バッファがいっぱいになりません。

于 2010-08-04T17:10:07.127 に答える