ffmpeg php命令,FFMpeg在命令行中工作,但在PHP脚本中没有

这篇博客讨论了如何在PHP脚本中正确地后台运行ffmpeg命令,避免脚本挂起。通过重定向输出到/dev/null,可以防止ffmpeg阻塞PHP执行,并通过将错误日志重定向到文件来监控ffmpeg的运行状态。文章还提到了使用PHP库如PHP-FFMpeg进行ffmpeg操作的替代方法,并警告了使用旧版ffmpeg扩展的风险。
摘要由CSDN通过智能技术生成

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

echo "Starting ffmpeg...\n\n";

echo shell_exec("ffmpeg -i input.avi output.avi &");

echo "Done.\n";

?>

这里有几个问题需要指出.第一个是,虽然我们指定我们希望ffmpeg在后台执行(使用&符号运算符“&”),PHP脚本将不会继续执行,直到ffmpeg完成执行.这是因为在PHP的exec()函数的一个注释中提到的事实是:

If a program is started with this function, in order for it to

continue running in the background, the output of the program must be

redirected to a file or another output stream. Failing to do so will

cause PHP to hang until the execution of the program ends.

不要对显示shell_exec()调用而不是exec()的示例感到困惑.所有PHP的程序执行函数都共享相似的代码库和限制.

因此,要解决此问题,我们需要执行以下操作:

echo "Starting ffmpeg...\n\n";

echo shell_exec("ffmpeg -i input.avi output.avi >/dev/null 2>/dev/null &");

echo "Done.\n";

?>

“> / dev / null”部分将ffmpeg实例的标准OUTPUT(stdout)重定向到/ dev / null(实际上忽略输出),“2> / dev / null”将重定向标准ERROR( stderr)到/ dev / null(有效地忽略任何错误日志消息).这两个可以组合成更短的表示:“> / dev / null 2>& 1”.如果您愿意,可以阅读有关I / O重定向的更多信息.

这里应该提到一个重要的注意事项. ffmpeg命令行工具使用stderr输出错误日志消息,并保留stdout以便可能使用管道(将ffmpeg生成的输出媒体流重定向到其他命令行工具).话虽这么说,如果你在后台运行你的ffmpeg,你很可能想要将stderr重定向到一个日志文件,以便以后检查它.

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

echo "Starting ffmpeg...\n\n";

echo shell_exec("ffmpeg -y -i input.avi output.avi /dev/null 2>/var/log/ffmpeg.log &");

echo "Done.\n";

?>

“-y”选项用于自动覆盖输出文件(output.avi),而不要求是/否确认.如果您需要相反的方案,如果输出文件已存在,则自动取消整个过程,然后使用“-n”选项.

包装库

一些PHP库允许将ffmpeg调用包装到PHP对象中,如果您不喜欢使用命令行,可以使用一个很好的语法.其中之一是积极维护PHP-FFMpeg.除了安装PHP组件之外,它只需要您下载最近的ffmpeg和ffprobe构建.然后你可以像这样运行PHP代码:

$ffmpeg = FFMpeg\FFMpeg::create();

$video = $ffmpeg->open('video.mpg');

$video

->filters()

->resize(new FFMpeg\Coordinate\Dimension(320, 240))

->synchronize();

$video

->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')

当然,你需要在后台运行这样的任务.像GearmanClient这样的图书馆为此提供了便利.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值