php中使用laravel9项目 使用FFMpeg视频剪辑功能

1:需要现在系统中安装FFMpeg软件

2:在对应laravel项目中 按照扩展 composer require pbmedia/laravel-ffmpeg

2.1 发布配置文件

php artisan vendor:publish --provider="ProtoneMedia\LaravelFFMpeg\Support\ServiceProvider"

这会在 config 目录下生成一个 laravel-ffmpeg.php 配置文件。

2.2

运行环境需安装的软件

ffmpeg

安装的扩展

pbmedia/laravel-ffmpeg: ^8.3

扩展文档 https://packagist.org/packages/pbmedia/laravel-ffmpeg

引入的类

use FFMpeg\Coordinate\TimeCode;

use FFMpeg\Format\Video\X264;

use FFMpeg\Exception\RuntimeException;

use Illuminate\Support\Facades\Storage;

use Illuminate\Support\Str;

use ProtoneMedia\LaravelFFMpeg\Support\FFMpeg;

处理方法

public function cutUrlVideo($ossVideoPath)

{

$maxDuration = env('CLIP_VIDEO_SECONDS'); // 需要的时长

// 原始视频在 OSS 中的路径

$ossVideoPath = 'uploads/resource/2025/02/27/HzFdjwYQwUehk2WChH1DHAroKXMo0EkrG2lh1gQp.mp4';

// 生成本地临时文件路径

$tempInputPath = 'temp/input_' . uniqid() . '.mp4';

$tempOutputPath = 'temp/output_' . uniqid() . '.mp4';

// 将 OSS 视频下载到本地临时文件

Storage::disk('public')->put(tempInputPath, Storage::disk('oss')-\>get(ossVideoPath));

try {

// 获取下载到本地的媒体对象

media = FFMpeg::fromDisk('public')-\>open(tempInputPath);

// 获取视频总时长(秒)

duration = media->getDurationInSeconds();

// 根据时长判断处理逻辑

if (duration \> maxDuration) {

$start = TimeCode::fromSeconds(0);

end = TimeCode::fromSeconds(maxDuration);

clipFilter = new \\FFMpeg\\Filters\\Video\\ClipFilter(start, $end);

media-\>addFilter(clipFilter)

->export()

->toDisk('public')

->inFormat(new X264)

->save($tempOutputPath);

// 生成最终要使用的文件路径

$folderName = "/uploads/resource/" . date("Y/m/d");

extension = pathinfo(basename(ossVideoPath), PATHINFO_EXTENSION);

newFilename = Str::uuid()-\>toString() . '.' . extension;

// 上传到 OSS

ossPath = "{folderName}/{$newFilename}";

Storage::disk('oss')->put(ossPath, Storage::disk('public')-\>get(tempOutputPath));

return $ossPath;

} else {

return $ossVideoPath;

}

} finally {

// 清理临时文件

Storage::disk('public')->delete([tempInputPath, tempOutputPath]);

}

}

相关推荐
这是程序猿13 分钟前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
芳草萋萋鹦鹉洲哦17 分钟前
【elemen/js】阻塞UI线程导致的开关卡顿如何优化
开发语言·javascript·ui
爱学习的小邓同学21 分钟前
C++ --- 多态
开发语言·c++
颜*鸣&空29 分钟前
QT实现串口通信+VSPD+串口调试工具
开发语言·qt
4***v2141 小时前
详解 为什么 tcp 会出现 粘包 拆包 问题
网络·tcp/ip·php
槁***耿1 小时前
JavaScript在Node.js中的事件发射器
开发语言·javascript·node.js
U***49831 小时前
JavaScript在Node.js中的Strapi
开发语言·javascript·node.js
@大迁世界1 小时前
相信我兄弟:Cloudflare Rust 的 .unwrap() 方法在 330 多个数据中心引发了恐慌
开发语言·后端·rust
大侠课堂1 小时前
C#经典面试题100道
开发语言·c#
vx_dmxq2111 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php