跳转到内容

插件系统

Monibuca V6 采用插件化架构,所有协议支持和扩展功能都以插件形式实现。引擎本身只提供核心的流管理、帧分发和配置框架,协议编解码和业务逻辑由插件完成。

插件在编译时直接链接到主引擎二进制中。这是默认模式,提供最佳性能。预编译二进制和 Docker 镜像使用此模式,已包含全部官方插件。

优点: 无运行时开销,编译器可跨 crate 优化,LTO 优化效果最好

插件编译为共享库(.so/.dylib/.dll),在运行时加载。

[features]
dynamic-plugins = []

优点: 无需重新编译主程序即可添加/更新插件

适用场景: 需要热更新插件,或由第三方提供插件的部署场景

插件编译为 WebAssembly 模块,在 WASM 运行时中隔离执行。

优点: 最高安全性,插件不能访问主机内存

适用场景: 执行不受信任的第三方插件

Monibuca V6 使用 Feature Flags 精细控制编译内容。预编译二进制默认包含全部插件,可通过配置文件按需启用或禁用。

Feature插件说明
rtmpplugin-rtmpRTMP/RTMPS 推拉流
rtspplugin-rtspRTSP/RTSPS 推拉流
flvplugin-flvHTTP-FLV 拉流
hlsplugin-hlsHLS 切片输出
webrtcplugin-webrtcWebRTC 推拉流
srtplugin-srtSRT 推拉流
webtransportplugin-webtransportWebTransport/QUIC
gb28181plugin-gb28181GB/T 28181 国标设备接入
Feature插件说明
mp4plugin-mp4MP4 录制
snapplugin-snap截图服务
ffmpeg_transcodeplugin-transcodeFFmpeg 转码
logrotateplugin-logrotate日志轮转
debugplugin-debug调试工具
seiplugin-seiSEI 数据注入/提取
crontabplugin-crontab定时任务
reportplugin-report数据上报
mixplugin-mix混流
cryptoplugin-crypto流加密
transcode内置 Opus↔AAC 转码(codec crate feature)
Feature插件说明
onvifplugin-onvifONVIF 设备发现与管理
v4l2plugin-v4l2V4L2 摄像头采集(Linux)
alsaplugin-alsaALSA 音频采集(Linux)
homekitplugin-homekitHomeKit 相机模拟
Feature插件说明
liveplugin-live直播间
meetingplugin-meeting会议室
内置 room房间服务(引擎内置,非插件)
Feature插件说明
clusterplugin-cluster集群部署
auth认证鉴权
licenseLicense 管理

预编译版本和 Docker 镜像已包含以上全部插件。通过配置文件中的 enable: true/false 按需启用:

config.yaml
rtmp:
enable: true
rtsp:
enable: true
webrtc:
enable: true
hls:
enable: false # 不需要的插件设为 false

Monibuca V6 共有 25 个独立插件 crate,加上 1 个内置房间服务:

plugins/
├── 协议类 (8)
│ ├── rtmp/ RTMP/RTMPS
│ ├── rtsp/ RTSP/RTSPS
│ ├── flv/ HTTP-FLV
│ ├── hls/ HLS
│ ├── webrtc/ WebRTC
│ ├── srt/ SRT
│ ├── webtransport/ WebTransport
│ └── gb28181/ GB/T 28181
├── 功能类 (10)
│ ├── mp4/ MP4 录制
│ ├── snap/ 截图
│ ├── transcode/ FFmpeg 转码
│ ├── logrotate/ 日志轮转
│ ├── debug/ 调试
│ ├── sei/ SEI
│ ├── crontab/ 定时任务
│ ├── report/ 上报
│ ├── crypto/ 加密
│ └── mix/ 混流
├── 设备类 (4)
│ ├── onvif/ ONVIF
│ ├── v4l2/ V4L2
│ ├── alsa/ ALSA
│ └── homekit/ HomeKit
├── 房间/互动类 (2)
│ ├── live/ 直播间
│ └── meeting/ 会议室
└── 测试/开发 (1)
└── test/ 测试插件
内置服务:
└── src/room/ 房间服务 (RoomService)

插件只依赖开源的 SDK crate,不直接依赖引擎内部实现:

你的自定义插件
└──▶ sdk (monibuca-sdk) ← 开源
└──▶ codec (monibuca-codec)
[package]
name = "plugin-xxx"
version = "0.1.0"
edition = "2024"
[dependencies]
sdk = { git = "https://github.com/langhuihui/monibuca-sdk" }

静态插件通过 pub use 在主 crate 中注册:

src/plugins/mod.rs
#[cfg(feature = "rtmp")]
pub use plugin_rtmp as rtmp;
#[cfg(feature = "rtsp")]
pub use plugin_rtsp as rtsp;
#[cfg(feature = "webrtc")]
pub use plugin_webrtc as webrtc;

插件配置使用 ConfigSchema derive 宏,需要指定 sdk_path

use sdk::ConfigSchema;
#[derive(ConfigSchema)]
#[config_schema(sdk_path = "sdk")]
pub struct MyPluginConfig {
/// 监听端口
#[schema(default = 1935)]
pub port: u16,
/// 超时时间(秒)
#[schema(default = 30)]
pub timeout: u32,
}

插件通过 EngineContext 获取引擎能力,而不是直接依赖引擎内部类型:

pub struct EngineContext {
// 必有能力
pub stream_manager: Arc<dyn StreamManagerApi>,
// 可选能力
pub database: Option<Arc<dyn DatabaseApi>>,
pub transform: Option<Arc<dyn TransformApi>>,
pub playback: Option<Arc<dyn PlaybackApi>>,
}

引擎在 PluginManager::init_all() 时构造 EngineContext 并注入到每个插件。

联系我们

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