Php 从ffmpeg返回成功或失败

Php 从ffmpeg返回成功或失败,php,ffmpeg,Php,Ffmpeg,在通过if/then语句满足某些条件后,我在PHP中执行了一些代码,如下所示: if(in_array($ext,$video)&&($ext!=="mp4")){ exec("ffmpeg -i ".$fileName.".".$ext." -s 640x360 ".$fileName.".mp4"); /* if(successful){ unlink($fileName.$ext); $status="Video en

在通过if/then语句满足某些条件后,我在PHP中执行了一些代码,如下所示:

if(in_array($ext,$video)&&($ext!=="mp4")){
    exec("ffmpeg -i ".$fileName.".".$ext." -s 640x360 ".$fileName.".mp4");
    /*
    if(successful){
        unlink($fileName.$ext);
        $status="Video entry approved. File converted.";
    }
    */
}
正如您所看到的,我遇到的问题是,如果(成功),应该用什么来代替
。这段代码的要点是对照一组已知的扩展名检查文件扩展名,这些扩展名是视频格式的,而不是mp4格式的。如果通过此检查,ffmpeg应运行并转换为mp4

这里有几个问题。首先,我如何返回一个状态来告诉我它是转换、成功还是失败?其次,如何异步运行?也就是说,如果我想转换多个文件,我能这样做吗?我是否能够限制ffmpeg,以确保它不会占用服务器的所有处理能力,并在不经意间使站点陷入瘫痪

或者有没有比这更好的方法来转换文件?我敢肯定我的方法一定很粗糙


编辑:除此之外,如何在后台运行ffmpeg,以便用户可以关闭页面和/或启动同一页面的另一个实例进行多次同时转换?是否可以包含每次转换的实时进度状态?

我喜欢您使用exec。您是否注意到该命令的php.net条目?它的签名如下:

string exec ( string $command [, array &$output [, int &$return_var ]] )
您使用的是$command参数,而不是$output或$return\u var。因此,这里基本上有两种选择:
1-将$output参数添加到exec命令并打印。一旦你知道了回报,你就可以利用这些信息来帮助你进行逻辑分析。(如果在控制台上运行命令,$output参数将填充任何打印到控制台的输出。)注意,您可能需要添加选项
-loglevel“verbose”
,以查看有用的输出。

exec("ffmpeg -i -loglevel 'verbose' ".$fileName.".".$ext." -s 640x360 ".$fileName.".mp4", $my_output_var);

print_r($my_output_var);<br>

当我不忙的时候,我会尝试一下,但与此同时,我想你对我问题底部的编辑一无所知?在命令的最后添加一个空格和一个符号。这将告诉Linux您希望它在后台运行:exec(“ffmpeg-i”。$fileName.”.“$ext.”-s 640x360.“$fileName.”.mp4&;”;顺便说一句,您可能需要修改流程以获得更可靠的用户体验:首先,我将此应用程序分为三个脚本—一个接受用户请求,一个报告请求状态,另一个执行处理工作。接受用户请求的脚本将请求数据写入数据库。报告请求的脚本将从数据库中读取。执行该工作的脚本将执行该工作,然后更新数据库中的一行。它将在crontab上运行。当前我的代码是
exec(“/ffmpeg/ffmpeg-loglevel'verbose'-i'。$fileNameIn.”.$ext.“'.$fileNameOut.”.flac'/dev/null 2>/var/www/resources/ffmpegAudio.log&“,$ffmpegOutput)输出到日志文件,但我在其中看不到进度信息。此外,这是一个管理功能,而不是用户功能,如果这有区别的话。如果用户体验让事情对我来说过于复杂,那么它就不是优先考虑的。
exec("ffmpeg -i ".$fileName.".".$ext." -s 640x360 ".$fileName.".mp4", $my_output_var, $var);

if($var == 0){
    // do something
}