当前位置: 首页 > news >正文

laravel项目中使用FFMPeg 剪裁视频

# 运行环境需安装的软件
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]);
        }
    }

相关文章:

  • 电子电气架构 --- 智能电动汽车概述
  • 【InterruptCallBack】- KRTS C++示例精讲(14)
  • java自带日志系统介绍(JUL)以及和Log4j 2、Logback、SLF4J不同日志工具的对比
  • 【解决方案】RAGFlow部分问题清单及解决方案备忘1
  • 专业视角:set 和 multiset的原理与应用解析
  • 星海智算:风月ComfyUI_SD3.5使用教程
  • 嵌入式开发工程师笔试面试指南-模电基础
  • uni-app vue2 记住密码功能
  • Python实现的用于处理协作车辆进入路口遮挡自车路径的情况
  • [Space Shooter_1] Environment | CMake | SDL
  • 防爆手机如何突破“安全与效率“悖论?解析AORO M8的双驱动创新
  • 工程化与框架系列(31)--前端依赖管理实践
  • Redis 2025/3/9
  • 【开源免费】基于SpringBoot+Vue.JS光影视频平台(JAVA毕业设计)
  • Hutool RedisDS:Java开发中的Redis极简集成与高阶应用
  • 边缘计算(Edge Computing)
  • 化合物上下游数据助力压缩研发周期
  • springboot 云原生介绍
  • 电商平台数据高效集成:旺店通旗舰版到MySQL方案解析
  • C++程序设计语言笔记——抽象机制:派生类
  • 改网站字体颜色代码/西安网站建设制作公司
  • 制作团购网站/域名备案查询
  • 做网站需要具备什么/wordpress自助建站
  • 网站 空间 域名/培训心得体会200字
  • 网站标题导航栏/哈尔滨最新疫情
  • 存储网站建设/优帮云查询数据云查询