宝塔think PHP8 安装使用FFmpeg 视频上传

news2025/6/7 13:21:11

宝塔think PHP8 安装使用FFmpeg

  • 一、 安装think PHP8
  • 二、安装 FFmpeg
    • 1,登录到宝塔面板。
    • 2,进入“软件商店”。
    • 3,搜索“FFmpeg”。
    • 4,选择版本点击安装。
    • 5,检查 FFmpeg 是否安装成功
    • 6, 在 ThinkPHP 8 中使用 FFmpeg
  • 三、使用 FFmpeg 处理视频
    • 1、使用终端命令转码
    • 2、用mvc模式
    • 3、查看结果
  • 四、上传视频
    • 1,前端代码
    • 2,后端代码
    • 3,上传结果

一、 安装think PHP8

1,在站点根目录下执行命令

composer create-project topthink/think tp

2,配置伪静态及运行目录,访问网站
在这里插入图片描述
出现上图,安装thinkphp8完成。

二、安装 FFmpeg

宝塔面板提供了一个很方便的命令行工具来安装软件。通过以下步骤安装 FFmpeg:

1,登录到宝塔面板。

2,进入“软件商店”。

3,搜索“FFmpeg”。

4,选择版本点击安装。

5,检查 FFmpeg 是否安装成功

安装完成后,通过 SSH 登录到你的服务器,然后运行以下命令来检查 FFmpeg 是否正确安装:

ffmpeg -version

如果这个命令返回了 FFmpeg 的版本信息,那么说明 FFmpeg 已经成功安装。

6, 在 ThinkPHP 8 中使用 FFmpeg

在 ThinkPHP 8 中使用 FFmpeg,使用一些现成的 PHP 库,如 php-ffmpeg/php-ffmpeg。首先通过 Composer 安装这个库:

composer require php-ffmpeg/php-ffmpeg

安装之前检查php安装fileinfo扩展

cd /www/server/php/php版本/src/ext/fileinfo
/www/server/php/php版本/bin/phpize
./configure --with-php-config=/www/server/php/php版本/bin/php-config
make && make install

三、使用 FFmpeg 处理视频

1、使用终端命令转码

进入demo.MP4所在文件夹,打开终端输入以下命令

ffmpeg -i demo.mp4 -profile:v baseline -level 3.0 -s 1920x1080 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls demo.m3u8

2、用mvc模式

创建控制器Video.php

public function convertVideo()
    {
        try {
            // 使用框架路径助手
            $inputFile = '需要转码视频问价路径';
            $outputDir = '转换后文件路径';
            
            // 安全验证
            if (!file_exists($inputFile)) {
                throw new \Exception('输入文件不存在');
            }

            // 完整HLS参数配置
            
            $command = "ffmpeg -i {$inputFile} -c:v libx264 -c:a aac -f hls -hls_time 10 {$outputDir}";
            exec($command, $output, $status);

            
            if ($status !== 0) {
                Log::error('转码失败: '.implode("\n", $output));
                return json(['code' => 500, 'msg' => '转码失败']);
            }
            
            return json(['code' => 200, 'data' => $outputDir]);
            
        } catch (\Exception $e) {
            Log::error($e->getMessage());
            return json(['code' => 500, 'msg' => $e->getMessage()]);
        }
    }

3、查看结果

1,在转换文件夹中生成.m3u8文件
在这里插入图片描述
2,在前端播放.m3u8视频,代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>DPlayer演示</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dplayer@1.26.0/dist/DPlayer.min.css">
</head>
<body>
    <div id="dplayer"></div>
    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script src="https://cdn.jsdelivr.net/npm/dplayer@1.26.0/dist/DPlayer.min.js"></script>
    <script>
        new DPlayer({
            container: document.getElementById('dplayer'),
            video: {
                url: '.m3u8文件url',
                type: 'hls'
            }
        });
    </script>
</body>
</html>

3,效果图
在这里插入图片描述

四、上传视频

1,前端代码

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="/static/layui/css/layui.css">
</head>
<body>
<button type="button" class="layui-btn" id="uploadVideo">
  <i class="layui-icon">&#xe67c;</i>上传视频
</button>

<script src="/static/layui/layui.js"></script>
<script>
layui.use('upload', function(){
  const upload = layui.upload;
  
  // 视频上传配置
  upload.render({
    elem: '#uploadVideo',
    url: '接口url',
    accept: 'video',  // 限制视频类型
    size: 1024 * 1024 * 1024,  // 最大1GB
    exts: 'mp4|avi|mov|mkv',  // 允许格式
    progress: function(n){
      console.log('上传进度:' + n + '%');
    },
    done: function(res){
      if(res.code === 0) {
        layer.msg('上传成功');
        console.log('视频路径:', res.data.src);
      } else {
        layer.msg(res.msg || '上传失败');
      }
    },
    error: function(){
      layer.msg('上传异常');
    }
  });
});
</script>
</body>
</html>

2,后端代码

引用类库

use think\facade\Filesystem;
use think\exception\FileException;

代码片段

//上传视频
     public function upload()
    {
        
        try {
            // 获取上传文件对象
            $file = request()->file('file');
            
            // 验证规则(安全关键)
            $validate = [
                'fileSize' => 1024 * 1024 * 1024, // 1GB
                'fileExt'  => 'mp4,avi,mov,mkv,flv,wmv',
                'fileMime' => 'video/mp4,video/avi,video/quicktime' // MIME类型验证
            ];
            
            // 保存文件
            $saveName = Filesystem::disk('public')
                ->putFile('videos', $file, 'md5');
                
            // 生成访问路径
            $savePath = request()->domain() . '/storage/' . $saveName;
            
            return json([
                'code' => 0,
                'msg'  => '上传成功',
                'data' => ['src' => $savePath]
            ]);
            
        } catch (FileException $e) {
            return json(['code' => 1, 'msg' => $e->getMessage()]);
        }
    }

3,上传结果

在这里插入图片描述
上传的视频存到对应的文件夹里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

26.【新型数据架构】-零ETL架构

26.【新型数据架构】-零ETL架构:减少数据移动,原系统直接分析;典型实现(AWS Zero-ETL) 一、零ETL的本质:从“数据搬运工”到“数据翻译官” 传统ETL(Extract-Transform-Load)需要将数据从源系统抽取、清洗、转换后加载到目标系统,这一过程往往耗时费力,且面临数据延…

静态相机中的 CCD和CMOS的区别

文章目录 CCD处理方式CMOS处理方式两者区别 首先根据 成像原理&#xff0c;CCD和CMOS的作用是一致的&#xff0c;都是为了将光子转化为数字图像&#xff0c;只是 转换的方式出现差异。 CCD处理方式 获取光子&#xff1a; 在电荷耦合器件&#xff08;CCD&#xff09;传感器中…

bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))

1.如图 2.分析 关键报错提示&#xff1a; undefined is not iterable (cannot read property Symbol(Symbol.iterator)) 直译&#xff1a; undefined是不可迭代的&#xff08;不能读取属性Symbol(Symbol.iterator)&#xff09; 理解&#xff1a; 有一个值、不存在&#x…

机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战

一、什么是支持向量机&#xff08;SVM&#xff09; 1. 基本概念 1.1 二分类问题的本质 在机器学习中&#xff0c;分类问题是最常见的任务之一。最简单的情况就是二分类&#xff1a;比如一封邮件是“垃圾邮件”还是“正常邮件”&#xff1f;一个病人是“患病”还是“健康”&a…

LLM Agent 如何颠覆股价预测的传统范式

写在前面 股价预测,金融领域的“圣杯”之一,吸引了无数研究者和投资者。传统方法从技术指标到复杂的计量经济模型,再到机器学习,不断演进,但市场的高度复杂性、非线性和充斥噪声的特性,使得精准预测依然是巨大的挑战。大型语言模型(LLM)的崛起,特别是LLM Agent这一新…

【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台

随着工业领域数字化进程的持续加快&#xff0c;Web 技术在实现实时监控、数据可视化与控制系统等方面正扮演着越来越核心的角色。来自智利的科技企业 Wise Data Global 就是这一趋势中的积极践行者。他们借助慧都科技代理的 DHTMLX Suite JavaScript UI 控件库&#xff0c;为遥…

Skia如何绘制几何图形

应用程序&#xff08;网页、桌面应用或移动应用&#xff09;大多数都是由基本的几何图形构成的。那我们该如何使用 Skia 绘制基本的几何图形。 画矩形 void drawRect(SkCanvas* canvas) {SkPaint paint;paint.setColor(SK_ColorRED);paint.setStroke(true);paint.setStrokeWid…

spring:实例化类过程中方法执行顺序。

如题。在实例化Bean时&#xff0c;会根据配置依次调用方法。在此测试代码如下&#xff1a; 在测试类中继承接口InitializingBean&#xff0c;接口InterfaceUserService&#xff08;该接口为自定义&#xff0c;只是定义set方法&#xff09;。 InterfaceUserService&#xff0c…

设置应用程序图标

(1)找一张图片 (2)然后转ico图片 在线生成透明ICO图标——ICO图标制作 验证16x16就可以 降低exe大小 (3) 在xxx.pro修改 添加 &#xff08;4&#xff09; 删除 build 和 xxxpro_user文件 (5)编译project 和运行xx.exe (6)右键 设置快捷方式

「基于连续小波变换(CWT)和卷积神经网络(CNN)的心律失常分类算法——ECG信号处理-第十五课」2025年6月6日

一、引言 心律失常是心血管疾病的重要表现形式&#xff0c;其准确分类对临床诊断具有关键意义。传统的心律失常分类方法主要依赖于人工特征提取和经典机器学习算法&#xff0c;但这些方法往往受限于特征选择的主观性和模型的泛化能力。 随着深度学习技术的发展&#xff0c;基于…

用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包

在追求高性能的分布式系统中&#xff0c;RPC 框架的底层网络能力和数据传输效率起着决定性作用。经过几轮迭代优化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;这一版本的最大亮点在于 重写了底层网络框架 和 实现了发送端的数据聚集机制&#xff0c;这…

OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务

公共资源速递 2 个公共数据集&#xff1a; * s1K-1.1 数学推理数据集 * HPA 人类蛋白质图谱数据集 3 个公共模型&#xff1a; * MedGemma-4B-IT * Devstral-Small-2505 * DeepSeek-Prover-V2-7B 12 个公共教程&#xff1a; 视频生成 * 2 语音交互 * 3 代码生成 * 3 …

4D毫米波雷达产品推荐

供应商链接 &#xff1a;https://mp.weixin.qq.com/s/GYarrc9VEZS0FafxRUeG9w 大陆 ARS548 采埃孚 博世 安波福 -------- Waymo MobileEye 华为&#xff08;未找到官网资料&#xff09; ------- 森思泰克 http://www.whst.com/contact.html 芜湖经济技术开发区东区…

yolo 训练 中间可视化

yolo训练前几个batch&#xff0c;会可视化target: if plots and ni < 33:f save_dir / ftrain_batch{ni}.jpg # filenameplot_images(imgs, targets, paths, f, kpt_labelkpt_label)

Rust 学习笔记:关于 Cargo 的练习题

Rust 学习笔记&#xff1a;关于 Cargo 的练习题 Rust 学习笔记&#xff1a;关于 Cargo 的练习题问题一问题二问题三问题四问题五问题六问题七 Rust 学习笔记&#xff1a;关于 Cargo 的练习题 参考视频&#xff1a; https://www.bilibili.com/video/BV1xjAaeAEUzhttps://www.b…

光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)

光伏功率预测 | BiLSTM多变量单步光伏功率预测&#xff08;Matlab完整源码和数据&#xff09; 目录 光伏功率预测 | BiLSTM多变量单步光伏功率预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 光伏功率预测 | BiLSTM多变…

20250606-C#知识:委托和事件

C#知识&#xff1a;委托和事件 使用委托可以很方便地调用多个方法&#xff0c;也方便将方法作为参数进行传递 1、委托 委托是方法的容器委托可以看作一种特殊的类先定义委托类&#xff0c;再用委托类声明委托变量&#xff0c;委托变量可以存储方法 delegate int Calculate(in…

AI数字人技术革新进行时:井云数字人如何重塑人机交互未来?

老板们注意了&#xff01;不用反复真人出镜拍摄&#xff0c;AI数字人来帮你做口播&#xff0c;只需3分钟克隆你的形象和声音&#xff0c;输入文案24小时随时都能生成视频&#xff01; 在元宇宙概念持续升温、虚拟与现实加速融合的当下&#xff0c;AI数字人正以惊人的速度从科幻…

ruoyi-plus-could 负载均衡 通过 Gateway模块配置负载均衡

这个很简单的&#xff0c;其实都不用配置。 在nacos中ruoyi-gateway.yml配置文件里面&#xff1a; 其实他已经给我们配置好了&#xff0c;只要uri&#xff1a;lb有【lb】就表示负载均衡配置 我们只需要在启动服务的时候改下端口就可以。 然后通过小工具测试下&#xff1a; 结…

Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!

Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xff01; 目录 Matlab回归预测大合集又更新啦&#xff01;新增2种高斯过程回归预测模型&#xff0c;已更新41个模型&#xff01;性价比拉满&#xf…