通过 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 清晰。
我正在尝试使用 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 清晰。