视频存储开源方案

项目成熟度

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 对象存储框架的短视频点播平台设计_腾讯新闻

相关推荐
lqj_本人1 小时前
鸿蒙OS&UniApp 开发支持图片和视频的多媒体展示组件#三方框架 #Uniapp
uni-app·音视频·harmonyos
zhangfeng11331 小时前
绘制音频信号的各种频谱图,包括Mel频谱图、STFT频谱图等。它不仅能够绘制频谱图librosa.display.specshow
音视频
清月电子3 小时前
KT6368A通过蓝牙芯片获取手机时间详细说明,对应串口指令举例
单片机·嵌入式硬件·物联网·智能手机·音视频
flex88887 小时前
一个开源的多播放源自动采集在线影视网站
开源
zhangfeng113310 小时前
通过对音频信号提取梅尔频谱图并转换为对数梅尔频谱图得到的。它的形状主要由以下参数决定 转换成图片 64*64像素
算法·机器学习·音视频
长安链开源社区11 小时前
文档贡献 | 技术文档贡献流程及注意事项(保姆级教程)
开源·web3·区块链
lyitcc11 小时前
moviepy视频添加中文水印
音视频·moviepy·python添加视频水印
远瞻。11 小时前
【论文精读】2024 arXiv --VEnhancer现实世界视频超分辨率(RealWorld VSR)
论文阅读·stable diffusion·音视频·超分辨率重建
todoitbo12 小时前
打造自己的开源组件:如何将 Starter 发布到 Maven Central?
java·开源·maven·starter
如果能编程回忆12 小时前
思澈科技助力Keep Watch Pilot 1:重新定义智能运动手表体验
科技·单片机·物联网·开源