2009-07-10 174 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 
}