2009-07-10 168 views
8

我需要读取ffmpeg的输出,才能尝试解决方案my question from yesterday。这是一个与我的问题不同的问题,所以我提出了一个新问题。捕获FFMPEG输出

如何在PHP中使用ffmpeg -i命令获得输出?

这是我一直想:

<?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/>"; 
?> 

这是我的输出:

<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/> 

我不明白这一点。 safe_mode已关闭。 disable_functions中没有任何内容。该目录是拥有www-data(我Ubuntu系统上的apache用户)。我从exec()system()得到一个有效的状态,并从命令行运行相同的命令给我提供了大量的输出。我觉得我必须错过一些明显的东西,但我不知道它是什么。

回答

24

的问题是,你只捕获标准输出而不是标准错误(见Standard Streams)。 更改此行:

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

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

,并给它的另一个尝试:)

+0

唉唉...是啊。这是有道理的,因为我的返回状态是1(不是0)。我希望这能奏效,但我仍然得到相同的结果,只是:“/usr/bin/ffmpeg -i /var/videos/video1.wmv 2>&1”开头。我会做一些研究,看看Ubuntu是否有重定向stderr的一些差异。 – 2009-07-10 18:16:25

+0

我可以确认下面的工作。我曾经在一个爱好项目中使用过这个确切的线。 exec('ffmpeg -i'。escapeshellarg($ filepath)。'2>&1',$ output); – Werner 2009-07-10 18:51:04

+0

艾哈!我想到了。我的问题是escapeshellcmd()函数。它将“2>&1”更改为“2 \> \&1”。我试过你的代码,它工作。我学到的课程:在*完成对它的所有修改= p后输出命令*。谢谢。 – 2009-07-10 19:07:56

6

使用ffprobe相反,它是要快得多,并且支持JSON输出。

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

而你有你所有的视频信息在一个php数组!由于某种原因,这比ffmpeg -i快得多。

0

您可以使用exec和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

要获得输出状态和输出:

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

print_r($output); 

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