跳转到内容

系统架构

Monibuca V6 是一个使用 Rust 编写的高性能流媒体服务器引擎。本文介绍其整体架构设计。

全屏查看架构图 →

┌─────────────────────────────────────────────────────────────────┐
│ Monibuca Engine │
│ │
│ ┌──────────┐ ┌─────────────────┐ ┌───────────────────┐ │
│ │ Protocol │ │ StreamManager │ │ PluginManager │ │
│ │ Plugins │───▶│ │◀───│ │ │
│ │ (RTMP, │ │ ┌───────────┐ │ │ init / start / │ │
│ │ RTSP, │ │ │ Registry │ │ │ stop / reload │ │
│ │ HLS, │ │ └───────────┘ │ └───────────────────┘ │
│ │ WebRTC, │ │ ┌───────────┐ │ ┌───────────────────┐ │
│ │ SRT...) │ │ │ Lifecycle │ │ │ EngineContext │ │
│ └──────────┘ │ └───────────┘ │ │ (IoC Container) │ │
│ │ ┌───────────┐ │ └───────────────────┘ │
│ │ │ WaitQueue │ │ │
│ │ └───────────┘ │ ┌───────────────────┐ │
│ └────────┬────────┘ │ ConfigManager │ │
│ │ │ (YAML + API) │ │
│ ▼ └───────────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ Stream Instance │ │
│ │ │ │
│ │ Publisher ──▶ RingBuffer ──▶ Dispatcher ──▶ Subs │
│ │ │ │ │ │
│ │ VideoTrack AudioTrack DispatcherPool │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
Publisher(推流端)
StreamManager.create_publisher(stream_path)
├──▶ VideoTrack ──▶ RingBuffer (256 slots, lock-free)
│ │
├──▶ AudioTrack ──▶ RingBuffer (64 slots, lock-free)
│ │
│ ▼
│ Dispatcher / DispatcherPool
│ │ │ │
│ ▼ ▼ ▼
│ Queue 1 Queue 2 Queue N
│ (bounded) (bounded) (bounded)
│ │ │ │
└──▶ WaitQueue ▼ ▼ ▼
(等待列表) Subscriber Subscriber Subscriber
(播放端) (播放端) (播放端)

核心模块位于 src/core/,负责流媒体引擎的底层数据结构和处理逻辑:

模块文件职责
bufferbuffer.rsLock-free SPMC 环形缓冲区,用于帧存储
frameframe.rsAVFrame 音视频帧数据结构
tracktrack.rs音视频轨道管理(VideoTrack / AudioTrack)
publisherpublisher.rs推流者,管理轨道和订阅者列表
subscribersubscriber.rs订阅者,从 RingBuffer 消费帧数据
dispatcherdispatcher.rs帧分发器,单次读取广播到所有订阅者
poolpool.rs对象池(BytesPool、ObjectPool、ThreadLocal 池)
tasktask.rs分层任务系统,支持层级取消
proxyproxy.rs拉流/推流代理(Pull Proxy / Push Proxy)
recorderrecorder.rs流录制框架(FLV / MP4 / fMP4 / HLS)
transformertransformer.rs流转换器(订阅源流 → 处理 → 发布新流)
playbackplayback.rs回放速度控制和时间戳缩放
storagestorage.rs异步存储 trait(io_uring ready)

Monibuca V6 采用 Cargo Workspace 组织代码,拆分为多个独立 crate:

monibuca/ # 主 crate(引擎 + 二进制)
├── src/
│ ├── core/ # 核心数据结构
│ ├── manager/ # StreamManager / PluginManager
│ ├── config/ # 配置管理
│ ├── grpc/ # gRPC API
│ └── room/ # 内置房间服务
├── crates/
│ ├── monibuca-codec/ # codec crate — 编解码 + 枚举 + trait
│ ├── monibuca-sdk/ # SDK crate — 插件开发 SDK
│ ├── monibuca-sdk-macros/ # SDK 过程宏
│ ├── m7s-config-framework/ # 配置框架
│ └── m7s-config-macros/ # 配置框架宏
└── plugins/ # 25 个插件 crate
├── rtmp/
├── rtsp/
├── flv/
├── hls/
├── webrtc/
└── ...
monibuca-codec ◀── 最底层,零依赖其他 monibuca crate
monibuca-sdk ◀── 插件开发的唯一契约层
monibuca (engine) ◀── 主引擎 crate
plugins/* ◀── 各插件只依赖 SDK
  • codec: 定义所有共享类型 — AVFrame、VideoCodec、AudioCodec、VideoFrameType、trait 接口(PublisherApi / SubscriberApi / StreamManagerApi)
  • SDK: 封装 codec 并提供插件注册、HTTP 路由、配置 Schema 等开发工具
  • 主 crate: 引擎实现,包含 StreamManager、Dispatcher、RingBuffer 等核心逻辑
  • plugins/: 各协议和功能插件,仅依赖 SDK crate

Monibuca V6 支持三种插件加载模式:

模式Feature Flag特点
静态编译static-plugins编译时链接,性能最优,默认模式
动态加载dynamic-plugins.so/.dylib/.dll 运行时加载
WASM 沙箱隔离运行,安全性最高

静态插件通过 Cargo Feature Flags 选择性编译:

Cargo.toml
[features]
default = ["static-plugins"]
rtmp = ["dep:plugin-rtmp"]
rtsp = ["dep:plugin-rtsp"]
webrtc = ["dep:plugin-webrtc"]
all-plugins = ["rtmp", "rtsp", "flv", "hls", "webrtc", "srt", ...] # default full set (no rsmpeg)
all-plugins-rsmpeg = ["all-plugins", "rsmpeg"] # full set with FFmpeg library bindings
组件用途
异步运行时Tokio事件驱动并发
互斥锁parking_lot高性能 Mutex / RwLock
并发哈希表DashMaplock-free 流注册表
原子指针交换ArcSwap无锁 IDR 列表、订阅者列表
QUIC 传输QuinnWebTransport / QUIC 协议支持
零拷贝字节Bytes帧数据零拷贝共享
WebRTCrustrtcWebRTC 协议栈
gRPCTonicAPI 服务
数据库SQLx录制索引、配置持久化
序列化Serde + serde_json/serde_yaml配置和 API 数据格式
  1. Lock-free 优先: RingBuffer 的写操作使用 fetch_add 原子指令,读操作通过 ArcSwap 实现无锁访问
  2. 零拷贝: 帧数据通过 Arc<AVFrame> 共享,订阅者之间不复制数据
  3. 单次读取广播: Dispatcher 只从 RingBuffer 读取一次帧数据,然后广播给所有订阅者
  4. 背压控制: 使用 bounded channel,慢速订阅者丢帧而不阻塞其他订阅者
  5. 对象池复用: BytesPool 和 ThreadLocal 池减少热路径上的内存分配

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码