Home  >  Article  >  PHP Framework  >  Detailed explanation of how laravel installs FFmpeg and processes video files

Detailed explanation of how laravel installs FFmpeg and processes video files

藏色散人
藏色散人forward
2021-08-02 14:34:322725browse

Ubuntu 18.04 Install FFmpeg

1. Download the source code, compile and install

1.1 Download the source code

github address: github.com/PHP-FFMpeg/PHP-FFMpeg

##1.2 Install dependent libraries

There are three main installations: yasm, sdl1 .2 and sdl2.0

安装 yasmsudo apt-get install yasm
安装sdl1.2sudo apt-get install libsdl1.2-dev
安装 sdl2.0sudo apt-get install libstdl2-devsudo apt-get install libstdl2-dev
If there is an error in the installation of sdl2.0, you can choose the compilation and installation method:

Download the latest version from the official website: www.libsdl.org/download-2.0.php
Unzip Then enter the directory and execute the following commands in sequence:

./configure
make
sudo make install

##1.3 Compile and install ffmpeg Enter the ffmpeg folder and execute the following commands in sequence:


 ./configuremakesudo make install
Insert picture description here1.4 Test whether the installation is successful

ffmpeg -version
ffplay -version

laravel installation

PHP-FFMpeg

Extension

composer require php-ffmpeg/php-ffmpeg
Basic use

1.1. Introduction to the project

The introduction is completed. It needs to formulate two configuration file information for us to use normally, which is the ffmpeg and ffprobe mentioned above
1.2. Global configuration

Add code to

AppServiceProvider.php

<pre class="brush:php;toolbar:false">    public function boot()     {         $this-&gt;registerSingleObject();     }      private function registerSingleObject()     {//       $ffmpeg = FFMpeg::create(array(//           'ffmpeg.binaries'  =&gt; '/usr/local/ffmpeg/ffmpeg',//           'ffprobe.binaries' =&gt; '/usr/local/ffmpeg/ffprobe',//           'timeout'          =&gt; 3600, // The timeout for the underlying process//           'ffmpeg.threads'   =&gt; 12,   // The number of threads that FFMpeg should use//       ));         $this-&gt;app-&gt;singleton('ffmpeg', function ($app) {             return FFMpeg::create([                 'ffmpeg.binaries'  =&gt; '/usr/local/ffmpeg/ffmpeg',                 'ffprobe.binaries' =&gt; '/usr/local/ffmpeg/ffprobe',             ]);         });         $this-&gt;app-&gt;singleton('ffprobe', function ($app) {             return FFProbe::create([                 'ffprobe.binaries' =&gt; '/usr/local/ffmpeg/ffprobe',             ]);         });     }</pre>Use singleton mode to obtain

FFMpeg

and FFProbe objects, where exec('which ffmpeg') is to obtain program location information in order to create a class

Basic packageExample:

The first second of the video is the cover
  • Get the basic information of the video
  • <?php
    
    namespace AppHelpers;use FFMpegCoordinateTimeCode;use IlluminateSupportStr;class FFMpegUtil{
    
        // 获取视频信息
        public static function getVideoInfo($streamPath)
        {
            $ffprobe = app(&#39;ffprobe&#39;);
            $stream  = $ffprobe->streams($streamPath)->videos()->first();
            return $stream ? $stream->all() : [];
        }
    
        // 截取
        public static function getCover($streamPath, $fromSecond)
        {
            $ffmpeg   = app('ffmpeg');
            $video    = $ffmpeg->open($streamPath);
            $frame    = $video->frame(TimeCode::fromSeconds($fromSecond)); //提取第几秒的图像
            $fileName = 'video/' . Str::random(12) . '.jpg';
            if (!is_dir(storage_path("video"))) {
                mkdir(storage_path("video"), 0777);
            }
            $frame->save(storage_path($fileName));
            return $fileName;
        }}

Business useThe video passed in by the Request object is Example

public function saveVideotoQiniu($file)
    {
        Auth::loginUsingId(1);
        if ($user = getUser()) {

            // 1.判断是否存在此视频
            $path  = $file->getRealPath();
            $hash  = md5_file($path);
            $video = Video::firstOrNew(['json->hash' => $hash]);
            if ($video->id) {
                $video->touch();
                return $video;
            }

            // 2.保存到 云
            $cdn_path = $this->saveFile($file);
            $db_path  = getPath($cdn_path);

            // 3.获取截图
            $fileName = FFMpegUtil::getCover($path, 1);
            $image    = $this->saveImage(new UploadedFile(storage_path($fileName), 'file.jpg'));

            //4.设置视频信息
            $data     = [];
            $data     = FFMpegUtil::getVideoInfo($path);
            $duration = array_get($data, 'duration');
            $duration = $duration > 0 ? ceil($duration) : $duration;

            $video->path    = $db_path;
            $video->user_id = $user->id;
            $video->setJsonData('width', array_get($data, 'width'));
            $video->setJsonData('height', array_get($data, 'height'));
            $video->duration = $duration;
            $video->setJsonData('cover', $image->path);
            $video->save();
        }
    }

saveImage

in the example is a function that uploads images to the cloud and returns the uploaded image URLFor more laravel technical articles, please visit

laravel tutorial

column!

The above is the detailed content of Detailed explanation of how laravel installs FFmpeg and processes video files. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:learnku.com. If there is any infringement, please contact admin@php.cn delete