FFMPEG MP4转换耗时太长,不实用

FFMPEG MP4转换耗时太长,不实用,ffmpeg,mp4,Ffmpeg,Mp4,首先,我想说,我不是说FFMPEG到MP4的转换速度太慢,而是希望这里的人能帮我解决这个问题,因为我已经四处搜索了,还没有找到解决问题的方法 所以我找到了一个脚本,它似乎为我做了这项工作,它输入了几种视频文件格式,然后将转换成MP4,稍后我将允许网络用户在线观看 FFMPEG在此脚本中完成了两项主要工作:以.jpg格式捕获静态图像,并将视频转换为MP4。经过一些调整后,脚本似乎可以工作,但起初我认为它不工作,它只是停止了我的服务器 让我往后退一分钟。。。我在我的开发服务器上使用FFMPEG,它实

首先,我想说,我不是说FFMPEG到MP4的转换速度太慢,而是希望这里的人能帮我解决这个问题,因为我已经四处搜索了,还没有找到解决问题的方法

所以我找到了一个脚本,它似乎为我做了这项工作,它输入了几种视频文件格式,然后将转换成MP4,稍后我将允许网络用户在线观看

FFMPEG在此脚本中完成了两项主要工作:以.jpg格式捕获静态图像,并将视频转换为MP4。经过一些调整后,脚本似乎可以工作,但起初我认为它不工作,它只是停止了我的服务器

让我往后退一分钟。。。我在我的开发服务器上使用FFMPEG,它实际上只是我的蹩脚笔记本电脑,在Windows10上安装了XAMPP,只有2GB的RAM。一旦我的网站运行良好,我将从我糟糕的笔记本电脑开发环境转移到Godaddy或其他公司的入门级专用服务器托管计划,因为起初我预计我的网站流量会非常低

我遇到的问题是,我正在测试我将向您展示的脚本,即使是10MB的视频,也需要2分钟才能完成。同时,上传进度条显示100%,因为上传实际上已经完成,但没有消息让用户知道幕后正在发生什么。很明显,我可以找到解决问题的方法,甚至可以发个信息让他们知道这需要几分钟的时间。当我尝试一个120MB的视频时,花了超过5分钟的时间,这意味着我不仅要修改php.ini文件,以允许这样的脚本执行时间,而且还要修改它,这样在发生这种情况时,我就不能在网站上做任何事情

不仅我甚至不能上下滚动页面,而且如果我试图打开另一个选项卡并加载我的网站,它只会在那里出现一个空白屏幕,好像它试图访问我的网站。显然,这是因为FFMPEG在转换视频文件的过程中耗尽了所有系统资源。如果我打开“文件资源管理器”,在正在创建的视频文件上单击一次,然后继续单击一次,我将看到该文件的文件大小慢慢变大,这是显而易见的,因为文件正在填充。当然,这个问题是除了我之外没有其他用户在它上面,因为它处于开发阶段,所以我想知道在一个有在线用户的专用服务器上会是什么样子。在上传视频的人完成视频之前,其他用户在多少分钟内都不能做任何事情吗

对于120MB的文件,是否有必要将php.ini文件中的最大执行时间增加到5分钟以上?如果用户尝试上载大于120MB的文件,会发生什么情况?我应该在500MB的时候切断它们吗

我喜欢这样一个事实:我的用户可以上传视频,我可以得到缩略图,甚至可以转换成MP4使用HTML5显示,但如果没有人(包括上传视频的用户)可以在系统资源被锁定的情况下使用该网站,我也不会感到激动。上一次我在YouTube上上传视频时,我想我记得有一条消息说需要几分钟才能完成,但我不记得网站完全停止了几分钟。也许这是因为我用的是我微不足道的笔记本电脑

在寻找这个问题的答案时,我确实遇到一些人抱怨它速度慢,但没有找到任何解决方案,事实上,我不认为我看到有人说它在完成之前完全锁定了网站。正如我所说的,我讨厌其他人不能访问我的网站,或者仅仅因为有人上传视频而被踢出网站

也许这是一个常见的问题,一旦我投入生产,就可以用一个足够强大的专用服务器来解决?我将非常感谢任何和所有关于如何解决这个问题的建议,这样用户至少可以继续使用我们网站的其他领域,而转换正在进行。转换完成后,我可以向他们发送警报。如果有任何关于最低专用服务器规格的建议可以帮助缓解这种情况,我洗耳恭听!)谢谢

以下是我当前使用的脚本:

<?php
include_once($_SERVER['DOCUMENT_ROOT'].'/includes/dbc.php');
// size input prevents buffer overrun exploits.
   function sizeinput($input, $len){
        (int)$len;
     (string)$input;
     $n = substr($input, 0,$len);
     $ret = trim($n);
     $out = htmlentities($ret, ENT_QUOTES);
     return $out;
}

 //Check the file is of correct format.  
 function checkfile($input){
    $ext = array('mpg', 'wma', 'mov', 'flv', 'mp4', 'avi', 'qt', 'wmv', 'rm');
    $extfile = substr($input['name'],-4); 
    $extfile = explode('.',$extfile);
    $good = array();
    $extfile = $extfile[1];
    if(in_array($extfile, $ext)){
          $good['safe'] = true;
         $good['ext'] = $extfile;
    }else{
          $good['safe'] = false;
   }
     return $good;
 }

 $user_id = $_SESSION['user_id'];
 // if the form was submitted process request if there is a file for uploading
 if($_POST && array_key_exists("vid_file", $_FILES)){
                           //$uploaddir is for videos before conversion
                          $uploaddir = 'temp/';
                           //$live_dir is for videos after converted to flv
        $live_dir = 'library/';
                            //$live_img is for the first frame thumbs.
        $live_img = 'thumbs/';      
                           $seed = time();       
        $upload = $seed;
        $uploadfile = 'temp/'.$upload.'.mp4';        
        $vid_title = sizeinput($_POST['vidTitle'], 50);
        $vid_title = sanitizeString($vid_title);
        $vid_desc = sizeinput($_POST['vidDesc'], 2000);
        $vid_desc = sanitizeString($vid_desc);
        $vid_cat = (int)$_POST['vidCat'];
        $safe_file = checkfile($_FILES['vid_file']);
        if($safe_file['safe'] == 1){
            if (move_uploaded_file($_FILES['vid_file']['tmp_name'], 'temp/'.$upload.'.mp4')) {
                   echo "File was successfully uploaded.<br/>";
                    //$base = basename($uploadfile, $safe_file['ext']);
                    $new_file = $seed.'.mp4';
                    $new_image = $seed.'.jpg';
                    $new_image_path = "thumbs/".$seed.'.jpg';
                    $new_flv = "library/".$new_file;
                    //exec('ffmpeg -i '.$uploadfile.' -an -ss 00:00:01-r 1 -vframes 1 -f mjpeg -y '.$new_image_path);
                    exec('ffmpeg  -i '.$uploadfile.' -f mjpeg -vframes 1 -s 300x300 -an '.$new_image_path.'');
                    //ececute ffmpeg generate flv
                      exec('ffmpeg -i '.$uploadfile.' -f mp4 '.$new_flv);
                       //execute ffmpeg and create thumb


            echo 'Thank You For Your Video!<br>';
                       //create query to store video

        $sql = "INSERT INTO videos (`user_id`, `title`,`desc`, `file`, `thumb`) VALUES('".$user_id."','".$vid_title."','".$vid_desc."','".$new_file."','".$new_image."')";


                    echo '<img src="'.$new_image_path.'" /><br/>
                          <h3>'.$vid_title.'</h3>';
                    mysqli_query($link, $sql) or die(mysqli_error($mysql));
             } else {
                    echo "Possible file upload attack!\n";
                    print_r($_FILES);
             }

        }else{

             echo 'Invalid File Type Please Try Again. You file must be of type 
             .mpg, .wma, .mov, .flv, .mp4, .avi, .qt, .wmv, .rm';

        }
 }
 ?>


marekful回答了这个问题。我需要一个功能更强大的服务器,为了允许用户使用该网站,我想我需要在转换过程发生在后台之前,以某种方式将它们转发到某个地方。感谢您提供的信息。

我只想指出,我不关心转换需要多长时间,只关心用户被卡住,无论转换需要多长时间,都无法访问我的网站。此外,浏览器不断中断,表示页面没有响应,并询问我是否要终止该页面。这并不好,必须有更好的方式允许用户上传视频。感谢这句话有点太长了,它表明您的服务器不够强大。您需要更强大的配置来获得更好的转换时间。然而,“但这也使得我在网站上什么也做不了。”这是一个你可以通过上传脚本返回并在后台处理视频来解决的问题。然后,您可以轮询视频的状态,并在完成后显示一条消息。我找到了以下可能会开始使用的专用服务器,以下是规格:Intel E3-1230 V2四核CPU 4c/8t x 3.3GHz 32GB RAM-DDR3 500GB SSD HD 20TB$100/月。。。我希望我遇到的问题能通过这个服务器解决。有什么想法吗?您的命令创建了一个MP4而不是FLV
exec('ffmpeg-i'.$uploadfile'.-f MP4'.$new\u FLV)添加
-预设:v superfast
以加快速度。