空大

宝塔Docker部署MinIO上传切片视频教程

文章目录

minio 是一个高性能的对象存储(Object Storage)系统,专为本地化、私有云和混合云环境设计,兼容 Amazon S3 API,并提供高可用性、可扩展性和强安全性。它适用于存储海量非结构化数据,如图片、视频、日志、数据库备份等,尤其适用于大数据、AI/ML 和云原生应用。

要如何利用 minio 来上传视频并且管理视频呢?

🔹 MinIO vs 传统存储

特性 MinIO Amazon S3 Ceph HDFS
API 兼容性 ✅ S3 API 兼容
吞吐量 🚀 高性能 🚀
Kubernetes 兼容
部署方式 🏗️ 轻量级 云端 复杂 复杂
存储效率 💾 纠删码 💾 复制 💾 复制 🏗️ 副本
适用于大数据

安装minio docker

我这边直接用宝塔来做讲解,各位在宝塔界面左侧会看到Docker,先将docker安装好之后,再安装minio容器

安装好之后,我们先介绍一下这个 minio 端口

图中的端口25931是web端口、19002是api端口,这两个端口是对应到 docker的两个端口

端口配置
19002–>9000/tcp
25931–>9001/tcp
MINIO_SERVER_URL http://127.0.0.1:9000
MINIO_BROWSER_REDIRECT_URL http://127.0.0.1:9001

MINIO_BROWSER_REDIRECT_URL 是 MinIO 的界面后台

MINIO_SERVER_URL 是之后要设置给视频的网址

MinIO 后台界面

预设账号跟密码会在你创建minIO Docker 时就会自动帮你创建,因此会有一组预设帐密,如果你要更改帐密,就到 minio 的 docker compose 文件那边修改。

 

假如你想要修改存储路径,到容器编排选择你创建的 minio 容器,针对 .env 文件修改 APP_PATH,如下图:

APP_PATH 路径

 

MINIO_ROOT_USER

MINIO_ROOT_PASSWORD

 

 

MinIO 后台及客户端配置

首先创建一个 Bucket,点选左侧栏的 Buckets,接着点击 Create Bucket

 

创建完之后,就会如下图所示:

 

性能参数配置

在 MinIO 控制台的 CONFIGURATION → API → Advanced 中,设置以下参数:

  • requests_max1000
    • 说明: 允许同时处理 1000 个并发请求(适合中小型免费站点,若服务器性能较弱可降低至 500)。
  • Cors Alloq Origin: 你想要允许的域名
    • 说明: 允许该域名可以访问MinIO底下的文件,可以有效防盗
  • replication_workers2
    • 说明: 设置 2 个复制工作线程(免费站通常无需跨站点复制,此值保持最低即可)。
  • replication_failed_workers1
    • 说明: 设置 1 个失败任务处理线程(仅用于处理极少数复制异常)。

 

使用 mc 客户端上传

MinIO 的 Web 界面可能限制了上传大小(Nginx 影响导致),但 mc 命令行工具可以更高效地上传大文件:

1. 安装 MinIO 客户端 (mc)

如果你的服务器或本地环境没有 mc,可以通过以下方式安装:

curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

2. 配置 MinIO 连接

mc alias set myminio http://127.0.0.1:9000 MinIO容器账号 MinIO容器密码

如果你有绑定域名,127.0.0.1:9000 要改成域名也可以,记得前面加http协仪,容器帐密也可以设置成MinIO创建的user帐密

确认自己创建的user:

mc admin user info myminio admin

 

若你不清楚要如何使用客户端连线,就先输入指令查询:

mc alias list myminio

 

若你有在MinIO后台创建新的User,你也可以更改 AccessKey 跟 SecretKey

mc alias set myminio http://<MinIO服务地址> user账号 user密码

 

设置好客户端连线之后,MinIO就到这边告一段落,我们接着要安装切片工具。

 

FFmpeg 工具

推荐的 CentOS 7 安装 FFmpeg 方法

1. 禁用 libveinmind.repo

首先,/etc/yum.repos.d/ 目录下找到了 libveinmind.repo 编辑该文件并将 enabled=1 改为 enabled=0,目前这个veinmind.tech 已经无法连线,所以不用管他

2. 清理 YUM 缓存

sudo yum clean all
sudo yum makecache

3. 安装 Nux Dextop 仓库

如果你有使用 rpmfusion 却仍然无法安装 ffmpeg,可以使用 Nux Dextop 源(尽管它已停止更新,但在 CentOS 7 仍然可用):

sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

4. 安装 FFmpeg

sudo yum install ffmpeg -y

检查版本

ffmpeg -version

 

备注:如果你觉得版本过旧,不符合你的想要使用到的进阶功能,你可以安装最新的版本

使用 Snap 安装最新 FFmpeg
sudo yum install epel-release -y
sudo yum install snapd -y
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install ffmpeg

检查版本

/snap/bin/ffmpeg -version

 

参数说明:

  • -c:v libx264:使用 H.264 视频编码
  • -preset veryfast -crf 22:优化编码速度和质量
  • -c:a aac -b:a 128k:音频编码
  • -hls_time 1每 1 秒切片(你想要的 1s 切片)
  • -hls_list_size 0:保存所有的 .ts 片段,不自动删除
  • -f hls output.m3u8:输出 HLS 文件

 

切片示范

ffmpeg -i /path/to/video.mp4 \
  -profile:v baseline -level 3.0 \
  -start_number 0 -hls_time 10 -hls_list_size 0 -f hls /path/to/output/video.m3u8

解释

  • -profile:v baseline -level 3.0:适用于低功耗设备(可选)。
  • -start_number 0:切片的编号从 0 开始。
  • -hls_time 10:每个 TS 片段时长 10 秒。
  • -hls_list_size 0:保持完整的 m3u8 列表(不会删除旧片段)。
  • -f hls /path/to/output/video.m3u8:输出 HLS 直播文件。

 

hls_flags delete_segments 是 FFmpeg 的一个选项,用于 删除已生成的 HLS 片段,特别是在生成动态 HLS 流(如直播流)时。

具体功能

当你使用 HLS 切片视频时,FFmpeg 会生成多个 .ts 片段(视频切片)。如果你正在进行一个长时间的流式传输(例如直播),这些 .ts 文件会不断地增加,最终占用大量磁盘空间。

hls_flags delete_segments 的作用是 删除已经不再需要的片段,即只保留最近的一些片段(通常是根据你设定的 -hls_list_size 来控制显示在 m3u8 列表中的片段数量)。这样可以防止旧片段堆积,节省存储空间。

使用场景

  1. 直播:适用于直播流(实时流)。在直播过程中,FFmpeg 会不断生成新的 .ts 文件,同时根据 -hls_list_size 控制 m3u8 文件中列出的片段数。使用 delete_segments 可以删除那些已经不再显示在 m3u8 中的 .ts 文件,避免存储的积累。

  2. 防止存储占用过多空间:如果是连续录制并希望删除旧的片段以节省空间,就可以启用这个选项。

例子

ffmpeg -i input.mp4 -c:v libx264 -hls_time 10 -hls_flags delete_segments -f hls output.m3u8

这条命令会:

  • 每 10 秒切割一个视频片段。
  • 删除已经不再需要的 .ts 文件,减少磁盘空间使用。

delete_segments 主要用于 删除不再需要的 .ts 片段,常用于 实时流媒体需要控制存储空间的情况。如果你是在做点播流或者需要保留所有片段,则不需要这个选项。

 

传送文档

mp4视频切片完之后,会有 m3u8 跟 ts 文档,利用 minIO 客户端来进行复制传送,先查看 bucket 状态:

mc stat myminio/video

我在 video bucket 底下又 create path “hls”,所以我的路径会是 myminio/video/hls

因为刚刚有创建一个 user,我们也绑定了 user,所以我们直接执行以下命令:

mc cp /home/video/hls/video.m3u8 myminio/video/hls/

接着复制 ts

mc cp /home/video/hls/*.ts myminio/video/hls/

 

备注:若复制过程遭遇权限问题,或是ssl问题,输入下面指令进行排查:

mc admin console logs myminio

 

成功之后,应该会跟我一样如下图所示:

 

域名配置

我们利用minIO存储好切片视频之后,需要让文档能够有一个让外部用户访问到的网址,所以需要配置域名,这边最好准备两个二级域名或者两个顶级域名。

我用两个二级域名做示范:

配置 minIO 后台界面登录的域名

配置 播放源地址 的域名

再帮大家复习端口:

端口配置
19002–>9000/tcp
25931–>9001/tcp
箭头左边端口是宿主机端口(就是服务器端口),箭头右边端口是Docker端口,不要搞错。
MINIO_SERVER_URL http://127.0.0.1:9000
MINIO_BROWSER_REDIRECT_URL http://127.0.0.1:9001

MINIO_BROWSER_REDIRECT_URL 是 MinIO 的界面后台

MINIO_SERVER_URL 是之后要设置给视频的网址

如果你有其他Docker正在运行,要记得避免端口冲突,假设你有两个minIO Docker 同时要运行给不同项目,那么你这两个minIO Docker 一定要分类好。

 

回到 minIO 后台的 bucket,需要设定 Anonymous 的权限,为了要让全网访问,所以必须做一些安全上的措施。

点击 Buckets > 点选你的 bucket > 点选 Anonymous > Add Access Rule

prefix 键入:hls/*

Access 选择 readonly

这样设定就可以让全网用户只能访问 hls目录底下的文档,但不包含访问hls目录本身。

 

你现在可以尝试解析你切片好的视频地址,https://你的域名/video/hls/video.m3u8

要注意 bucket 的路径,切片视频地址本身并不包含 /myminio

自动化脚本设计

上传后的 MinIO 存储桶路径结构

video/hls/                     # 存储桶根目录
├── video1_20231001120000/     # 按"原文件名_时间戳"自动创建
│   ├── playlist.m3u8
│   ├── segment_000.ts
│   └── ...
└── video2_20231001120130/
    ├── playlist.m3u8
    └── ...

这边以 Cent OS 7 来举例,我们要先准备依赖包。

1. 安装依赖包(CentOS 特有命令)

安装 inotify-tools

sudo yum install -y inotify-tools

2. 准备存储目录

尽量选择 /home,因为通常服务器 /home 配置的硬盘容量会比较多,或是你可以选择再加装一个全新硬盘当做你的视频存储盘

脚本指令,可以在宝塔计划任务上面添加任务,任务类型选择 shell 脚本。

#!/bin/bash

# 配置区(按需修改)
INPUT_DIR="/home/vod_data"
OUTPUT_DIR="/home/vod_data/processed_hls"
MINIO_BUCKET="myminio/video"   # 对应你的 bucket 名称
SLICE_DURATION=10

# 自动创建目录(仅当不存在时)
sudo mkdir -p "$INPUT_DIR" "$OUTPUT_DIR"
sudo chown -R www:www "$INPUT_DIR" "$OUTPUT_DIR"
sudo chmod -R 755 "$INPUT_DIR" "$OUTPUT_DIR"

# 监控文件新增
inotifywait -m -e close_write --format "%f" "$INPUT_DIR" | while read FILE
do
    if [[ $FILE =~ \.(mp4|mov|mkv)$ ]]; then
        INPUT_PATH="$INPUT_DIR/$FILE"
        BASE_NAME="${FILE%.*}"
        TIMESTAMP=$(date +%Y%m%d%H%M%S)
        
        # 本地临时目录(包含时间戳防冲突)
        LOCAL_OUTPUT="$OUTPUT_DIR/${BASE_NAME}_$TIMESTAMP"
        sudo -u www mkdir -p "$LOCAL_OUTPUT"

        # 切片操作
        sudo -u www ffmpeg -i "$INPUT_PATH" \
            -c:v copy -c:a copy \
            -f hls \
            -hls_time $SLICE_DURATION \
            -hls_playlist_type vod \
            -hls_segment_filename "$LOCAL_OUTPUT/segment_%03d.ts" \
            "$LOCAL_OUTPUT/playlist.m3u8" 2>> "$LOCAL_OUTPUT/ffmpeg.log"

        # MinIO 目标路径(按文件名+时间戳创建层级)
        REMOTE_DIR="$MINIO_BUCKET/hls/${BASE_NAME}_$TIMESTAMP"
        
        # 上传到 MinIO 并检查结果
        if sudo -u www /usr/local/bin/mc cp --recursive "$LOCAL_OUTPUT" "$REMOTE_DIR/"; then
            echo "[$(date)] Success: $FILE → $REMOTE_DIR" >> /var/log/hls_processor.log
            sudo rm -rf "$LOCAL_OUTPUT"  # 清理本地临时文件
        else
            echo "[$(date)] Error: Failed to upload $FILE" >> /var/log/hls_processor.log
        fi
    fi
done

播放测试
访问生成的 playlist.m3u8 URL:http://minio.example.com/video/hls/video1_20251001120000/playlist.m3u8

 

MinIO 作为高性能对象存储解决方案,以 “云原生基因” 和 “极简设计哲学” 脱颖而出。其完全兼容 Amazon S3 API 的特性,无缝衔接 Kubernetes、Spark 等现代云原生生态,成为多云架构的存储中枢。在性能层面,MinIO 凭借分布式架构实现 TB 级吞吐量 和 毫秒级延迟,尤其适合视频、日志等海量非结构化数据存储。

对于开发者,MinIO 的 “一键部署” 和 “零运维” 特性大幅降低使用门槛,内置的版本控制、加密和生命周期策略满足企业级数据治理需求。作为开源项目,其代码透明性和活跃社区更保障了技术自主权。

在视频处理场景中,MinIO 与 FFmpeg 的协同堪称典范:前者提供弹性存储底座,后者专注高效转码,共同构建 低成本、高可控的媒体处理管线。无论是初创团队还是大型企业,MinIO 均是解锁数据价值的优选引擎。

赞(1)
未经允许不得转载:剧搜博客 » 宝塔Docker部署MinIO上传切片视频教程

评论 抢沙发

3 + 2 =