Я хочу начать с того, что я не просто констатирую тот факт, что преобразование 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';
}
}
?>