douxie2029 2019-07-19 17:57
浏览 498

如何修复视频处理和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

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!
    • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
    • ¥15 求daily translation(DT)偏差订正方法的代码
    • ¥15 js调用html页面需要隐藏某个按钮