11

昨日の私の質問に対する解決策を試すためにも、ffmpeg からの出力を読む必要があります。これは私の問題とは別の問題なので、新しい質問をしました。

ffmpeg -iPHPでコマンドから出力を取得するにはどうすればよいですか?

これは私が試してきたことです:

<?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。ディレクトリは(私のUbuntuシステムのApacheユーザー)が所有しています。www-dataから有効なステータスを取得し、コマンドラインから同じコマンドを実行すると、大量の出力が得られますexec()system()明らかな何かが欠けているように感じますが、それが何であるかわかりません。

4

4 に答える 4

29

問題は、 stderrではなくstdoutのみをキャッチすることです( Standard Streamsを参照)。この行を変更します。

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

の中へ

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

もう一度試してみてください:)

于 2009-07-10T17:07:23.250 に答える
7

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

于 2012-11-19T22:56:32.867 に答える
3

出力ステータスと出力を取得するには:

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

print_r($output);

if($returnStatus === 0){
   // success
}
else {
   //fail
}
于 2017-05-02T06:50:59.750 に答える
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>";
于 2016-08-08T15:00:35.683 に答える