laravel项目中使用FFMPeg 剪裁视频

embedded/2025/3/15 1:53:50/

# 运行环境需安装的软件
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/embedded/172636.html

相关文章

Machine Learning中的模型选择

选择适合的机器学习模型是构建高效、准确模型的关键步骤。以下是决定选用哪个模型的主要考虑因素和步骤: 1. 明确问题类型 首先,明确你要解决的问题类型: 分类问题:预测离散类别(如垃圾邮件分类、图像识别&#xff09…

《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

文章目录 一、引言二、SPI总线协议的基本原理三、SPI通信模式详解 —— CPOL与CPHA3.1 时钟极性(CPOL)3.2 时钟相位(CPHA)3.3 四种SPI模式 四、主从设备通信机制4.1 通信流程概述4.2 数据帧结构与传输细节4.3 主设备与从设备的协同…

用PHP的Guzzle库编写的图片爬虫程序

使用 PHP 的 Guzzle 库编写一个图片爬虫程序是一个非常常见的任务,Guzzle 是一个流行的 HTTP 请求库,允许你轻松地发送请求和处理响应。 下面是一个使用 Guzzle 编写的图片爬虫程序示例。此程序将从指定的网页中提取图片链接并将图片下载到本地。 1、安…

无法解析插件 org.springframework.boot:spring-boot-maven-plugin:2.4.13报错异常

今天导入项目的时候,Maven突然加载异常爆红 重新配置了一下用户文件查看包里是否有我们需要的版本(这个版本必须与父文件版本相同), 找到你自己的maven文件地址 路径:Maven\repository\org\springframework\boot\spri…

TCP网络协议

TCP粘包 1. TCP在接收数据时,多包数据粘在了一起 2. 原因: 1. TCP发送数据时,没有及时发走,会根据缓冲区数据的情况进行重新组包; 2. TCP接收方,没有及时读走缓冲区数据,导致缓冲区大量数…

TTP/HTTPS、TCP/IP 协议、RPC、Socket 通信机制

1. TTP/HTTPS TTP (HTTP) 和 HTTPS(Hypertext Transfer Protocol Secure)是基于 TCP/IP 协议的应用层协议,主要用于客户端和服务器之间的数据传输。 HTTP(超文本传输协议):这是用于 web 页面和服务器之间…

Ultravox:融合whisper+llama实现audio2text交互

Ultravox是由Fixie AI开发的一种创新型多模态大语言模型,专为实时语音交互设计。与传统的语音交互系统不同,Ultravox无需单独的语音识别(ASR)阶段,可以直接理解文本和人类语音,实现更快速、更自然的交互体验。Ultravox v0.5在语音理解基准测试中超越了OpenAI的GPT-4o Realt…

vue3在ts中动态添加DOM(1、使用render函数,2、使用tsx)

1、使用render函数和h函数 h函数创建虚拟节点&#xff08;VNode&#xff09;&#xff0c;render函数实现虚拟节点生成真实DOM元素 实现添加一个el-button按钮 <script setup lang"ts"> import { ElButton } from "element-plus"; //需要在页面中引…