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

宝塔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,  // 最大1GBexts: '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.pswp.cn/pingmian/83845.shtml

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

相关文章

Android 轻松实现 增强版灵活的 滑动式表格视图

表格视图组件&#xff0c;支持&#xff1a; 1. 无标题模式&#xff1a;只有数据行也可以正常滑动 2. 两种滑动模式&#xff1a;固定第一列 或 全部滑动 3. 全面的样式自定义能力 4. 智能列宽计算 1. 无标题模式支持 设置无标题&#xff1a;调用 setHeaderData(null) 或 …

【Python进阶】元类编程

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…

DeepSeek模型性能优化:从推理加速到资源调度的全栈实践

引言 在生产环境中部署DeepSeek模型时,性能优化直接关系到服务质量和运营成本。本文将深入探讨从芯片级优化到分布式调度的全栈性能提升方案,涵盖计算图优化、内存管理、批处理策略等关键技术,并分享在千万级QPS场景下的实战经验,帮助工程团队突破性能瓶颈,实现成本与效能…

Ctrl+R 运行xxx.exe,发现有如下问题.

CtrlR 运行xxx.exe,发现有如下问题. (1)找不到Qt5Core.all,Qt5Cored.dll,Qt5Gui.dll,Qt5Guid.dll,Qt5Widgets.all,Qt5Widgetsd.dll? (2)之后找不到libwinpthread-1.dll 从这个目录拷贝相应的库到运行xx.exe目录下 方法二:将库路径添加到系统PATH环境变量里: 在Path中添加路…

硅基计划2.0 学习总结 陆 抽象类与接口

文章目录 一、抽象类1. 定义2. 示例代码3. 特性 二、接口初识1. 定义2. 命名与语法3. 示例代码4. 常见特性5. 多接口实现6. 接口的继承 三、Object类初识1. equals方法2. hascode方法 一、抽象类 1. 定义 请你假设这样一个场景&#xff0c;我们定义一个人的类&#xff0c;这个…

Linux命令基础(2)

su和exit命令 可以通过su命令切换到root账户 语法&#xff1a;su [-] 用户名 -符号是可选的&#xff0c;表示是否在切换用户后加载环境变量&#xff0c;建议带上 参数&#xff1a;用户名&#xff0c;表示要切换的用户&#xff0c;用户名可以省略&#xff0c;省略表示切换到ro…

C++算法训练营 Day10 栈与队列(1)

1.用栈实现队列 LeetCode&#xff1a;232.用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x)将元素x推到队列的末尾 int pop(…

设计模式域——软件设计模式全集

摘要 软件设计模式是软件工程领域中经过验证的、可复用的解决方案&#xff0c;旨在解决常见的软件设计问题。它们是软件开发经验的总结&#xff0c;能够帮助开发人员在设计阶段快速找到合适的解决方案&#xff0c;提高代码的可维护性、可扩展性和可复用性。设计模式主要分为三…

【QT】自定义QWidget标题栏,可拖拽(拖拽时窗体变为normal大小),可最小/大化、关闭(图文详情)

目录 0.背景 1.详细实现 思路简介 .h文件 .cpp文件 0.背景 Qt Linux&#xff1b;项目遇到问题&#xff0c;解决后特此记录 项目需要&#xff0c;个性化的标题栏&#xff08;是个widget&#xff09;&#xff0c;在传统的三个按钮&#xff08;最大化、最小化、关闭&#xf…

如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)

背景 在实际项目开发中&#xff0c;依赖的三方库&#xff08;如 element-plus&#xff09;难免会遇到 bug。有时候官方虽然已经修复&#xff0c;但新版本升级成本高&#xff0c;或者有兼容性风险。这时&#xff0c;给依赖打补丁是最优雅的解决方案之一。 本文以 element-plus…

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…

优化电脑的磁盘和驱动器提高电脑性能和延长硬盘寿命?

磁盘优化 磁盘清理&#xff1a; 使用系统自带的磁盘清理工具&#xff08;如Windows的“磁盘清理”&#xff09;删除不必要的文件。清空回收站。删除临时文件和缓存。 磁盘碎片整理&#xff08;针对机械硬盘&#xff09;&#xff1a; 定期进行磁盘碎片整理&#xff0c;以提高文…

EDA断供危机下的冷思考:中国芯片设计软件的破局之道优雅草卓伊凡

EDA断供危机下的冷思考&#xff1a;中国芯片设计软件的破局之道优雅草卓伊凡 一、EDA是什么&#xff1f;芯片行业的”隐形基石” 1.1 EDA技术解析 EDA&#xff08;Electronic Design Automation&#xff0c;电子设计自动化&#xff09;是用于设计和验证集成电路的软件工具链…

Jpackage

简介 jpackage - 用于打包自包含 Java 应用程序的工具&#xff0c;是 JDK 14 引入的一个工具。 该工具将 Java 应用程序和 Java 运行时映像作为输入&#xff0c;并生成包含所有必要依赖项的 Java 应用程序映像。它将能够生成特定于平台的格式的本机包&#xff0c;例如包括打包 …

CRM管理软件的数据可视化功能使用技巧:让数据驱动决策

在当今数据驱动的商业环境中&#xff0c;CRM管理系统的数据可视化功能已成为企业优化客户管理、提升销售效率的核心工具。据企销客研究显示&#xff0c;具备优秀可视化能力的CRM系统&#xff0c;用户决策效率可提升47%。本文将深入解析如何通过数据可视化功能最大化CRM管理软件…

智慧充电:新能源汽车智慧充电桩的发展前景受哪些因素影响?

全球能源结构转型与碳中和目标的推进&#xff0c;新能源汽车产业迎来爆发式增长&#xff0c;而智慧充电桩作为其核心基础设施&#xff0c;发展前景备受关注。智慧充电不仅关乎用户充电体验的优化&#xff0c;更是电网平衡、能源效率提升的关键环节。 然而&#xff0c;其发展并…

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…

多模态大语言模型arxiv论文略读(105)

UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文标题&#xff1a;UnifiedMLLM: Enabling Unified Representation for Multi-modal Multi-tasks With Large Language Model ➡️ 论文作者&#xff1a;Zhaowei…

SQLServer中的存储过程与事务

一、存储过程的概念 1. 定义 存储过程&#xff08;Stored Procedure&#xff09;是一组预编译的 SQL 语句的集合&#xff0c;它们被存储在数据库中&#xff0c;可以通过指定存储过程的名称并执行来调用它们。存储过程可以接受输入参数、输出参数&#xff0c;并且可以返回执行…

使用UDP连接ssh

使用UDP连接ssh mosh简介两端安装moshWindows安装mosh 放行端口使用mosh登录Linuxdebug mosh简介 Mosh最大的特点是基于UDP方式传输&#xff0c;支持在服务端创建一个临时的Key供客户端一次性连接&#xff0c;退出后失效&#xff1b;也支持通过SSH的配置进行认证&#xff0c;但…