使用php中的shell_exec作为windows中的后台进程运行ffmpeg命令

时间:2014-07-21 19:17:11

标签: php windows ffmpeg wamp

我尝试使用以下内容将视频从.mp4转换为.flv

shell_exec("ffmpeg -i input.mp4 output.flv 1>output.txt 2>&1");

此外,我正在output.txt文件中输出整个流程的输出,以便在javascript中创建进度条时使用它(这不是问题)。

问题是: 如果视频(input.mp4)大小> 50Mb,那么完成shell_exec(> 30secs)需要很长时间。这会不必要地挂起UI。

所以我想知道的是:

  • 有没有办法让shell_exec与其他脚本一起工作?

  • 我只需通过ffmpeg.exe脚本启动php,然后php脚本即可终止。

  • 启动流程后,javascript将启动其魔力(在客户端)。

所以我需要执行shell_exec异步。与其余的脚本。并且一旦启动该过程,脚本应该通过echo来通知客户端。它不应该等待ffmpeg.exe完成其工作。有可能吗?

我在SO上看过几个类似的问题,其中很多都描述了同样的问题

例如:

Run a ffmpeg process in the background

Run PHP Task Asynchronously

ffmpeg Progress Bar - Encoding Percentage in PHP

Can ffmpeg show a progress bar?

BUT

他们都在使用linux操作系统或使用curl。我使用windows 8(没有卷曲的wamp和除ffmpeg.exe之外的任何其他插件)。

那有可能吗?可以请专家再帮我一次吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

<?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";
?>

“-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')

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

答案 1 :(得分:0)

是的,您可以在Windows中使用以下命令在后台运行FFmpeg,而无需重新加载整个页面。

 pclose(popen("start /B C:/xampp/htdocs/video/bin/ffmpeg  -i input.mp4 output.flv , r"));

这是ffmpeg在我的电脑中的位置,您可以使用ffmpeg的位置。