# 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` 目录进行功能测试。