我尝试使用以下内容将视频从.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
ffmpeg Progress Bar - Encoding Percentage in PHP
Can ffmpeg show a progress bar?
等
BUT
他们都在使用linux
操作系统或使用curl
。我使用windows 8
(没有卷曲的wamp和除ffmpeg.exe
之外的任何其他插件)。
那有可能吗?可以请专家再帮我一次吗?
提前致谢。
答案 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的位置。