base on ๐งฉ Monibuca is a Modularized, Extensible framework for building Streaming Server <!-- Improved compatibility of back to top link -->
<a id="readme-top"></a>
[![Contributors][contributors-shield]][contributors-url]
[![Forks][forks-shield]][forks-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![MIT License][license-shield]][license-url]
<!-- PROJECT LOGO -->
<br />
<div align="center">
<a href="https://m7s.live">
<img src="https://m7s.live/logo+.svg" alt="Logo" width="200">
</a>
<h1 align="center">Monibuca v5</h1>
<p align="center">
A highly scalable high-performance streaming server development framework developed purely in Go
<br />
<a href="./README_CN.md">ไธญๆๆๆกฃ</a>
ยท
<a href="https://github.com/Monibuca/v5/wiki"><strong>Explore the docs ยป</strong></a>
<br />
<br />
<a href="https://github.com/Monibuca/v5/issues">Report Bug</a>
ยท
<a href="https://github.com/Monibuca/v5/issues">Request Feature</a>
</p>
</div>
<!-- TABLE OF CONTENTS -->
<details>
<summary>Table of Contents</summary>
<ol>
<li><a href="#about">About</a></li>
<li><a href="#getting-started">Getting Started</a></li>
<li><a href="#usage">Usage</a></li>
<li><a href="#build-tags">Build Tags</a></li>
<li><a href="#monitoring">Monitoring</a></li>
<li><a href="#plugin-development">Plugin Development</a></li>
<li><a href="#arch">Architecture</a></li>
<li><a href="#third-party-plugins">Third-party Plugins</a></li>
<li><a href="#contributing">Contributing</a></li>
<li><a href="#license">License</a></li>
<li><a href="#contact">Contact</a></li>
</ol>
</details>
## About
Monibuca is a powerful streaming server framework written entirely in Go. It's designed to be:
- ๐ **High Performance** - Lock-free design, partial manual memory management, multi-core computing
- โก **Low Latency** - Zero-wait forwarding, sub-second latency across the entire chain
- ๐ฆ **Modular** - Load on demand, unlimited extensibility
- ๐ง **Flexible** - Highly configurable to meet various streaming scenarios
- ๐ช **Scalable** - Supports distributed deployment, easily handles large-scale scenarios
- ๐ **Debug Friendly** - Built-in debug plugin, real-time performance monitoring and analysis
- ๐ฅ **Media Processing** - Supports screenshot, transcoding, SEI data processing
- ๐ **Cluster Capability** - Built-in cascade and room management
- ๐ฎ **Preview Features** - Supports video preview, multi-screen preview, custom screen layouts
- ๐ **Security** - Provides encrypted transmission and stream authentication
- ๐ **Performance Monitoring** - Supports stress testing and performance metrics collection
- ๐ **Log Management** - Log rotation, auto cleanup, custom extensions
- ๐ฌ **Recording & Playback** - Supports MP4, HLS, FLV formats, speed control, seeking, pause
- โฑ๏ธ **Dynamic Time-Shift** - Dynamic cache design, supports live time-shift playback
- ๐ **Remote Call** - Supports gRPC interface for cross-language integration
- ๐ท๏ธ **Stream Alias** - Supports dynamic stream alias, flexible multi-stream management
- ๐ค **AI Capabilities** - Integrated inference engine, ONNX model support, custom pre/post processing
- ๐ช **WebHook** - Subscribe to stream lifecycle events for business system integration
- ๐ **Private Protocol** - Supports custom private protocols for special business needs
- ๐ **Supported Protocols**: RTMP, RTSP, HTTP-FLV, WS-FLV, HLS, WebRTC, GB28181, ONVIF, SRT
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Getting Started
### Prerequisites
- Go 1.23 or higher
- Basic understanding of streaming protocols
### Run with Default Configuration
```bash
cd example/default
go run -tags sqlite main.go
```
### Web UI
Place the `admin.zip` file (do not unzip) in the same directory as your configuration file.
Then visit http://localhost:8080 to access the UI.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Examples
For more examples, please check out the [example](./example) documentation.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Build Tags
The following build tags can be used to customize your build:
| Build Tag | Description |
|-----------|-------------|
| disable_rm | Disables the memory pool |
| sqlite | Enables the sqlite DB |
| sqliteCGO | Enables the sqlite cgo version DB |
| mysql | Enables the mysql DB |
| postgres | Enables the postgres DB |
| duckdb | Enables the duckdb DB |
| taskpanic | Throws panic, for testing |
| fasthttp | Enables the fasthttp server instead of net/http |
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Monitoring
Monibuca supports Prometheus monitoring out of the box. Add the following to your Prometheus configuration:
```yaml
scrape_configs:
- job_name: "monibuca"
metrics_path: "/api/metrics"
static_configs:
- targets: ["localhost:8080"]
```
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Plugin Development
Monibuca's functionality can be extended through plugins. For information on creating plugins, see the [plugin guide](./plugin/README.md).
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Architecture
For detailed architecture design documentation, please refer to the [Architecture Documentation](./doc/arch/index.md).
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Third-party Plugins
- https://github.com/cuteLittleDevil/m7s-jt1078
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
1. Fork the Project
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the Branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
<p align="right">(<a href="#readme-top">back to top</a>)</p>
## License
Distributed under the MIT License. See `LICENSE` for more information.
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- CONTACT -->
## Contact
monibuca - [@m7server](https://x.com/m7server) -
[email protected]
Project Link: [https://github.com/langhuihui/monibuca](https://github.com/langhuihui/monibuca)
<p align="right">(<a href="#readme-top">back to top</a>)</p>
<!-- MARKDOWN LINKS & IMAGES -->
[contributors-shield]: https://img.shields.io/github/contributors/langhuihui/monibuca.svg?style=for-the-badge
[contributors-url]: https://github.com/langhuihui/monibuca/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/langhuihui/monibuca.svg?style=for-the-badge
[forks-url]: https://github.com/langhuihui/monibuca/network/members
[stars-shield]: https://img.shields.io/github/stars/langhuihui/monibuca.svg?style=for-the-badge
[stars-url]: https://github.com/langhuihui/monibuca/stargazers
[issues-shield]: https://img.shields.io/github/issues/langhuihui/monibuca.svg?style=for-the-badge
[issues-url]: https://github.com/langhuihui/monibuca/issues
[license-shield]: https://img.shields.io/github/license/langhuihui/monibuca.svg?style=for-the-badge
[license-url]: https://github.com/langhuihui/monibuca/blob/v5/LICENSE
", Assign "at most 3 tags" to the expected json: {"id":"13937","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"