php - 由于使用 PHP 进行 FFMPEG 转换,Jquery 上传文件出错

标签 php jquery file-upload ffmpeg

我正在使用 jQuery 上传文件插件,当上传视频时,它们会使用 FFMPEG 进行转换。对于短文件,一切正常,但是当我尝试上传更大的文件时,响应中没有返回任何内容。我以为这可以让我max_execution_time问题所以我已经删除了限制,但它仍然会发生,但是当我看到文件夹时,文件被完全转换并输入到数据库中,所以一切似乎都适用于大文件,除了它不 echo .我尝试删除一个 FFMPEG 转换语句并将文件转换为一种大小,但对于大文件,结果仍然相同。

我看到了这个结果 enter image description here

这是我的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 执行时间、服务器发布超时、服务器响应超时和 javascript 计时器。

最后我发现最好把这个过程分成几个部分:

  • 接收上传并复制到 tempdir。
  • 将数据插入到 sql 批处理表中。
  • Cron 查看批处理表以转换视频、复制到最终位置并更新最终表。
  • 监控批处理并返回正在处理的视频状态的脚本。

  • 上传表单只是上传并执行步骤 1 和 2。在同一页面上,我有 js 可以 ping 我的监控脚本并显示相关信息。

    这有一些帮助。首先,用户可以上传并忘记文件,而不必坐在那里等待每个文件被处理。其次,我可以在任何步骤重新启动该过程,而无需用户回到开头。最后,一切都变得更快了,因为我可以并行运行上传和转换,并且它们每个都有自己的可以独立管理的进程。

    关于php - 由于使用 PHP 进行 FFMPEG 转换,Jquery 上传文件出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28755568/

    相关文章:

    php - 使用 MySQLi 和 PHP 将行分配给变量

    php - Magento 2 变得非常慢(开发者模式)

    Php 循环和写入 MySql Db 的问题

    javascript - 在页面加载时动画对象,但仍然能够随着悬停而改变

    java - 使用 Commons FileUpload 处理多部分/表单数据是否不被弃用?

    javascript - 图片上传——未正确访问 PHP 文件

    php - 当服务器发送的事件运行时,带有 session_start() 的页面不会加载

    jquery - 位置 : Fixed in Sidebar - How to stop it before footer?

    javascript - 如何在Google Maps中实现Yelp Map Marker/Tooltip Effect?

    php - 如何使用 PHP 创建 CSV 文件(并上传)