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里面什么都没有 该目录www-data我的 Ubuntu 系统上的 apache 用户)所有。我从命令行返回有效状态,exec()system()从命令行运行相同的命令给我大量的输出。我觉得我一定错过了一些明显的东西,但我不知道它是什么。

4

4 回答 4

29

问题是您只捕获标准输出而不捕获标准错误(参见标准流)。更改此行:

$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 回答