索引
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的两个端口
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_max:
1000
- 说明: 允许同时处理 1000 个并发请求(适合中小型免费站点,若服务器性能较弱可降低至
500
)。
- 说明: 允许同时处理 1000 个并发请求(适合中小型免费站点,若服务器性能较弱可降低至
- Cors Alloq Origin: 你想要允许的域名
- 说明: 允许该域名可以访问MinIO底下的文件,可以有效防盗
- replication_workers:
2
- 说明: 设置 2 个复制工作线程(免费站通常无需跨站点复制,此值保持最低即可)。
- replication_failed_workers:
1
- 说明: 设置 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
列表中的片段数量)。这样可以防止旧片段堆积,节省存储空间。
使用场景:
-
直播:适用于直播流(实时流)。在直播过程中,FFmpeg 会不断生成新的
.ts
文件,同时根据-hls_list_size
控制m3u8
文件中列出的片段数。使用delete_segments
可以删除那些已经不再显示在m3u8
中的.ts
文件,避免存储的积累。 -
防止存储占用过多空间:如果是连续录制并希望删除旧的片段以节省空间,就可以启用这个选项。
例子:
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 后台界面登录的域名

配置 播放源地址 的域名
再帮大家复习端口:
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 后台的 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 均是解锁数据价值的优选引擎。