Domanda

Sto avendo un problema utilizzando mencoder (SVN-r30531-4.2.1) attraverso un pitone (2.6.1) sottoprocesso. Sto cercando di unire due file mp4 che sono esattamente le stesse dimensioni, il codec, ecc Entrambi hanno senza audio. Il codice che sto usando per test è:

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"

E non lavoro, appende appena a tempo indeterminato. Tuttavia, quando si esegue lo stesso comando passaggio preciso Terminal (OS X 10.6.4) funziona. Il comando è:

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

E 'possibile scaricare i video da qui . Sono abbastanza sicuro che i video non sono il problema soltanto a causa del fatto che funziona dal terminale.

È stato utile?

Soluzione

Il problema qui è che i blocchi pMerge.stderr.readlines() per sempre fino a quando il processo è finito. Si legge tutti linee prima di continuare.

Dato che mencoder scrive molto al stdout, il buffer stdout viene riempito e mencoder è in attesa di fare il vuoto prima di poter continuare. Così il processo non finisce mai.

Ecco un modo di fare lo stesso, che non si bloccherà:

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

Un'altra opzione che permette di leggere l'uscita di linea per linea è per reindirizzare stderr su stdout, e quindi solo leggere stdout, (non utilizzare readlines () in quanto blocca fino a quando tutte le linee vengono lette):

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

Questo redirect STDERR stdout in modo che il buffer non si riempie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top