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

server/2025/3/1 9:07:19/

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


http://www.ppmy.cn/server/171513.html

相关文章

互联网医院实时数据监测智能分析系统设计概述(上)

研究背景 近年来,随着互联网技术的飞速发展,互联网医疗作为一种新兴的医疗模式,正逐渐改变着传统的医疗服务方式。互联网医疗借助互联网、大数据、人工智能等技术手段,实现了医疗服务的线上化、智能化和便捷化,为患者提供了更加高效、优质的医疗服务。 根据中国互联网络信…

安科瑞DJSF1352直流电能表在光伏串组箱的应用:提升光伏发电效率与安全的智能利器-安科瑞 耿笠

随着光伏发电技术的快速发展,光伏电站的规模不断扩大,如何高效、安全地管理光伏发电系统成为行业关注的焦点。在光伏发电系统中,光伏串组箱作为连接光伏组件与逆变器的关键设备,其运行状态直接影响整个系统的发电效率和安全性。而…

Wireshark Lua 插件教程

本⽂主要介绍 Lua 脚本在 Wireshark 中的应⽤, Lua 脚本可以在 Wireshark 中完成如下功能: 从⽹络包中提取数据, 或者统计⼀些数据包(Dumper) 需要解析⼀种 Wireshark 不提供原⽣⽀持的协议(Dissector) ⽰例 协议解析 VREP 协议是 NOGD 框架对于 TRIP 协议的⼀种延伸和扩展…

独立开发者软件出海的法律风险规避指南

海外用户付费意愿高,美元结算等优势,很多公司和独立开发者选择软件出海,那么需要注意哪些问题呢? 1. 了解目标市场的法律法规 不同国家和地区对软件的法律规定各不相同,包括但不限于版权法、数据保护法、消费者保护法…

http 协议和 https 协议的区别是什么?

互联网各领域资料分享专区(不定期更新): Sheet 正文 HTTP(超文本传输协议)和 HTTPS(安全超文本传输协议)的核心区别在于安全性,以下是两者的主要对比: 1. 协议与安全性 HTTP:数据以明文形式传输,易被窃听、篡改或中间人攻击。HTTPS:通过 SSL/TLS 协议对数据进行加密…

mysql查询的时候有个字段设置为当天日期

在 MySQL 查询中,如果你希望将某个字段设置为当天的日期,可以使用 MySQL 的日期函数 CURDATE() 或 NOW()(取决于你是否需要精确到时间)。以下是一些常见的用法示例: 1. 使用 CURDATE() CURDATE() 返回当前日期&#…

C++ Qt使用命令自动添加exe依赖的Qt库

进入exe文件夹下,打开对应Qt版本的Cmd工具:QT 5.12.2cmd命令工具 执行以下命令,进入exe文件目录: cd E:\proj\bin 如果cd 没有反应,可按顺序执行以下代码进入指定目录: cd \ cd E: cd E:\proj\bin …

当生活被算法重塑:AI 对生活的多面影响

在当今数字化时代,AI 已经如同一股无形却强大的力量,渗透到我们生活的方方面面。它的出现,无疑给我们的生活带来了诸多变革,这些变革既有积极的一面,也存在一些消极的影响。 AI 带来的积极影响 工作效率大幅提升 在工…