FFMpeg在命令行中工作,但不在PHP脚本中工作

FFMpeg在命令行中工作,但不在PHP脚本中工作,php,video,ffmpeg,flv,server,Php,Video,Ffmpeg,Flv,Server,我正在使用FFMpeg转换视频,它在命令行中运行良好。我正在使用以下命令: ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv 但是,当我使用PHP脚本运行该命令时,输出视频没有编码 exec("ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv",$output, $returnva

我正在使用FFMpeg转换视频,它在命令行中运行良好。我正在使用以下命令:

ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv
但是,当我使用PHP脚本运行该命令时,输出视频没有编码

exec("ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv",$output, $returnvalue);

$returnvalue = 127;
FFMPEG安装路径:

[root@localhost ~]# which ffmpeg

/root/bin/ffmpeg
我的脚本路径:

www.domainname.com/core/foldername/ffmpeg.php

请尽快为我提供相同的解决方案


谢谢。

从PHP脚本运行
ffmpeg
的自然方式如下:

<?php
    echo "Starting ffmpeg...\n\n";
    echo shell_exec("ffmpeg -i input.avi output.avi &");
    echo "Done.\n";
?>
表示“>/dev/null”的部分将把
ffmpeg
实例的标准输出(stdout)重定向到
/dev/null
(有效地忽略输出),“2>/dev/null”将标准错误(stderr)重定向到
/dev/null
(有效地忽略任何错误日志消息)。这两者可以组合成一个较短的表示形式:“>/dev/null 2>&1”。如果你愿意,你可以​阅读有关I/O重定向的更多信息

这里应该提到一个重要的注意事项。
ffmpeg
命令行工具使用
stderr
输出错误日志消息,
stdout
保留用于管道的可能使用(将从
ffmpeg
生成的输出媒体流重定向到其他一些命令行工具)。也就是说,如果您在后台运行
ffmpeg
,您很可能希望将
stderr
重定向到日志文件,以便以后能够检查它

还要注意的是标准输入(stdin)。命令行
ffmpeg
工具被设计为一个交互式实用程序,它接受用户的输入(通常来自键盘),并报告用户当前屏幕/终端上的错误日志。当我们在后台运行
ffmpeg
时,我们想告诉
ffmpeg
不应该接受(也不应该等待)来自
stdin
的输入。我们可以告诉
ffmpeg
,在后台再次使用I/O重定向**“ffmpeg命令行工具与此类似:

<?php
    echo "Starting ffmpeg...\n\n";
    echo shell_exec("ffmpeg -y -i input.avi output.avi </dev/null >/dev/null 2>/var/log/ffmpeg.log &");
    echo "Done.\n";
?>
当然,您需要注意在后台运行这样的任务​ 促进这一点

注意:​ 是自2007年以来未开发的扩展(需要“ffmpeg-0.4.9_pre1或更高版本”),这意味着您只能使用非常旧的ffmpeg版本,无法将其更新为最新版本。由于在
ffmpeg的
代码中进行了大量更改/改进,每天都会使
ffmpeg php
与最新的
ffmpeg
不兼容


阅读以了解更多信息。

这发生在我身上,我在另一个论坛上发现了这一点;PHP内部的诀窍是给出FFMPEG的绝对路径。试着像这样运行它

exec("/root/bin/ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv",$output, $returnvalue);
php与直接在命令行中输入的用户不同,我猜它没有相同的快捷方式列表或其他什么

不知道确切的原因,但它为我工作


祝你好运。

我在另一篇文章中介绍了帮助大多数人的解决方案

本质上,用户需要访问公共目录

<?php 
   exec('whoami'); // Gives you the running user; often it's www-data
?>

这是正确的答案!谢谢分享!
exec("/root/bin/ffmpeg -i input.avi -ab 56 -ar 44100 -b 200 -r 15 -s 320x240 -f flv output.flv",$output, $returnvalue);
<?php 
   exec('whoami'); // Gives you the running user; often it's www-data
?>
sudo chown -R www-data:root /var/www