Frage

ich habe ein Problem mit mencoder (SVN-r30531-4.2.1) über eine Python (2.6.1) subprocess. Ich versuche, zwei MP4-Dateien zu verbinden, die genau die gleiche Größe haben, Codec usw. Beide haben keinen Ton. Der Code, den ich zu Test verwende ist:

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"

Und es funktioniert nicht, es hängt nur auf unbestimmte Zeit. Allerdings, wenn ich genau das gleiche Kommando über Terminal laufen (OS X 10.6.4) es funktioniert. Der Befehl lautet:

mencoder in1.mp4 in2.mp4 -ovc copy -oac copy -of lavf -o out.mp4

Sie können die Videos herunterladen von hier. Ich bin sehr zuversichtlich, dass die Videos aufgrund der Tatsache, nicht die probelm sind, dass es vom Terminal funktioniert.

War es hilfreich?

Lösung

Das Problem hier ist, dass pMerge.stderr.readlines() Blöcke für immer, bis der Prozess beendet ist. Es liest alle Linien, bevor Sie fortfahren.

Da mencoder viel zum stdout schreibt, wird der stdout-Puffer gefüllt und mencoder wartet auf ihn zu leeren, bevor es weitergehen kann. So dass der Prozess niemals endet.

Hier ist ein Weg, um das gleiche zu tun, das wird nicht hängen:

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

Eine weitere Option, die Ihnen die Ausgabe Zeile-für-Zeile zu lesen erlaubt ist stderr nach stdout zu umleiten, und dann nur stdout lesen, (verwendet Leseleitungen nicht (), da es blockiert, bis alle Zeilen gelesen werden):

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

Diese Umleitungen stderr nach stdout so Ihre Puffer nicht füllen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top