FFmpeg 在终端上运行,而不是通过 PHP exec 运行

FFmpeg 在终端上运行,而不是通过 PHP exec 运行

如果我从终端执行 Ffmpeg 命令,我会得到想要的结果:

ffmpeg  -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv

终端的输出:

...
video:3404kB audio:1038kB global headers:0kB muxing overhead 2.966904%

并且video.flv正确创建。

然后,如果通过 PHP exec 调用:

exec("ffmpeg  -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv", $o, $v);
var_dump($o);
var_dump($v);

输出如下:

array(0) { } int(1)

并且没有创建任何文件。有什么想法可以解决这个问题吗?

我可以exec('whoami')毫无问题地做到这一点,并且我也使用了 FFmpeg 完整路径:/usr/local/bin/ffmpeg

答案1

问题是你使用的,exec而不是shell_exec 要点是 exec 的环境不知道任何 FFmpeg 可执行文件,但shell_exec* 知道,因为它使用 bash/shell 的环境。

解决方案是使用 FFmpeg 可执行文件的完整路径,例如。/usr/bin/ffmpeg

答案2

添加2>&1到命令末尾即可起作用:

exec("ffmpeg  -i src.mp4 -ar 22050 -ab 32 -f flv -s 320x240 video.flv 2>&1", $o, $v);

答案3

除了使用 的完整路径外ffmpeg/full/path/to/src.mp4还可以使用/full/path/to/video.flv

答案4

在我的情况下,由于使用 root 用户创建文件夹,php 用户没有写入权限。授予其写入权限有效。由于某种原因,我没有得到任何输出,shell_exec但以下内容显示了所有内容并ffmpeg为您找到了二进制文件。

<?php
$dir = __DIR__;

//Find ffmpeg binaries
$ffmpeg =trim(shell_exec("which ffmpeg"));

//resize input.png to 120px width
$command = "$ffmpeg -i '$dir/input.png' -vf scale=120:-1 '$dir/output.png'";
echo $command . "<br>";

//run command and output streams to vars
exec("$command 2>&1", $o, $v);

echo "<pre>";
print_r($o);
print_r($v);
echo "</pre>";

相关内容