【问题标题】:FFMPEG MP4 conversion takes so long its not practicalFFMPEG MP4 转换需要很长时间,它不实用
【发布时间】:2018-10-10 18:06:22
【问题描述】:

首先我想说的是,我不仅要说明 FFMPEG 到 MP4 的转换速度如此之慢,而且我希望这里有人可以帮助我解决这个问题,因为我已经四处搜索并没有真的找到了解决我的问题的方法。

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

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

让我备份一下...我在我的开发服务器上使用 FFMPEG,这实际上只是我在 Windows 10 上安装了 XAMPP 并且只有 2GB 内存的蹩脚笔记本电脑。一旦我的网站完美运行,我将从糟糕的笔记本电脑开发环境转移到可能来自 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';

        }
 }
 ?>

【问题讨论】:

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

标签: ffmpeg mp4


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2013-09-07
    • 2020-08-26
    • 2014-10-09
    相关资源
    最近更新 更多