Pregunta

Estoy teniendo un problema usando mencoder (SVN-r30531-4.2.1) a través de una (2.6.1) subproceso pitón. Estoy tratando de unir dos archivos mp4 que son exactamente del mismo tamaño, codec, etc Ambos tienen ningún audio. El código que estoy utilizando para la prueba es:

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"

Y no funciona, simplemente se cuelga indefinidamente. Sin embargo, cuando ejecuto el mismo comando exacto a través del terminal (OS X 10.6.4) funciona. El comando es:

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

Se puede descargar los videos de aquí . Estoy bastante seguro de los videos no son los probelm debido al hecho de que funciona de la terminal.

¿Fue útil?

Solución

El problema aquí es que los bloques pMerge.stderr.readlines() siempre hasta que el proceso ha terminado. Se lee todos líneas antes de continuar.

Desde mencoder escribe mucho a la salida estándar, la memoria intermedia de salida estándar está llena y mencoder está esperando a que se vacíe antes de que pueda continuar. Por lo que el proceso no tiene fin.

Esta es una forma de hacer lo mismo, eso no va a pasar:

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

Otra opción que le permite leer la salida de línea a línea es redirigir stderr a stdout, y después lee solamente la salida estándar, (no usar readlines () ya que bloquea hasta que todas las líneas se leen):

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

Esto redirige stderr a stdout para que su memoria intermedia no se llenará.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top