I'm setting up a new website with Laravel for uploading videos... I have read all the possible solutions but none of them help me to solve the issue...
This is my issue: When I upload a small file (<10mb) the web works fine, the video get uploaded and the video get converted, the dashboard shows the converted videos---
When I try to upload a large file, the file get uploaded, the video get converted with a green frame on it (really uggly) and the site goes to a 500 server error...
I'm using Laravel Jobs to do the conversion.
My Controller code:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Symfony\Component\HttpFoundation\Response;
use Carbon;
use Closure;
use App\Jobs\ConvertVideoForPreview;
use FFMpeg\FFProbe;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Format\Video\X264;
use Pawlox\VideoThumbnail\Facade\VideoThumbnail;
use Pbmedia\LaravelFFMpeg\FFMpegFacade as FFMpeg;
use Illuminate\Contracts\Filesystem\Filesystem;
use App\Video;
class VideoController extends Controller
{
public function createVideo(){
return view('video.createVideo');
}
public function saveVideo(Request $request){
set_time_limit(0);
ini_set('memory_limit', '1024M');
//Validar Formulario
$validatedData = $this -> validate($request, [
'title' => 'required',
'description' => 'required',
'palabras' => 'required',
'video' => 'mimetypes:video/mp4,video/quicktime'
]);
$video = new Video();
$user = \Auth::user();
$video -> user_id = $user->id;
$video -> title = $request -> input('title');
$video -> description = $request -> input('description');
$video -> palabras = $request -> input('palabras');
$video_file = $request -> file('video');
if($video_file){
$video_path = 'original'.'_'.$video_file ->
getClientOriginalName();
Storage::disk('videos')-> put($video_path,
\File::get($video_file));
$videoUrl = storage_path('app/videos/').$video_path;
$storageUrl = storage_path('app/thumbs/');
$fileName = 'thumb'.'_'.time().'.jpg';
$second = 2;
VideoThumbnail::createThumbnail($videoUrl, $storageUrl,
$fileName, $second, $width = 640, $height = 480);
$video -> preview = $fileName;
$video -> video_path = $video_path;
}
$video -> save();
ConvertVideoForPreview::dispatch($video);
return redirect() -> route('home')
-> with (array(
'message' => 'El video se ha enviado con exito'));
}
public function getImage($filename){
$file = Storage::disk('thumbs') -> get($filename);
return new Response($file, 200);
}
public function getVideo($filename){
$file = Storage::disk('converted_videos') ->
get($filename);
return new Response($file, 200);
}
}
This is my ConvertVideo Job:
<?php
namespace App\Jobs;
use App\Video;
use Carbon\Carbon;
use FFMpeg;
use FFMpeg\Format\Video\X264;
use Illuminate\Http\Request;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class ConvertVideoForPreview implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable,
SerializesModels;
public $video;
public function __construct(Video $video)
{
$this -> video = $video;
}
public function handle()
{
$converted_name= 'preview'.'-'.$this -> video ->
video_path.'.mp4';
FFMpeg::open('videos/'.$this -> video -> video_path)
-> export()
-> inFormat(new \FFMpeg\Format\Video\X264)
-> save('converted_videos/'.$converted_name);
$this -> video -> update([
'video_preview' => $converted_name,
'processed' => true
]);
}
}
One of my goals is to upload large video files (<=4GB), show a uploading process bar and a encoding process bar during the video upload.
I getting this error:
[core:error] [pid 14787:tid 139975366489856] [client
201.188.26.12:51022] Script timed out before returning headers:
index.php,
It's happend when the video es proccesing and the redirect to home dashboard it's call...
The FFMPEG works:
[2019-07-19 17:20:41] local.INFO: ffprobe executed command successfully
[2019-07-19 17:21:52] local.INFO: ffmpeg executed command successfully
[2019-07-19 17:21:52] local.INFO: ffmpeg running command '/usr/local/bin/ffmpeg' '-y' '-i' '/home/tribus/public_html/storage/app/videos/original_Sequence 01.mov' '-threads' '12' '-vcodec' 'libx264' '-acodec' 'libfaac' '-b:v' '1000k' '-refs' '6' '-coder' '1' '-sc_threshold' '40' '-flags' '+loop' '-me_range' '16' '-subq' '7' '-i_qfactor' '0.71' '-qcomp' '0.6' '-qdiff' '4' '-trellis' '1' '-b:a' '128k' '-pass' '2' '-passlogfile' '/tmp/ffmpeg-passes5d31fbe9010e6ldt9s/pass-5d31fbe90152d' '/home/tribus/public_html/storage/app/converted_videos/preview-original_Sequence 01.mov.mp4'
I have tried: Change all the memory and file size in PHP.ini, Nginx, Apache... (Probably I'm missing one)...
Changed timeouts too.
My environment: VPS 4GB 50GB, APACHE 2.4, PHP7.3, MySql MariaDB, WebServer: Apache-Nginx, Laravel 5.8.
Can anyone help me to reach this?...
This is how the large video looks after converted and show 500 error in the browser: Error video processed