通过 PHP proc_open 调用 FFmpeg 总是导致输出被发送 STDERR 而不是 STDOUT

Calling FFmpeg through PHP proc_open always causes output to be sent STDERR instead of STDOUT

我正在尝试使用 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);

在另一个答案中找到了此行为的原因

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