捕获FFMPEG输出

And*_*ley 10 php ffmpeg exec

我需要阅读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/>";
?>
Run Code Online (Sandbox Code Playgroud)

这是我的输出:

<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/>
Run Code Online (Sandbox Code Playgroud)

我不明白. safe_mode已关闭.什么都没有disable_functions.该目录所拥有www-data(我的Ubuntu系统上apache用户).我得到一个有效的状态,exec()system()从命令行运行相同的命令给我吨输出.我觉得我必须遗漏一些明显的东西,但我不知道它是什么.

heg*_*mon 28

问题是你只捕获stdout而不是stderr(参见Standard Streams).改变这一行:

$command = "/usr/bin/ffmpeg -i " . $src;
Run Code Online (Sandbox Code Playgroud)

$command = "/usr/bin/ffmpeg -i " . $src . " 2>&1";
Run Code Online (Sandbox Code Playgroud)

并再试一次:)


twe*_*ak2 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);
Run Code Online (Sandbox Code Playgroud)

并且您在php阵列中拥有所有视频信息!出于某种原因,这比ffmpeg -i快得多.