视频存储开源方案

项目成熟度

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(稳定增长,社区成熟)4101172+2010 年LGPL
MinIO≈52.7K(快速增长,高人气)58421+2014 年GNU AGPL v3
SeaweedFS≈24.2K(中等增速,技术优势驱动)39146+2015 年Apache-2.0

功能区别

对比维度CephMinIOSeaweedFS
功能定位统一存储(对象、块、文件)专注对象存储(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 StorageGoogle 提供的云存储服务,与 S3 兼容。
IBM Cloud Object StorageIBM 的云存储服务,支持多种数据存储需求。

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

版本和依赖项

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

  • C++17 编译器支持

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

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

关键依赖项包括:

Library目的
curlppHTTP communication
openssl加密和 TLS 支持
nlohmann-jsonJSON parsing
pugixmlXML 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 本身未明确提供自动重传的接口,但可以通过编程逻辑实现重传功能。例如,在上传文件时,如果出现网络错误等异常情况,可以在代码中捕获异常并重新发起上传请求。

操作描述方法
创建分段上传启动分段上传并返回上传 IDClient::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 对象存储框架的短视频点播平台设计_腾讯新闻

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

典型城市工况数据(Drive Cycle)用于车辆仿真

典型城市工况数据(Drive Cycle)用于车辆仿真 在车辆仿真过程中,使用典型的城市工况数据(Drive Cycle)是评估车辆性能、能耗和排放的关键步骤。以下是一些常用的典型城市工况数据及其来源,这些数据可以帮助…

深度解析新能源汽车结构与工作原理

一、核心系统架构 新能源汽车主要由三大核心系统构成: 电力驱动系统:包含永磁同步电机、电机控制器(MCU)及减速器,采用三合一集成设计实现轻量化。永磁同步电机通过电磁感应原理将电能转化为机械能,其效率可…

跳板问题(贪心算法+细节思考)

首先直接看题&#xff1a; 这题直接贪心其实问题不大&#xff1a; 下面先展示我的一个错误代码&#xff1a; # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…

pgsql 一些用法

要查询PostgreSQL数据库中剩余的磁盘空间&#xff0c;可以使用以下方法&#xff1a; 使用SQL查询函数&#xff1a; 可以通过pg_size_pretty函数来查看数据库的总磁盘使用情况&#xff0c;例如&#xff1a; SELECT pg_size_pretty(pg_database_size(‘your_database_name’)); …

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…

unix的定时任务和quartz和spring schedule的cron表达式区别

一、核心区别对比表 对比项Unix CrontabQuartzSpring Scheduled表达式位数5 位6 位或 7 位6 位秒级支持❌ 不支持&#xff08;最小单位是分钟&#xff09;✅ 支持✅ 支持年字段❌ 无✅ 可选第7位❌ 不支持特殊符号支持较少&#xff08;如 *, ,, -, /&#xff09;很丰富和 Quar…

C++基础算法————递推

C++递推:初学者的进阶之旅 一、引言 在计算机编程的世界里,C++ 以其强大的功能和高效性受到众多开发者的青睐。递推作为一种重要的编程思想,在解决各种复杂问题时发挥着关键作用。对于初学者来说,理解并掌握递推不仅可以提升编程能力,还能培养逻辑思维和问题解决能力。本…

QTabWidget垂直TabBar的图标和文本水平显示

一般情况下,我们可以通过QTabWidget的setTabPosition方法来设置TabBar的位置,比如设置在左边 ui->tabWidget->setTabPosition(QTabWidget::West); 但是此时图标和文字都是垂直的,如果让它们水平显示呢? 一.效果 二.原理 在绘制TabBar时,顺时针旋转90度 三.实现 …

HCIP-AI培养计划,成为新时代AI解决方案架构高级工程师

01 华为认证是什么&#xff1f; 华为认证&#xff08;Huawei Certification&#xff09;是面向数字化时代构建的ICT人才培训与认证体系。 当前超过68万来自全球180多个国家和地区的各行业精英已经取得华为认证&#xff0c;如今全球每年超过10万名学员通过考试获得华为认证。 华…

【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信

文章目录 需求描述创建项目订单系统(生产者)完善配置声明队列下单接口启动服务 物流系统(消费者)完善配置监听队列启动服务 格式化发送消息对象SimpleMessageConverter定义一个对象生产者代码消费者运行程序 JSON定义一个对象生产者代码定义转换器消费者代码运行程序 需求描述 …

OpenGL Chan视频学习-7 Writing a Shader inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也会…

Vue 3.0中复杂状态如何管理

在现代前端应用中&#xff0c;状态管理扮演着至关重要的角色。一个良好的状态管理方案能够&#xff1a; 1. 保持应用数据的一致性和可预测性&#xff1b; 2. 简化组件间的通信和数据共享&#xff1b; 3. 提高代码的可维护性和可测试性&#xff1b; 4. 优化应用性能&#xf…

AGI大模型(33):LangChain之Memory

大多数的 LLM 应用程序都会有一个会话接口,允许我们和 LLM 进行多轮的对话,并有一定的上下文记忆能力。但实际上,模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出。而实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次…

leetcode513. 找树左下角的值:层序遍历中的深度与顺序控制之道

一、题目深度解析与核心诉求 在二叉树的众多问题中&#xff0c;寻找最深层最左节点的值是一个兼具趣味性与代表性的问题。题目要求我们在给定的二叉树中&#xff0c;找到深度最大的那一层中最左边的节点值。如果存在多个最深层&#xff0c;只需返回最左边节点的值即可。 这个…

制作一款打飞机游戏54:子弹编辑UI

今天&#xff0c;我们将继续工作在我们的子弹模式系统上&#xff0c;创建一些简单的子弹&#xff0c;并为其设计用户界面&#xff08;UI&#xff09;。 自动保存功能的重要性 首先&#xff0c;我想提一下自动保存功能。这个功能在编辑器中非常重要&#xff0c;因为我们经常犯…

线程封装与互斥

目录 线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量有两种方法&#xff1a; 销毁互斥量 互斥量加锁和解锁 改进售票系统 互斥量实现原理探究 互斥量的封装 线程互斥 进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共…

【系统设计】2WTPS生产级数据处理系统设计Review

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读与评论&#x1f604;。 目录 反正能用的系统问题分析方案一&#xff1a;简单多…

历年北京理工大学保研上机真题

2025北京理工大学保研上机真题 2024北京理工大学保研上机真题 2023北京理工大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem?classification1 判断身份证校验位是否正确 题目描述 给定一个身份证号码&#xff0c;判断其最后一位校验位是否正确。 如果…

uni-app学习笔记十--vu3综合练习

巩固提升前面学习的知识点,主要涉及下面这方面的运用&#xff1a; 1.v-for运用; 2.v-model双向绑定&#xff1b; 3.confirm确认事件&#xff1b; 4.click点击事件&#xff1b; 5.控制按钮的可点击和不可点击&#xff1b; 6.集合删除和追加元素&#xff0c;获取集合元素的…

AI时代新词-AI芯片(AI - Specific Chip)

一、什么是AI芯片&#xff1f; AI芯片&#xff08;AI - Specific Chip&#xff09;是指专为人工智能&#xff08;AI&#xff09;计算任务设计的芯片。与传统的通用处理器&#xff08;如CPU&#xff09;相比&#xff0c;AI芯片针对深度学习、机器学习等AI应用进行了优化&#x…