# Monibuca v5 项目概述 Monibuca 是一个使用纯 Go 语言开发的、高度可扩展的高性能流媒体服务器开发框架。它旨在提供高并发、低延迟的流媒体处理能力,并支持多种流媒体协议和功能。 ## 核心特性 * **高性能**: 采用无锁设计、部分手动内存管理和多核计算。 * **低延迟**: 实现零等待转发,全链路亚秒级延迟。 * **模块化**: 按需加载,无限扩展性。 * **灵活性**: 高度可配置,适应各种流媒体场景。 * **可扩展性**: 支持分布式部署,轻松应对大规模场景。 * **调试友好**: 内置调试插件,实时性能监控与分析。 * **媒体处理**: 支持截图、转码、SEI 数据处理。 * **集群能力**: 内置级联和房间管理。 * **预览功能**: 支持视频预览、多屏预览、自定义屏幕布局。 * **安全性**: 提供加密传输和流认证。 * **性能监控**: 支持压力测试和性能指标收集(集成在测试插件中)。 * **日志管理**: 日志轮转、自动清理、自定义扩展。 * **录制与回放**: 支持 MP4、HLS、FLV 格式,支持倍速、寻址、暂停。 * **动态时移**: 动态缓存设计,支持直播时移回放。 * **远程调用**: 支持 gRPC 接口,实现跨语言集成。 * **流别名**: 支持动态流别名,灵活的多流管理。 * **AI 能力**: 集成推理引擎,支持 ONNX 模型,支持自定义前后处理。 * **WebHook**: 订阅流生命周期事件,用于业务系统集成。 * **私有协议**: 支持自定义私有协议以满足特殊业务需求。 ## 支持的协议 * RTMP * RTSP * HTTP-FLV * WS-FLV * HLS * WebRTC * GB28181 * ONVIF * SRT ## 技术架构 Monibuca 基于插件化架构设计,核心功能通过插件扩展。主要组件包括: * **Server**: 核心服务器,负责管理流、插件、任务等。 * **Plugin**: 插件系统,提供各种功能扩展。 * **Publisher**: 流发布者,负责接收和管理流数据。 * **Subscriber**: 流订阅者,负责消费流数据。 * **Task**: 任务系统,用于管理异步任务和生命周期。 * **Config**: 配置系统,支持多层级配置(环境变量、配置文件、默认值等)。 ## 构建与运行 ### 前提条件 * Go 1.23 或更高版本 * 对流媒体协议有基本了解 ### 运行默认配置 ```bash cd example/default go run -tags sqlite main.go ``` ### 构建标签 可以使用以下构建标签来自定义构建: | 构建标签 | 描述 | | :--- | :--- | | `disable_rm` | 禁用内存池 | | `sqlite` | 启用 sqlite DB | | `sqliteCGO` | 启用 sqlite cgo 版本 DB | | `mysql` | 启用 mysql DB | | `postgres` | 启用 postgres DB | | `duckdb` | 启用 duckdb DB | | `taskpanic` | 抛出 panic,用于测试 | | `fasthttp` | 启用 fasthttp 服务器而不是 net/http | ### Web UI 将 `admin.zip` 文件(不要解压)放在与配置文件相同的目录中。然后访问 http://localhost:8080 即可访问 UI。 ## 开发约定 ### 项目结构 * `example/`: 包含各种使用示例。 * `pkg/`: 核心库代码。 * `plugin/`: 各种功能插件。 * `pb/`: Protocol Buffer 生成的代码。 * `doc/`: 项目文档。 * `scripts/`: 脚本文件。 ### 配置 * 使用 YAML 格式进行配置。 * 支持多层级配置覆盖(环境变量 > 配置文件 > 默认值)。 * 插件配置通常以插件名小写作为前缀。 ### 日志 * 使用 `slog` 进行日志记录。 * 支持不同日志级别(debug, info, warn, error, trace)。 * 插件可以有自己的日志记录器。 ### 插件开发 * 插件需要实现 `IPlugin` 接口。 * 通过 `InstallPlugin` 函数注册插件。 * 插件可以注册 HTTP 处理函数、gRPC 服务等。 * 插件可以有自己的配置结构体。 ### 任务系统 * 使用 `task` 包管理异步任务。 * 任务具有生命周期管理(启动、停止、销毁)。 * 任务可以有父子关系,形成任务树。 * 支持任务重试机制。 ### 测试 * 使用 Go 标准测试包 `testing`。 * 在 `test/` 目录下编写集成测试。 * 使用 `example/test` 目录进行功能测试。