详解laravel如何安装FFmpeg并进行视频文件处理
时间:2022-03-03 11:48
github地址:github.com/PHP-FFMpeg/PHP-FFMpeg 主要安装三个:yasm ,sdl1.2 和 sdl2.0 如果sdl2.0 安装出现错误的话可以选择编译安装方式: 在这里插入图片描述 laravel 安装PHP-FFMpeg扩展 基本使用 到 使用单例模式获取 举例: 接受 Request 对象传入的 视频 为例子 例子中的 更多laravel技术文章,请访问laravel教程栏目! 以上就是详解laravel如何安装FFmpeg并进行视频文件处理的详细内容,更多请关注www.gxlsystem.com其它相关文章!Ubuntu 18.04 安装FFmpeg
1.下载源码编译安装
1.1 下载源码
1.2 安装依赖的库
安装 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
官网下载最新版本: 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
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;
}}
业务使用
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