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

发布时间 - 2021-08-02 00:00:00    点击率:

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


1.3编译安装ffmpeg
进入ffmpeg文件夹,依次执行以下命令:

 ./configuremakesudo make install

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

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',
            ]);
        });
    }

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

基础封装

举例:

  • 视频的第一秒为封面
  • 获取视频基础信息
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

更多laravel技术文章,请访问laravel教程栏目!


# laravel  # php  # 封装  # 对象  # github  # ubuntu  # ffmpeg  # 在这里  # 正常使用  # 可以选择  # 配置文件  # 官网  # 是否存在  # 几秒  # 所讲  # 出现错误  # 图片上传 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: linux写shell需要注意的问题(必看)  如何在 Pandas 中基于一列条件计算另一列的分组均值  bing浏览器学术搜索入口_bing学术文献检索地址  如何用腾讯建站主机快速创建免费网站?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何使用.env文件管理环境变量?(最佳实践)  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  如何在阿里云ECS服务器部署织梦CMS网站?  Laravel如何实现本地化和多语言支持?(i18n教程)  如何在IIS中新建站点并配置端口与IP地址?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  如何在云主机快速搭建网站站点?  Laravel如何使用Telescope进行调试?(安装和使用教程)  手机网站制作与建设方案,手机网站如何建设?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  微信小程序 闭包写法详细介绍  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Laravel如何创建自定义中间件?(Middleware代码示例)  详解Android中Activity的四大启动模式实验简述  Laravel如何处理表单验证?(Requests代码示例)  Android GridView 滑动条设置一直显示状态(推荐)  如何在Tomcat中配置并部署网站项目?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel如何创建自定义Facades?(详细步骤)  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  网站建设保证美观性,需要考虑的几点问题!  桂林网站制作公司有哪些,桂林马拉松怎么报名?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Android利用动画实现背景逐渐变暗  Laravel如何处理文件下载请求?(Response示例)  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  如何利用DOS批处理实现定时关机操作详解  Python函数文档自动校验_规范解析【教程】  大型企业网站制作流程,做网站需要注册公司吗?  独立制作一个网站多少钱,建立网站需要花多少钱?  Laravel如何使用Livewire构建动态组件?(入门代码)  长沙企业网站制作哪家好,长沙水业集团官方网站?  Laravel如何升级到最新版本?(升级指南和步骤)  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  敲碗10年!Mac系列传将迎来「触控与联网」双革新