详解Laravel如何安装FFmpeg并进行视频文件处理
4257
Ubuntu 18.04 安装FFmpeg
1、下载源码编译安装
github地址:github.com/PHP-FFMpeg/PHP-FFMpeg
安装依赖的库
主要安装三个: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
编译安装ffmpeg
进入ffmpeg文件夹,依次执行以下命令:
- ./configuremakesudo make install
在这里插入图片描述
测试是否安装成功
- ffmpeg -version
- ffplay -version
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',
- ]);
- });
- }
使用单例模式获取 FFMpeg 和 FFProbe 对象,其中 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
本文网址:https://www.zztuku.com/index.php/detail-9051.html
站长图库 - 详解Laravel如何安装FFmpeg并进行视频文件处理
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!