由于使用 PHP 进行 FFMPEG 转换,Jquery 上传文件出错
Error in Jquery upload file due to FFMPEG conversion using PHP
我正在使用 jQuery 上传文件插件,上传视频时,它们是使用 FFMPEG 转换的。对于小文件,一切正常,但当我尝试上传更大的文件时,响应中没有返回任何内容。我认为这可能是我的 max_execution_time
问题,所以我已经删除了限制但它仍然发生,但是当我看到文件夹时,文件被完全转换并输入数据库所以一切似乎都适用于大文件,除了它没有't echo
。我试图删除一个 FFMPEG 转换语句并将文件转换为一种大小,但对于大文件结果仍然相同。
我看到了这个结果
这是我的 PHP 代码
$default = ini_get('max_execution_time');
set_time_limit(0);
$fileName = $_FILES["myfile"]["name"];
$fileName = str_ireplace(' ', '_', $fileName);
$fn = $_FILES["myfile"]["name"];
$i = 1;
$actual_name = pathinfo($fileName,PATHINFO_FILENAME);
$original_name = $actual_name;
$extension = strtolower (pathinfo($fileName, PATHINFO_EXTENSION));
while(file_exists($output_dir.$fileName))
{
$actual_name = (string)$original_name.$i;
$fileName = $actual_name.".".$extension;
$filetoconvert = $actual_name.".mp4";
$filetoconvertSD=$actual_name."SD.mp4";
$i++;
}
//echo $fileName;
move_uploaded_file($_FILES["myfile"]["tmp_name"],$output_dir.$fileName);
$url = $output_dir1.$fileName;
$outputnameSD="";
$time="";
$del_url = $output_dir.$fileName;
$i = 1;
while(file_exists($output_dir.$filetoconvert))
{
$actual_name = (string)$original_name.$i;
$fileName = $actual_name.".mp4";
$filetoconvert = $actual_name.".mp4";
$filetoconvertSD=$actual_name."SD.mp4";
$i++;
}
$outputname = $output_dir1.$filetoconvert;
$outputnameSD=$output_dir1.$filetoconvertSD;
$videofile="/var/www/html/".$url;
$xyz = shell_exec("ffmpeg -i \"{$videofile}\" 2>&1"); //Get duration
$search='/Duration: (.*?),/';
preg_match($search, $xyz, $matches);
$tim=explode(".", $matches[1]);
$time=$tim[0];
$ret = exec(' ffmpeg -i /var/www/html/'.$url.' -acodec libfaac -b:a 128k -vcodec libx264 -preset fast -vprofile baseline -b:v 400k -maxrate 400k -bufsize 800k -crf 26 -flags +aic+mv4 /var/www/html/'.$outputnameSD, $out, $err);
$ret = exec(' ffmpeg -i /var/www/html/'.$url.' -acodec libfaac -b:a 196k -vcodec libx264 -preset fast -vprofile high -b:v 1000k -crf 20 -flags +aic+mv4 /var/www/html/'.$outputname, $out, $err);
unlink($del_url);
$url = $output_dir1.$fileName;
Database QUERY HERE
$ret[]= $fileName;
echo '<li>
'.$fileName.'
</li>';
set_time_limit($default);
我在做同样的事情时遇到了类似的问题,并且浪费了很多时间来处理各种超时。涉及的是 php 执行时间、服务器 post 超时、服务器响应超时和 javascript 计时器。
最后我发现最好把过程分成几部分:
- 接收上传并复制到临时目录。
- 将数据插入 sql 批次 table。
- Cron 查看批处理 table 以转换视频,复制到最终位置并更新最终 table。
- 监控批处理和returns正在处理的视频状态的脚本。
上传表单仅上传并执行步骤 1 和 2。在同一页面上,我有 js 可以 ping 我的监控脚本并显示相关信息。
这有一些帮助。首先,用户可以上传并忘记文件,而不必坐在那里等待每个文件被处理。其次,我可以在过程中的任何一步重新启动该过程,而无需用户返回到开头。最后,一切都变得更快了,因为我可以 运行 并行上传和转换,而且它们每个都有自己的流程,可以独立管理。
万一有人遇到同样的问题,我就是这样解决的。我将 ffmpeg 代码更改为
$ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 20 -preset fast /var/www/html/'.$outputname.' >/dev/null 2>/dev/null &', $out, $err);
$ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 26 -preset fast /var/www/html/'.$outputnameSD.' >/dev/null 2>/dev/null &', $out, $err);
最后一部分>/dev/null 2>/dev/null &
让它相信exec命令是在后台运行时执行的。这个解决方案的唯一缺点是,如果你想像我不得不那样做的话,你不能在转换后删除原始文件。
为了迎合这个解决方案,@hdezela 提供的答案是解决它的方法,即编写一个 cronjob
我正在使用 jQuery 上传文件插件,上传视频时,它们是使用 FFMPEG 转换的。对于小文件,一切正常,但当我尝试上传更大的文件时,响应中没有返回任何内容。我认为这可能是我的 max_execution_time
问题,所以我已经删除了限制但它仍然发生,但是当我看到文件夹时,文件被完全转换并输入数据库所以一切似乎都适用于大文件,除了它没有't echo
。我试图删除一个 FFMPEG 转换语句并将文件转换为一种大小,但对于大文件结果仍然相同。
我看到了这个结果
这是我的 PHP 代码
$default = ini_get('max_execution_time');
set_time_limit(0);
$fileName = $_FILES["myfile"]["name"];
$fileName = str_ireplace(' ', '_', $fileName);
$fn = $_FILES["myfile"]["name"];
$i = 1;
$actual_name = pathinfo($fileName,PATHINFO_FILENAME);
$original_name = $actual_name;
$extension = strtolower (pathinfo($fileName, PATHINFO_EXTENSION));
while(file_exists($output_dir.$fileName))
{
$actual_name = (string)$original_name.$i;
$fileName = $actual_name.".".$extension;
$filetoconvert = $actual_name.".mp4";
$filetoconvertSD=$actual_name."SD.mp4";
$i++;
}
//echo $fileName;
move_uploaded_file($_FILES["myfile"]["tmp_name"],$output_dir.$fileName);
$url = $output_dir1.$fileName;
$outputnameSD="";
$time="";
$del_url = $output_dir.$fileName;
$i = 1;
while(file_exists($output_dir.$filetoconvert))
{
$actual_name = (string)$original_name.$i;
$fileName = $actual_name.".mp4";
$filetoconvert = $actual_name.".mp4";
$filetoconvertSD=$actual_name."SD.mp4";
$i++;
}
$outputname = $output_dir1.$filetoconvert;
$outputnameSD=$output_dir1.$filetoconvertSD;
$videofile="/var/www/html/".$url;
$xyz = shell_exec("ffmpeg -i \"{$videofile}\" 2>&1"); //Get duration
$search='/Duration: (.*?),/';
preg_match($search, $xyz, $matches);
$tim=explode(".", $matches[1]);
$time=$tim[0];
$ret = exec(' ffmpeg -i /var/www/html/'.$url.' -acodec libfaac -b:a 128k -vcodec libx264 -preset fast -vprofile baseline -b:v 400k -maxrate 400k -bufsize 800k -crf 26 -flags +aic+mv4 /var/www/html/'.$outputnameSD, $out, $err);
$ret = exec(' ffmpeg -i /var/www/html/'.$url.' -acodec libfaac -b:a 196k -vcodec libx264 -preset fast -vprofile high -b:v 1000k -crf 20 -flags +aic+mv4 /var/www/html/'.$outputname, $out, $err);
unlink($del_url);
$url = $output_dir1.$fileName;
Database QUERY HERE
$ret[]= $fileName;
echo '<li>
'.$fileName.'
</li>';
set_time_limit($default);
我在做同样的事情时遇到了类似的问题,并且浪费了很多时间来处理各种超时。涉及的是 php 执行时间、服务器 post 超时、服务器响应超时和 javascript 计时器。
最后我发现最好把过程分成几部分:
- 接收上传并复制到临时目录。
- 将数据插入 sql 批次 table。
- Cron 查看批处理 table 以转换视频,复制到最终位置并更新最终 table。
- 监控批处理和returns正在处理的视频状态的脚本。
上传表单仅上传并执行步骤 1 和 2。在同一页面上,我有 js 可以 ping 我的监控脚本并显示相关信息。
这有一些帮助。首先,用户可以上传并忘记文件,而不必坐在那里等待每个文件被处理。其次,我可以在过程中的任何一步重新启动该过程,而无需用户返回到开头。最后,一切都变得更快了,因为我可以 运行 并行上传和转换,而且它们每个都有自己的流程,可以独立管理。
万一有人遇到同样的问题,我就是这样解决的。我将 ffmpeg 代码更改为
$ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 20 -preset fast /var/www/html/'.$outputname.' >/dev/null 2>/dev/null &', $out, $err);
$ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 26 -preset fast /var/www/html/'.$outputnameSD.' >/dev/null 2>/dev/null &', $out, $err);
最后一部分>/dev/null 2>/dev/null &
让它相信exec命令是在后台运行时执行的。这个解决方案的唯一缺点是,如果你想像我不得不那样做的话,你不能在转换后删除原始文件。
为了迎合这个解决方案,@hdezela 提供的答案是解决它的方法,即编写一个 cronjob