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

发布于:2025-06-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、 安装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,上传结果

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


网站公告

今日签到

点亮在社区的每一天
去签到