2009-07-10 11 views
8

Necesito leer la salida de ffmpeg para incluso probar la solución a my question from yesterday. Este es un problema aparte de mi problema allí, así que formulé una nueva pregunta.Capturar salida FFMPEG

¿Cómo diablos obtengo la salida de un comando ffmpeg -i en PHP?

Esto es lo que he estado intentando:

<?PHP 
    error_reporting(E_ALL); 
    $src = "/var/videos/video1.wmv"; 
    $command = "/usr/bin/ffmpeg -i " . $src; 
    echo "<B>",$command,"</B><br/>"; 
    $command = escapeshellcmd($command); 

    echo "backtick:<br/><pre>"; 
    `$command`; 

    echo "</pre><br/>system:<br/><pre>"; 
    echo system($command); 

    echo "</pre><br/>shell_exec:<br/><pre>"; 
    echo shell_exec($command); 

    echo "</pre><br/>passthru:<br/><pre>"; 
    passthru($command); 

    echo "</pre><br/>exec:<br/><pre>"; 
    $output = array(); 
    exec($command,$output,$status); 
    foreach($output AS $o) 
    { 
      echo $o , "<br/>"; 
    } 
    echo "</pre><br/>popen:<br/><pre>"; 
    $handle = popen($command,'r'); 
    echo fread($handle,1048576); 
    pclose($handle); 
    echo "</pre><br/>"; 
?> 

Este es mi resultado:

<B>/usr/bin/ffmpeg -i /var/videos/video1.wmv</B><br/> 
backtick:<br/> 
    <pre></pre><br/> 
system:<br/> 
    <pre></pre><br/> 
shell_exec:<br/> 
    <pre></pre><br/> 
passthru:<br/> 
    <pre></pre><br/> 
exec:<br/> 
    <pre></pre><br/> 
popen:<br/> 
    <pre></pre><br/> 

yo no lo entiendo. safe_mode está desactivado. No hay nada en disable_functions. El directorio es propiedad por www-data (el usuario apache en mi sistema Ubuntu). Obtengo un estado válido de exec() y system() y ejecutando el mismo comando desde la línea de comandos me da toneladas de salida. Siento que debo estar perdiendo algo obvio, pero no tengo idea de qué se trata.

Respuesta

24

El problema es que solo con captura stdout y stderr no (ver Standard Streams). Cambie esta línea:

$command = "/usr/bin/ffmpeg -i " . $src; 

en

$command = "/usr/bin/ffmpeg -i " . $src . " 2>&1"; 

y darle otra oportunidad :)

+0

Ahhh ... sí. Eso tiene sentido porque mi estado de devolución es 1 (no 0). Ojalá hubiera funcionado, pero aún obtengo el mismo resultado, solo con: "/usr/bin/ffmpeg -i /var/videos/video1.wmv 2> & 1" al principio. Haré un poco de investigación para ver si Ubuntu tiene algunas diferencias para redirigir stderr. –

+0

Puedo confirmar que lo siguiente debería funcionar. He usado esta línea exacta en un proyecto de hobby una vez. exec ('ffmpeg -i'. Escapeshellarg ($ filepath). '2> & 1', $ salida); – Werner

+0

¡Ahha! Me lo imaginé. Mi problema era la función escapeshellcmd(). Estaba cambiando "2> & 1" a "2 \> \ & 1". Probé tu código y funcionó. Lección que aprendí: envíe el comando * después * de que haya realizado todas las modificaciones en él = p. Gracias. –

6

Uso ffprobe en cambio, es mucho más rápido y compatible con la salida JSON.

$output = shell_exec('ffprobe -v quiet -print_format json -show_format -show_streams "path/to/yourfile.ext"'); 
$parsed = json_decode($output, true); 

¡Y tiene toda su información de video en una matriz php! Esto es mucho más rápido que ffmpeg -i por alguna razón.

+1

Guau, ¡qué función más útil! No tenía idea de que esto existía. ¡Gracias! –

+1

¡También es mucho más rápido que inicializar ffmpeg todo el tiempo! – tweak2

0

Puede usar Exec y la salida de print_r ...

exec("ffmpeg -i input.avi -vcodec h264 -acodec aac -strict -2 output.mp4 2>&1",$output); 

echo "<pre>"; 
print_r($output); 
echo "</pre>"; 
2

para obtener el estado de salida y la salida:

exec("ffmpeg -i input.avi output.mp4 2>&1", $output, $returnStatus); 

print_r($output); 

if($returnStatus === 0){ 
    // success 
} 
else { 
    //fail 
} 
+0

niiiiiiiiiiiiceeeeeeeeeeeee – grizzly

Cuestiones relacionadas