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

宝塔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.lryc.cn/news/2402941.html

相关文章:

  • 26.【新型数据架构】-零ETL架构
  • 静态相机中的 CCD和CMOS的区别
  • 【MySQL基础】数据库的备份与还原
  • bug:undefined is not iterable (cannot read property Symbol(Symbol.iterator))
  • 为UE5的Actor添加能够读写姿态的功能
  • 机器学习:支持向量机(SVM)原理解析及垃圾邮件过滤实战
  • LLM Agent 如何颠覆股价预测的传统范式
  • App/uni-app 离线本地存储方案有哪些?最推荐的是哪种方案?
  • 【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
  • Skia如何绘制几何图形
  • spring:实例化类过程中方法执行顺序。
  • 设置应用程序图标
  • 「基于连续小波变换(CWT)和卷积神经网络(CNN)的心律失常分类算法——ECG信号处理-第十五课」2025年6月6日
  • 用go从零构建写一个RPC(4)--gonet网络框架重构+聚集发包
  • OpenBayes 一周速览|TransPixeler 实现透明化文本到视频生成;统一图像定制框架 DreamO 上线,一键处理多种图像生成任务
  • 视频的分片上传,断点上传
  • CSS 性能优化
  • 华为×小鹏战略合作:破局智能驾驶深水区的商业逻辑深度解析
  • 4D毫米波雷达产品推荐
  • yolo 训练 中间可视化
  • Rust 学习笔记:关于 Cargo 的练习题
  • 光伏功率预测 | BiLSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • 20250606-C#知识:委托和事件
  • AI数字人技术革新进行时:井云数字人如何重塑人机交互未来?
  • ruoyi-plus-could 负载均衡 通过 Gateway模块配置负载均衡
  • 江科大读写内部flash到hal库实现
  • Matlab回归预测大合集又更新啦!新增2种高斯过程回归预测模型,已更新41个模型!性价比拉满!
  • 主流 AI IDE 之一的 Cursor 介绍
  • 0x-1 记一次SGA PGA设置失败,重新开库
  • 【科研绘图系列】R语言绘制和弦图(Chord diagram plot)