Преобразование FFMPEG MP4 занимает так много времени, его не практично - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу начать с того, что я не просто констатирую тот факт, что преобразование FFMPEG в MP4 происходит так медленно, но я надеюсь, что кто-то здесь может помочь мне с этим, поскольку я искал вокруг и не действительно выяснил, что делать, чтобы исправить мою проблему.

Итак, я нашел скрипт, который, кажется, выполняет эту работу за меня, он вводит несколько форматов видеофайлов и, в свою очередь, преобразует их в MP4, который позже я позволю веб-пользователю смотреть онлайн.

FFMPEG выполняет два основных действия в этом сценарии: неподвижное изображение записывается в формате .jpg, а видео преобразуется в MP4. После некоторой настройки сценарий, кажется, работает, но сначала я подумал, что он не работает, что он просто останавливает мой сервер.

Позвольте мне вернуться на минутку ... Я использую FFMPEG на своем сервере разработки, который на самом деле просто мой дерьмовый ноутбук с XAMPP, установленным в Windows 10 и только 2 ГБ оперативной памяти. Как только сайт будет работать идеально, я перейду от своей дрянной среды разработки ноутбуков к плану хостинга выделенного сервера начального уровня от Godaddy или другого, так как сначала я ожидаю, что трафик на мой сайт будет очень низким.

Проблема, с которой я столкнулся, заключается в том, что я тестирую сценарий, который я вам покажу, и даже с видео размером 10 МБ на его завершение уходит более 2 минут. Между тем, индикатор выполнения загрузки показывает 100%, поскольку загрузка фактически завершена, но пользователю не сообщается, что что-то происходит за кулисами. Очевидно, что я могу понять, как исправить себя, может быть, даже просто написать сообщение, сообщающее им, что это будет через несколько минут. Когда я попробовал видео размером 120 МБ, это заняло более 5 минут, что означало, что мне пришлось не только изменить свой файл php.ini, чтобы учесть такое время выполнения скрипта, но и сделать так, чтобы я ничего не мог сделать на веб-сайте, пока это происходит.

Я могу не только прокрутить страницу вверх или вниз, но и, если я попытаюсь открыть другую вкладку и загрузить свой веб-сайт, он просто сидит с пустым экраном, как будто пытается получить доступ к моему сайту. Очевидно, это потому, что FFMPEG использует все системные ресурсы при конвертации видеофайла. Если я открою проводник и нажму один раз на видеофайл, который создается, и продолжу один раз щелкать по нему, я увижу, что размер файла постепенно увеличивается и увеличивается, что очевидно, так как файл заполняется. Эта проблема, конечно же, связана с тем, что на ней нет никого, кроме меня самого, так как он находится на стадии разработки, поэтому мне интересно, как это будет выглядеть на выделенном сервере с пользователями в сети. Разве другие пользователи не смогут ничего сделать в течение стольких минут, пока кто-нибудь, кто загружает видео, не закончит свое видео?

Нужно ли мне увеличивать максимальное время выполнения в файле php.ini до более 5 минут для файла размером 120 МБ? Что произойдет, если пользователь попытается загрузить файл размером более 120 МБ? Должен ли я обрезать их на 500 МБ, возможно?

Мне нравится тот факт, что мои пользователи смогут загружать видео, и я могу получать эскизы и даже конвертировать в 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';

        }
 }
 ?>

1 Ответ

0 голосов
/ 30 апреля 2018

Марекфул ответил на вопрос. Мне нужен более мощный сервер, и, чтобы позволить пользователю использовать веб-сайт, я думаю, мне нужно каким-то образом перенаправить их куда-нибудь, прежде чем процесс конвертации будет происходить в фоновом режиме. Спасибо за информацию.

...