如何修复视频处理和500错误 - (Laravel,FFmpeg)

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

drydaenth257216154
drydaenth257216154 嗨mdexp,感谢您的评论,我正在使用'数据库'驱动程序...视频上传和处理但问题是当它重定向到仪表板,过程结束和午餐500错误,但如果我去myaddress.com/home它向我展示了视频预览和数据。
12 个月之前 回复
doukundong9652
doukundong9652 你使用哪个队列驱动程序?如果使用同步驱动程序,作业将立即执行,因此转换可能会超时执行php脚本。
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问