视频存储开源方案

项目成熟度

GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform

GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license.

GitHub - seaweedfs/seaweedfs: SeaweedFS is a fast distributed storage system for blobs, objects, files, and data lake, for billions of files! Blob store has O(1) disk seek, cloud tiering. Filer supports Cloud Drive, cross-DC active-active replication, Kubernetes, POSIX FUSE mount, S3 API, S3 Gateway, Hadoop, WebDAV, encryption, Erasure Coding.

项目 GitHub Star 数量(截至 2025 年 5 月) 贡献者数量 初始发布时间 主要开源协议
Ceph ≈15.0K(稳定增长,社区成熟)410 1172+ 2010 年 LGPL
MinIO ≈52.7K(快速增长,高人气)58 421+ 2014 年 GNU AGPL v3
SeaweedFS ≈24.2K(中等增速,技术优势驱动)39 146+ 2015 年 Apache-2.0

功能区别

对比维度 Ceph MinIO SeaweedFS
功能定位 统一存储(对象、块、文件) 专注对象存储(100% S3兼容) 专注对象存储(支持小文件优化,兼顾大文件)
适用场景 超大规模、多协议需求(混合云、实时处理) 中小规模、云原生、单一对象存储需求 高并发读写、海量小文件场景(如日志、图片),也可用于大文件存储
性能 依赖硬件和调优(如SSD加速),多协议负载均衡 高吞吐量,适合大文件(MP4)的并发读写 高吞吐低延迟,支持并行读写(通过Volume服务器分散负载)
数据冗余 支持多副本或纠删码,跨数据中心容灾 纠删码(默认),容错能力高(半数节点故障容忍) 支持纠删码和复制策略,容错灵活(可自定义副本数)
部署复杂度 复杂(需配置Monitor/OSD/MDS等组件) 简单(单文件或容器化部署) 较简单(Master+Volume架构,单机或分布式一键部署)
运维成本 高(依赖专业团队调优) 低(自动化管理,Web界面监控) 中等(需管理Master节点,但组件轻量)
扩展性 动态扩容(在线添加节点,自动平衡数据) 静态扩容(需手动添加节点,扩展期间可能影响性能) 动态扩容(可添加Volume节点,自动分配数据)
生态兼容性 多协议支持(与OpenStack/Kubernetes集成) 无缝兼容S3生态(AWS CLI/SDK等) 兼容S3(部分API支持),提供Filer网关扩展文件系统接口
硬件成本 高(需高性能硬件支撑多协议负载) 低(普通硬件即可满足) 极低(轻量级设计,普通硬件高效运行)
一致性模型 强一致性(数据立即可用) 最终一致性(大规模并发时可能延迟) 最终一致性(默认),可配置强一致性
单点风险 无(分布式架构无中心节点) 无(分布式架构无中心节点) 依赖Master节点(需部署多Master避免单点故障)
选型建议 超大规模、多协议、强一致性需求 中小规模、轻量级、S3兼容需求 高并发读写、海量文件存储、低成本场景

总结

  • MinIO 适合 S3 兼容和快速交付;

  • Ceph 适合复杂企业级需求;

  • SeaweedFS 适合高并发、低成本场景,需注意 Master 节点的高可用设计。

MinIO C++ SDK

MinIO C++ SDK 是简单存储服务(又名 S3)客户端,用于对任何 Amazon S3 兼容的对象存储服务执行存储桶和对象作。使用时需遵循 Apache License 2.0 协议。商用时的具体要求:

  • 保留版权声明和许可证声明 :在软件的文档和源代码中,必须保留原始的版权声明和许可证声明。这是对原作者权益的基本尊重,也是确保软件合法使用的重要依据。

  • 明确专利授权 :如果软件中包含了贡献者的专利技术,Apache License 2.0 要求明确专利授权,但不对专利授权的范围做出限制,贡献者向用户提供良好的法律保障。

  • 免责声明 :提供代码的组织或个人应提供免责声明,说明本软件只用于非商业性质的个人学习、研究或其他非商业活动。

除了 MinIO 服务器外,还兼容以下对象存储服务:

存储服务 说明
Amazon S3 最知名的云存储服务,提供高扩展性和耐用性。
阿里云 OSS 阿里云的对象存储服务,适合大规模数据存储。
腾讯云 COS 腾讯云的对象存储服务,支持多种数据存储场景。
华为云 OBS 华为云的对象存储服务,提供高性能和高可靠性的存储。
Google Cloud Storage Google 提供的云存储服务,与 S3 兼容。
IBM Cloud Object Storage IBM 的云存储服务,支持多种数据存储需求。

MinIO C++ SDK 的兼容性基于其对 Amazon S3 协议的实现,因此任何支持该协议的对象存储服务理论上都可以与 MinIO C++ SDK 配合使用。

版本和依赖项

MinIO C++ SDK 目前的版本为 0.3.0,需要:

  • C++17 编译器支持

  • CMake 3.10 或更高版本(用于建筑)

  • vcpkg 包管理器(建议用于依赖项管理)

关键依赖项包括:

Library 目的
curlpp HTTP communication
openssl 加密和 TLS 支持
nlohmann-json JSON parsing
pugixml XML parsing
inih 配置解析
zlib 压缩(Windows 平台)

核心功能

桶操作相关

存储桶作允许您在与 S3 兼容的存储中创建、列出、检查是否存在和删除存储桶。存储桶充当对象的容器,并提供一种组织和控制对数据的访问的方法。

操作 描述 方法
生成存储桶 创建新存储桶 Client::MakeBucket
列出存储桶 列出经过身份验证的用户的所有存储桶 Client::ListBuckets
存储桶存在 检查存储桶是否存在 Client::BucketExists
删除存储桶 删除空存储桶 Client::RemoveBucket

其他存储桶操作

SDK 还支持用于管理 Bucket 配置的作:

  • 存储桶策略 :使用 和 控制对存储桶和对象的访问GetBucketPolicy``SetBucketPolicy

  • 存储桶加密 :使用 和 管理服务器端加密设置GetBucketEncryption``SetBucketEncryption

  • 存储桶生命周期 :使用 和 定义对象生命周期规则GetBucketLifecycle``SetBucketLifecycle

  • 存储桶通知 :使用 和 配置事件通知GetBucketNotification``SetBucketNotification

  • 存储桶标记 :将元数据标签分配给具有 和 的存储桶GetBucketTags``SetBucketTags

  • 存储桶版本控制 :使用 和 启用和配置对象版本控制GetBucketVersioning``SetBucketVersioning

  • 存储桶复制 :使用 和 配置跨区域复制GetBucketReplication``SetBucketReplication

对象操作相关

对象作提供了上传、下载、复制和管理存储桶中的对象(文件)的核心功能。

操作 描述 方法
放置对象 将对象上传到存储桶 Client::PutObject
获取对象 下载带有 callback 的对象以进行数据处理 Client::GetObject
下载对象 将对象下载到本地文件 Client::DownloadObject
上传对象 将本地文件作为对象上传 Client::UploadObject
复制对象 将对象从一个位置复制到另一个位置 Client::CopyObject
Stat 对象 检索对象元数据 Client::StatObject
删除对象 删除单个对象 Client::RemoveObject
移除对象 在单个请求中删除多个对象 Client::RemoveObjects
列出对象 列出支持迭代的存储桶中的对象 Client::ListObjects

高级功能

  • 大文件的分段上传

  • 对象保留和依法保留

    • 对象保留是一种机制,可以防止对象在指定时间段内被删除或修改。

    • 依法保留是一种独立于时间的保护机制,无论保留期是否到期,都无法删除对象。

  • 服务器端加密

  • 预签名 URL

  • 存储桶通知

    • 允许您实时监听存储桶中发生的事件,当对象被创建、删除或访问时,系统会发送通知
  • 选择对象内容(查询对象)

对象分段

允许将大型对象分成较小的部分,以实现更高效、更可靠的上传。**MinIO C++ SDK 本身未明确提供自动重传的接口,但可以通过编程逻辑实现重传功能。**例如,在上传文件时,如果出现网络错误等异常情况,可以在代码中捕获异常并重新发起上传请求。

操作 描述 方法
创建分段上传 启动分段上传并返回上传 ID Client::CreateMultipartUpload
上传 Part 在分段上传中上传段 Client::UploadPart
完成分段上传 通过组装之前上传的段来完成分段上传 Client::CompleteMultipartUpload
Abort Multipart Upload 中止分段上传并释放所有资源 Client::AbortMultipartUpload

选择对象内容(查询对象)

支持使用 SQL 表达式从对象中检索数据子集。

S3 Select 功能 :允许用户使用 SQL 语法查询存储在 MinIO 中的 CSV、JSON 或 Parquet 格式对象。通过 SQL 类型的语句实现高效的文件内容检索。例如,可以查询 CSV 文件中特定列的值,或者从 JSON 文件中提取符合条件的数据。

使用场景:结合 Elasticsearch 在上传文件到 MinIO 时,将文件的元数据和内容摘要同步到 Elasticsearch 中创建索引。这样可以通过 Elasticsearch 的全文搜索功能实现更灵活和高效的查询,尤其适用于需要复杂搜索逻辑的场景

核心功能总结

客户端 API 提供了一组全面的作来管理存储桶和对象。下表列出了主要操作:

类别 描述
存储桶作 创建新存储桶
列出所有存储桶
检查存储桶是否存在
删除存储桶
对象作 上传对象
下载对象
获取对象元数据
删除对象
列出存储桶中的对象
复制对象
将文件作为对象上传
将对象下载到文件
删除多个对象
Multipart 启动分段上传
上传对象的一部分
完成分段上传
中止分段上传
特殊作 使用 SQL 查询对象内容
获取存储桶事件的通知
通过组合其他对象来创建对象

流媒体特别功能

HTTP-Range支持 :MinIO通过HTTP-Range请求实现音视频的在线拉流播放与进度条拖拽功能。当用户在播放器中拖动进度条时,浏览器会向MinIO服务端发送一条包含Range字段的Http-Request请求,指定当前请求视频进度的开始字节数及缓存结束字节数。MinIO根据收到的请求范围返回相应的数据,从而使播放器能够快速定位到指定位置进行播放,实现了进度条的精准拖拽。

多版本支持 :MinIO支持多版本的功能,这在处理多媒体文件时非常有用。例如,当需要对视频进行编辑或修复时,用户可以基于原始文件的不同版本进行操作,而不用担心破坏原有的数据,同时也便于在出现问题时快速回滚到之前的状态。

MinIO实现短视频对象存储与点播案例

笔者团队使用MinIO对象存储作为底层存储,开发部署短视频点播地址映射、地址动态代理等服务,实现一套短视频存储点播平台。其实现框架如下图:

点播平台大致可分为存储层、服务层与应用层。存储层主要部署MinIO对象存储系统及关系数据库,MinIO用来存储视频对象,关系数据库用来存储视频元数据;服务层提供各类存储访问服务接口,如文件上传下载、视频播放地址生成、对象地址映射等;应用层为前端提供应用功能,包括视频上传、查询、播放等功能。

基于MinIO对象存储的点播平台数据访问流程如下图所示:

**1)视频上传与转码,**统一采用mp4格式作为视频存储和点播格式,为了兼容多种格式视频文件上传,需开发转码模块将其转码成mp4格式进行存储,将其首先存入本地磁盘缓存。

**2)直播录制,**在直播的过程中开启录制,将录制的文件首先存入本地磁盘缓存。

**3)上传文件,**视频转码完成或录制完成后,调用MinIO文件上传接口,将视频文件上传至MinIO集群/联邦,由etcd对MinIO集群提供注册发现服务。

**4)点播地址映射,**服务端部署点播地址映射服务模块,实现MinIO视频点播地址与视频ID的映射,使存储介质的改变不影响视频点播拉流。

**5)地址动态代理服务,**出于系统安全性考虑,我们不希望暴露MinIO存储地址与存储细节,希望增加一层网关进行媒体流的转发或地址的代理,对外提供统一的服务地址,使用地址动态代理,可以根据点播请求的视频ID不同,动态代理至不同的视频播放地址,实现视频存储细节与服务地址的解耦。

**6)拉流播放,**客户端或浏览器使用HTTP协议流式拉取视频文件并播放。

缺点

内置不含重连重传,需在应用层捕获异常重新请求。

基于 MinIO 对象存储框架的短视频点播平台设计-CSDN博客

ffmpeg拉取minio里的视频文件 - CSDN文库

【minio】Ubuntu安装MinIO文件服务器并通过C++上传下载_minio c++-CSDN博客

基于 MinIO 对象存储框架的短视频点播平台设计_腾讯新闻

相关推荐
ajassi200036 分钟前
开源 Linux 服务器与中间件(七)数据库--MySQL
linux·服务器·数据库·ubuntu·开源
Damon小智1 小时前
RedPlayer 视频播放器在 HarmonyOS 应用中的实践
音视频·harmonyos·鸿蒙·小红书·三方库·redplayer
云雾J视界3 小时前
Linux企业级解决方案架构:字节跳动短视频推荐系统全链路实践
linux·云原生·架构·kubernetes·音视频·glusterfs·elk stack
NocoBase3 小时前
11 个在 GitHub 上最受欢迎的开源无代码 AI 工具
低代码·ai·开源·github·无代码·ai agent·airtable·内部工具·app builder
Likeadust5 小时前
新版视频直播点播平台EasyDSS用视频破局,获客转化双提升
大数据·音视频
HelloGitHub6 小时前
DIY ChatGPT 一周狂揽 27k Star「GitHub 热点速览」
开源·github
涛涛讲AI16 小时前
一段音频多段字幕,让音频能够流畅自然对应字幕 AI生成视频,扣子生成剪映视频草稿
人工智能·音视频·语音识别
lzptouch19 小时前
数据预处理(音频/图像/视频/文字)及多模态统一大模型输入方案
人工智能·音视频
纵有疾風起19 小时前
C++模版:模板初阶及STL简介
开发语言·c++·经验分享·开源
算家计算20 小时前
破5亿用户!国产AI模型成功逆袭,成为AI普及浪潮主角
人工智能·开源·资讯