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

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

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

 

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

 

编译安装ffmpeg

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

 

详解Laravel如何安装FFmpeg并进行视频文件处理插图(1)

 

./configuremakesudo make install

在这里插入图片描述

测试是否安装成功

ffmpeg -version
ffplay -version

 

详解Laravel如何安装FFmpeg并进行视频文件处理插图(2)

 

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

 

1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!
2.本站部分资源包有加密,加密统一密码为:www.51zhanma.cn
3. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
4. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
5. 如果您也有好的资源或教程,您可以投稿发布,用户购买后有销售金额的80%以上的分成收入!
6.如有侵权请联系客服邮件kefu@zhanma.cn
站码网 » 详解Laravel如何安装FFmpeg并进行视频文件处理

发表评论

  • 1806本站运营(天)
  • 1941会员数(个)
  • 5310资源数(个)
  • 1287评论数(个)
  • 0 近 30 天更新(个)
加入 VIP