系统架构
Monibuca V6 是一个使用 Rust 编写的高性能流媒体服务器引擎。本文介绍其整体架构设计。
交互式架构图
Section titled “交互式架构图”┌─────────────────────────────────────────────────────────────────┐│ 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/,负责流媒体引擎的底层数据结构和处理逻辑:
| 模块 | 文件 | 职责 |
|---|---|---|
| buffer | buffer.rs | Lock-free SPMC 环形缓冲区,用于帧存储 |
| frame | frame.rs | AVFrame 音视频帧数据结构 |
| track | track.rs | 音视频轨道管理(VideoTrack / AudioTrack) |
| publisher | publisher.rs | 推流者,管理轨道和订阅者列表 |
| subscriber | subscriber.rs | 订阅者,从 RingBuffer 消费帧数据 |
| dispatcher | dispatcher.rs | 帧分发器,单次读取广播到所有订阅者 |
| pool | pool.rs | 对象池(BytesPool、ObjectPool、ThreadLocal 池) |
| task | task.rs | 分层任务系统,支持层级取消 |
| proxy | proxy.rs | 拉流/推流代理(Pull Proxy / Push Proxy) |
| recorder | recorder.rs | 流录制框架(FLV / MP4 / fMP4 / HLS) |
| transformer | transformer.rs | 流转换器(订阅源流 → 处理 → 发布新流) |
| playback | playback.rs | 回放速度控制和时间戳缩放 |
| storage | storage.rs | 异步存储 trait(io_uring ready) |
Crate 结构
Section titled “Crate 结构”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/ └── ...Crate 依赖关系
Section titled “Crate 依赖关系”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
插件系统架构
Section titled “插件系统架构”Monibuca V6 支持三种插件加载模式:
| 模式 | Feature Flag | 特点 |
|---|---|---|
| 静态编译 | static-plugins | 编译时链接,性能最优,默认模式 |
| 动态加载 | dynamic-plugins | .so/.dylib/.dll 运行时加载 |
| WASM 沙箱 | — | 隔离运行,安全性最高 |
静态插件通过 Cargo Feature Flags 选择性编译:
[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 |
| 并发哈希表 | DashMap | lock-free 流注册表 |
| 原子指针交换 | ArcSwap | 无锁 IDR 列表、订阅者列表 |
| QUIC 传输 | Quinn | WebTransport / QUIC 协议支持 |
| 零拷贝字节 | Bytes | 帧数据零拷贝共享 |
| WebRTC | rustrtc | WebRTC 协议栈 |
| gRPC | Tonic | API 服务 |
| 数据库 | SQLx | 录制索引、配置持久化 |
| 序列化 | Serde + serde_json/serde_yaml | 配置和 API 数据格式 |
性能设计原则
Section titled “性能设计原则”- Lock-free 优先: RingBuffer 的写操作使用
fetch_add原子指令,读操作通过ArcSwap实现无锁访问 - 零拷贝: 帧数据通过
Arc<AVFrame>共享,订阅者之间不复制数据 - 单次读取广播: Dispatcher 只从 RingBuffer 读取一次帧数据,然后广播给所有订阅者
- 背压控制: 使用 bounded channel,慢速订阅者丢帧而不阻塞其他订阅者
- 对象池复用: BytesPool 和 ThreadLocal 池减少热路径上的内存分配
联系我们
微信公众号:不卡科技
腾讯频道:流媒体技术
QQ 频道:p0qq0crz08
QQ 群:751639168