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

 4257

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

Ubuntu 18.04 安装FFmpeg

1、下载源码编译安装

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

安装依赖的库

主要安装三个:yasm ,sdl1.2 和 sdl2.0

  1. 安装 yasmsudo apt-get install yasm
  2. 安装 sdl1.2sudo apt-get install libsdl1.2-dev
  3. 安装 sdl2.0sudo apt-get install libstdl2-devsudo apt-get install libstdl2-dev

如果sdl2.0 安装出现错误的话可以选择编译安装方式:

官网下载最新版本: www.libsdl.org/download-2.0.php

解压后进入到目录中,依次执行以下命令:

  1. ./configure
  2. make
  3. sudo make install


61079f3f7da12.jpg


编译安装ffmpeg

进入ffmpeg文件夹,依次执行以下命令:


61079f6d89c8d.jpg


  1. ./configuremakesudo make install

在这里插入图片描述

测试是否安装成功

  1. ffmpeg -version
  2. ffplay -version


61079fa46de0b.png


laravel 安装PHP-FFMpeg扩展

  1. composer require php-ffmpeg/php-ffmpeg

基本使用

1.1、 引入到项目

引入完成,它需要制定 两个配置文件信息,以便我们正常使用,也就是上文所讲的 ffmpeg 和 ffprobe

1.2、全局配置

到 AppServiceProvider.php 中添加代码

  1. public function boot()
  2. {
  3.     $this->registerSingleObject();
  4. }
  5. private function registerSingleObject()
  6. {
  7.         //       $ffmpeg = FFMpeg::create(array(
  8.         //           'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',
  9.         //           'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',
  10.         //           'timeout'          => 3600, 
  11.         // The timeout for the underlying process
  12.         //           'ffmpeg.threads'   => 12,   
  13.         // The number of threads that FFMpeg should use
  14.         //       ));
  15.     $this->app->singleton('ffmpeg', function ($app) {
  16.         return FFMpeg::create([
  17.             'ffmpeg.binaries'  => '/usr/local/ffmpeg/ffmpeg',
  18.             'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',
  19.         ]);
  20.     });
  21.     $this->app->singleton('ffprobe', function ($app) {
  22.         return FFProbe::create([
  23.             'ffprobe.binaries' => '/usr/local/ffmpeg/ffprobe',
  24.         ]);
  25.     });
  26. }

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


基础封装

举例:

视频的第一秒为封面

获取视频基础信息

  1. <?php
  2.  
  3. namespace AppHelpers;
  4. use FFMpegCoordinateTimeCode;
  5. use IlluminateSupportStr;
  6.  
  7. class FFMpegUtil{
  8.  
  9.     // 获取视频信息
  10.     public static function getVideoInfo($streamPath)
  11.     {
  12.         $ffprobe = app('ffprobe');
  13.         $stream  = $ffprobe->streams($streamPath)->videos()->first();
  14.         return $stream ? $stream->all() : [];
  15.     }
  16.  
  17.     // 截取
  18.     public static function getCover($streamPath, $fromSecond)
  19.     {
  20.         $ffmpeg   = app('ffmpeg');
  21.         $video    = $ffmpeg->open($streamPath);
  22.         $frame    = $video->frame(TimeCode::fromSeconds($fromSecond)); //提取第几秒的图像
  23.         $fileName = 'video/' . Str::random(12) . '.jpg';
  24.         if (!is_dir(storage_path("video"))) {
  25.             mkdir(storage_path("video"), 0777);
  26.         }
  27.         $frame->save(storage_path($fileName));
  28.         return $fileName;
  29.     }
  30. }

业务使用

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

  1. public function saveVideotoQiniu($file){
  2.     Auth::loginUsingId(1);
  3.     if ($user = getUser()) {
  4.         // 1.判断是否存在此视频
  5.         $path  = $file->getRealPath();
  6.         $hash  = md5_file($path);
  7.         $video = Video::firstOrNew(['json->hash' => $hash]);
  8.         if ($video->id) {
  9.             $video->touch();
  10.             return $video;
  11.         }
  12.         // 2.保存到 云
  13.         $cdn_path = $this->saveFile($file);
  14.         $db_path  = getPath($cdn_path);
  15.         // 3.获取截图
  16.         $fileName = FFMpegUtil::getCover($path, 1);
  17.         $image    = $this->saveImage(new UploadedFile(storage_path($fileName), 'file.jpg'));
  18.         //4.设置视频信息
  19.         $data     = [];
  20.         $data     = FFMpegUtil::getVideoInfo($path);
  21.         $duration = array_get($data, 'duration');
  22.         $duration = $duration > 0 ? ceil($duration) : $duration;
  23.         $video->path    = $db_path;
  24.         $video->user_id = $user->id;
  25.         $video->setJsonData('width', array_get($data, 'width'));
  26.         $video->setJsonData('height', array_get($data, 'height'));
  27.         $video->duration = $duration;
  28.         $video->setJsonData('cover', $image->path);
  29.         $video->save();
  30.     }
  31. }

例子中的 saveImage 是将图片上传到 云端的函数,返回上传后的图片 url


本文网址:https://www.zztuku.com/index.php/detail-9051.html
站长图库 - 详解Laravel如何安装FFmpeg并进行视频文件处理
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐

    秋天落叶jQuery特效