【问题标题】:Calling FFmpeg through PHP proc_open always causes output to be sent STDERR instead of STDOUT通过 PHP proc_open 调用 FFmpeg 总是会导致输出被发送到 STDERR 而不是 STDOUT
【发布时间】:2021-09-19 14:27:11
【问题描述】:

我正在尝试使用 proc_open 调用 FFmpeg,然后我尝试读取 STDOUT 的输出,但即使没有错误,输出也只会发送到 STDERR。

我的代码似乎是正确的,因为当我使用 proc_open 调用“ls -la”时,它会将输出发送到 STDOUT。但我对使用流完全陌生,所以我可能遗漏了一些东西。

我想知道是否有人知道发生了什么或者我做错了什么?

这里有三个用于测试目的的命令:

$cmd = ['ls', '-la']; // sends to STDOUT
$cmd = ['ffmpeg', '-h']; // sends part of output to STDERR and some of it to STDOUT
$cmd = ['ffmpeg', '-i','in.mp4','-c:v','copy','out.mp4']; // sends all to STDERR

这是我的代码:

// $cmd = ['ls', '-la'];
$cmd = ['ffmpeg', '-h'];

$descriptor_spec = [
    0 => ['pipe', 'r'],
    1 => ['pipe', 'w'],
    2 => ['pipe', 'w'],
];

$proc = proc_open($cmd, $descriptor_spec, $pipes, dirname(__FILE__), null);

$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
echo PHP_EOL . "STDOUT: {$stdout}" . PHP_EOL; 

$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
echo PHP_EOL . "STDERR: {$stderr}" . PHP_EOL; 

$exitCode = proc_close($proc);
var_dump($exitCode);

【问题讨论】:

    标签: php ffmpeg stdout stderr proc-open


    【解决方案1】:

    在另一个答案https://stackoverflow.com/a/35215447/5618007 中找到了这种行为的原因。

    FFmpeg 故意将所有内容输出到 stderr 以保持 stdout 清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2010-11-26
      相关资源
      最近更新 更多