Ошибка в загружаемом файле Jquery из-за преобразования FFMPEG с использованием PHP

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

и я вижу этот результат введите описание изображения здесь

Вот мой 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); в  $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); в  $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.

В конце концов мне было лучше разбить процесс на части:

  1. Получать закачку и копировать в tempdir.
  2. Вставьте данные в таблицу пакетов sql.
  3. Cron, глядя на пакетную таблицу для конвертирования видео, копирования в конечное местоположение и обновления финальной таблицы.
  4. Скрипт, который контролирует пакетный процесс и возвращает состояние видео, являющихся процессами.

Форма загрузки просто загружает и выполняет шаги 1 и 2. На той же странице у меня есть js, который пингует мой сценарий монитора и показывает соответствующую информацию.

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

Если кто-то сталкивается с той же проблемой, как это я исправил. Я изменил код ffmpeg на

  $ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 20 -preset fast /var/www/html/'.$outputname.' >/dev/null 2>/dev/null &', $out, $err); $ret = exec('ffmpeg -i /var/www/html/'.$url.' -vcodec libx264 -crf 26 -preset fast /var/www/html/'.$outputnameSD.' >/dev/null 2>/dev/null &', $out, $err); 

Последняя часть >/dev/null 2>/dev/null & позволяет предположить, что команда exec выполняется во время работы в фоновом режиме. Единственный недостаток этого решения состоит в том, что вы не можете удалить исходный файл после преобразования, если хотите, чтобы мне понравилось.

Чтобы удовлетворить это решение, ответ, предоставленный @hdezela, – это способ сделать это, т.е. написать cronjob