通过PHP proc_open调用FFmpeg总是导致输出被发送STDERR而不是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);

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

FFmpeg有意将所有内容输出到stderr,以保持stdout畅通。

最新更新