站长资讯网
最全最丰富的资讯网站

详解laravel如何安装FFmpeg并进行视频文件处理

Ubuntu 18.04 安装FFmpeg

1.下载源码编译安装

1.1 下载源码

github地址:github.com/PHP-FFMpeg/PHP-FFMpeg

1.2 安装依赖的库

主要安装三个:yasm ,sdl1.2 和 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

如果sdl2.0 安装出现错误的话可以选择编译安装方式:
官网下载最新版本: www.libsdl.org/download-2.0.php
解压后进入到目录中,依次执行以下命令:

./configure make sudo make install

详解laravel如何安装FFmpeg并进行视频文件处理
1.3编译安装ffmpeg
进入ffmpeg文件夹,依次执行以下命令:
详解laravel如何安装FFmpeg并进行视频文件处理

 ./configuremakesudo make install

在这里插入图片描述
1.4 测试是否安装成功

ffmpeg -version ffplay -version

详解laravel如何安装FFmpeg并进行视频文件处理

laravel 安装PHP-FFMpeg扩展

composer require php-ffmpeg/php-ffmpeg

基本使用
1.1、 引入到项目
引入完成,它需要制定 两个配置文件信息,以便我们正常使用,也就是上文所讲的 ffmpeg 和 ffprobe
1.2、全局配置

AppServiceProvider.php 中添加代码

    public function boot()     {         $this->registerSingleObject();     }      private function registerSingleObject()     {//       $ffmpeg = FFMpeg::create(array(//           'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',//           'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',//           'timeout'          => 3600, // The timeout for the underlying process//           'ffmpeg.threads'   => 12,   // The number of threads that FFMpeg should use//       ));         $this->app->singleton('ffmpeg', function ($app) {             return FFMpeg::create([                 'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',                 'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',             ]);         });         $this->app->singleton('ffprobe', function ($app) {             return FFProbe::create([                 'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',             ]);         });     }

使用单例模式获取 FFMpegFFProbe 对象,其中 exec('which ffmpeg') 是获取 程序位置信息,以便创建类

基础封装

举例:

  • 视频的第一秒为封面
  • 获取视频基础信息
<?php  namespace AppHelpers;use FFMpegCoordinateTimeCode;use IlluminateSupportStr;class FFMpegUtil{      // 获取视频信息     public static function getVideoInfo($streamPath)     {         $ffprobe = app('ffprobe');         $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;     }}

业务使用

接受 Request 对象传入的 视频 为例子

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 是将图片上传到 云端的函数,返回上传后的图片 url

赞(0)
分享到: 更多 (0)
网站地图   沪ICP备18035694号-2    沪公网安备31011702889846号