如果我从终端执行 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>";