2009-07-10 23 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を参照)のみ stdoutとstderrのないをキャッチです。 変更この行:

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

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

し、それを別のものを与えては:)

+0

ああを。私のリターンステータスは1(0ではない)なので意味があります。私はうまくいきたいと思っていますが、冒頭に "/usr/bin/ffmpeg -i /var/videos/videos/video1.wmv 2>&1"と同じ結果が得られます。 Ubuntuにstderrをリダイレクトするためのいくつかの違いがあるかどうかを調べるためにいくつかの調査を行います。 –

+0

私は次のことが有効であることを確認できます。私はホビープロジェクトでこの正確なラインを一度使ってきました。 exec( 'ffmpeg -i'。エスケープシェルカー($ filepath)。 '2>&1'、$ output); – Werner

+0

Ahha!私はそれを考え出した。私の問題はescapeshellcmd()関数でした。 "2>&1"を "2 \> \&1"に変更していました。私はあなたのコードを試して、それは働いた。レッスン私は学んだことがあります:あなたはそれをすべて変更した後*コマンドを出力します。ありがとう。 –

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よりもはるかに高速です。

+1

うわー、どんな便利な機能!私はこれが存在するのかどうかは分かりませんでした。ありがとうございました! –

+1

毎回ffmpegを初期化するよりもはるかに高速です! – tweak2

0

あなたは出力状態と出力を取得するには...

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を使用して出力をしますprint_rすることができます:ええ...

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

print_r($output); 

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

niiiiiiiiiiiiceeeeeeeeeeeee – grizzly

関連する問題