Monibuca RTSP协议全解析:从设备推流到多协议分发的完整流程
【免费下载链接】monibucaMonibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibuca
Monibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器框架,其 RTSP 插件完整实现了 RFC 2326/RFC 7826 协议标准。本文将用通俗的方式,带你走通一条 RTSP 流的完整生命周期:摄像头如何推流进服务器、服务器如何调度分发、又如何一键转换成 RTMP、HLS、WebRTC 等多种协议输出。
如上图所示,Monibuca 采用"核心 + 插件"的架构:RTSP、RTMP、HLS、WebRTC 等协议只是插件层的一员,它们共享同一个核心媒体调度系统。理解这一点,就能理解"一进多出"分发为何如此简单。
一、RTSP 在 Monibuca 中的位置
Monibuca 的 RTSP 能力全部由独立插件提供,核心代码位于 plugin/rtsp/:
| 模块 | 文件 | 职责 |
|---|---|---|
| 插件入口 | plugin/rtsp/index.go | 注册服务器、拉流器、推流器与代理 |
| RTSP 服务器 | plugin/rtsp/server.go | 处理 ANNOUNCE/DESCRIBE/SETUP 等信令 |
| 网络连接 | plugin/rtsp/pkg/connection.go | 信令读写、认证、内存管理 |
| 收发器 | plugin/rtsp/pkg/transceiver.go | RTP 数据在 TCP/UDP 通道上的收发 |
| 拉流代理 | plugin/rtsp/pkg/pull-proxy.go | 主动从远程拉 RTSP 流并自动重连 |
| 推流代理 | plugin/rtsp/pkg/push-proxy.go | 把本地流推送到远程 RTSP 服务器 |
更详细的配置说明可参考官方文档 plugin/rtsp/README_CN.md。
二、设备推流进服务器:一次完整的握手过程
以摄像头或 FFmpeg 向rtsp://host:554/live/cam1推流为例,整个过程分为四个阶段:
1. 声明身份:ANNOUNCE(宣告流)
推流端携带 SDP(流的"名片",描述音视频编码、采样率等信息)发送 ANNOUNCE 请求。服务器在 plugin/rtsp/server.go 中解析 SDP,并向核心注册一个发布者(Publisher)——这一刻,流正式"进入" Monibuca。
2. 建立通道:SETUP(协商传输)
双方在此协商数据走哪条路:
- TCP 交织模式:RTP 数据直接复用信令通道传输,可靠且能穿透防火墙,适合公网;
- UDP 单播模式:媒体走独立端口,延迟更低,适合局域网。服务器通过 plugin/rtsp/index.go 中的 UDP 端口池(默认 20001-30000)动态分配 RTP/RTCP 端口对,并发多路流也互不干扰。
💡 实用建议:公网传输选 TCP,局域网选 UDP。UDP 失败时还会自动回退 TCP(见 plugin/rtsp/pkg/transceiver.go)。
3. 开始发送:RECORD(开始推流)
RECORD 响应后,音视频帧按 RTP 打包持续流入服务器的环形缓冲区(ring buffer),由核心的 pub-sub 系统完成缓存与调度。
4. 结束会话:TEARDOWN(优雅关闭)
任一方发送 TEARDOWN,信令连接关闭,端口、缓冲区等资源全部回收。
若开启了
username/password认证,服务器会在首个信令请求时校验 HTTP Basic 凭据,未通过则返回 401。配置示例见 plugin/rtsp/README_CN.md。
三、从单路 RTSP 到多协议分发:一进多出
这是 Monibuca 最"香"的机制:流只推一次,其余协议全部由核心自动转换分发。
- 摄像头把 RTSP 流推入
live/cam1; - 核心将流拆解为标准的音视频帧序列;
- 各协议插件按需"取帧"并封装成自己的格式:
| 输出协议 | 对应插件 | 典型场景 |
|---|---|---|
| RTSP | plugin/rtsp/ | NVR、VLC、专业客户端 |
| RTMP | plugin/rtmp/ | 直播 CDN、OBS 拉流 |
| FLV | plugin/flv/ | 浏览器低延迟播放 |
| HLS/LL-HLS | plugin/hls/ | 大并发点播/直播 |
| WebRTC | plugin/webrtc/ | 网页秒开、超低延迟 |
也就是说,同一路摄像头流,NVR 走 RTSP 回看、网页走 WebRTC 实时观看、CDN 走 RTMP 分发,三端同时在线也只需一条上行链路。
四、反向链路:把远程 RTSP 拉进来
除了被动接收推流,RTSP 插件还内置了客户端能力,可主动从远程设备取流:
- 拉流代理:在
global.pullproxy中配置远程地址(如rtsp://admin:123456@192.168.1.100/stream),plugin/rtsp/pkg/pull-proxy.go 会每 5 秒巡检一次连接状态,断线自动重连,pullonstart: true时随服务启动即拉流; - 推流代理:在
global.pushproxy中配置目标地址,plugin/rtsp/pkg/push-proxy.go 将本地流实时推给远端 RTSP 服务器,同样具备心跳与重连能力。
也支持通过 API 动态管理,无需改配置重启:
curl -X POST http://localhost:8080/api/stream/pull \ -d '{"protocol":"rtsp","streamPath":"cam1","remoteURL":"rtsp://admin:123@192.168.1.100/stream"}'五、常见问题速查
| 症状 | 排查方向 |
|---|---|
| 连接被拒绝 | 554 为特权端口,尝试改端口(如 8554);检查防火墙 |
| 有声音无画面 | 核对两端编解码兼容性,查看日志中的 SDP 信息 |
| UDP 丢包严重 | 扩大udpport范围,或切换 TCP 传输 |
| 播放卡顿 | 局域网改 UDP;检查带宽与码率匹配 |
更多非标准设备(非标 RTSP 实现)的兼容说明见 plugin/rtsp/BAD_DEVICE.md,完整方法列表与编解码支持范围见 plugin/rtsp/README_CN.md。
六、总结
- 协议层:RTSP 插件实现了标准信令全流程(OPTIONS/ANNOUNCE/DESCRIBE/SETUP/PLAY/RECORD/TEARDOWN),兼容 FFmpeg、VLC、OBS 及 ONVIF 设备;
- 架构层:推流只是把帧送入核心环形缓冲区,之后的多协议分发、录制、转发全部由 pub-sub 系统统一调度;
- 运维层:拉/推流代理自带心跳与自动重连,配合 REST API 可实现完全动态的流媒体编排。
对于新手而言,记住一句话就够了:把流推进来或拉进来,剩下的一切——RTMP、HLS、WebRTC 输出——Monibuca 都替你自动完成。
【免费下载链接】monibucaMonibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibuca
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考