WebRTC低延迟直播:Monibuca WHIP/WHEP 5分钟接入完全指南
【免费下载链接】monibucaMonibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibuca
Monibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器框架,其内置的 WebRTC 插件原生支持WHIP 推流与WHEP 拉流两大标准协议,无需复杂信令开发,浏览器 5 分钟即可跑通毫秒级低延迟直播。
为什么选择 Monibuca 做 WebRTC 低延迟直播
传统直播方案在延迟上有明显短板,WebRTC 正好补上这一环:
| 方案 | 典型延迟 | 适用场景 |
|---|---|---|
| HLS | 10s~30s | 点播、大并发分发 |
| RTMP | 3s~5s | 推流上行 |
| WebRTC(WHIP/WHEP) | 200ms~1s | 低延迟直播、互动连麦、云监考、远程运维 |
Monibuca 的 WebRTC 插件基于 Pion 实现,开箱即用的能力包括:
- ✅WHIP/WHEP 标准协议:一个 HTTP POST 完成 SDP 协商,天然穿透防火墙
- ✅多编解码支持:H.264、H.265、AV1、VP9 视频 + Opus、PCMA、PCMU 音频
- ✅TCP/UDP 双传输:Docker 与严格防火墙环境下也能稳定建连
- ✅内置测试页面:推流、拉流、屏幕共享、多路流一应俱全
- ✅DataChannel 兜底:浏览器不支持的编码格式自动降级传输
插件源码位于 plugin/webrtc/,完整协议说明可参考 README_CN.md。
5 分钟接入:快速开始三步走
第 1 步:克隆并配置
git clone https://gitcode.com/langhuihui/monibuca在config.yaml中启用 WebRTC 插件,核心配置如下:
webrtc: port: tcp:9000 # 媒体传输端口,也支持 udp:9000 或 udp:10000-20000 pli: 2s # 视频丢包后请求关键帧的间隔 enabledc: false # 是否启用 DataChannel 备用传输 iceservers: [] # 公网直连场景可留空💡 服务器部署在 NAT/Docker 后时,务必额外配置公网 IP:
publicip: 1.2.3.4,否则客户端无法建立 ICE 连接。
第 2 步:启动服务
启动 Monibuca 后,插件自动注册以下 HTTP 端点:
POST /webrtc/push/{streamPath}—— WHIP 推流POST /webrtc/play/{streamPath}—— WHEP 拉流GET /webrtc/test/{name}—— 内置测试页面
第 3 步:用测试页面验证
浏览器打开以下地址,即可验证整条链路:
| 页面 | 地址 | 用途 |
|---|---|---|
| 推流 | /webrtc/test/publish | 摄像头+麦克风 WHIP 推流 |
| 拉流 | /webrtc/test/subscribe?streamPath=live/test | WHEP 拉流播放 |
| 屏幕共享 | /webrtc/test/screenshare | 桌面推流 |
| 多路流 | /webrtc/test/batchv2 | 单连接同时订阅多路流 |
页面源码在 publish.html 与 subscribe.html,可以直接抄作业。
WHIP 推流实战:一个 POST 请求搞定
WHIP(WebRTC-HTTP Ingestion Protocol)把繁琐的信令压缩成一次 HTTP 往返:客户端将 SDP Offer 以application/sdp格式 POST 到服务器,服务器返回 SDP Answer,随后自动交换 ICE 候选并开启 SRTP 媒体传输。
浏览器端核心代码只有 10 行左右:
const pc = new RTCPeerConnection(); const stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: true }); stream.getTracks().forEach(t => pc.addTrack(t, stream)); const offer = await pc.createOffer(); await pc.setLocalDescription(offer); const res = await fetch('/webrtc/push/live/myroom', { method: 'POST', headers: { 'Content-Type': 'application/sdp' }, body: offer.sdp }); await pc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: await res.text() }));拿到201 Created后,画面就以毫秒级延迟进入 Monibuca 流媒体核心,同一路流可被 RTMP、HLS、FLV 等所有下游协议消费——这正是"WebRTC 入口 + 多协议分发"架构的威力。
服务端推流处理实现在 index.go 的servePush,流路径支持?bearer=token参数做鉴权。
WHEP 拉流实战:浏览器低延迟播放
WHEP(WebRTC HTTP Egress Protocol)与推流几乎镜像对称,区别在于:客户端要添加recvonly轨道,并监听ontrack事件把远端流挂到<video>上:
const pc = new RTCPeerConnection(); pc.ontrack = e => { video.srcObject = e.streams[0]; video.play(); }; pc.addTransceiver('video', { direction: 'recvonly' }); pc.addTransceiver('audio', { direction: 'recvonly' }); const offer = await pc.createOffer(); await pc.setLocalDescription(offer); const res = await fetch('/webrtc/play/live/myroom', { method: 'POST', headers: { 'Content-Type': 'application/sdp' }, body: offer.sdp }); await pc.setRemoteDescription(new RTCSessionDescription({ type: 'answer', sdp: await res.text() }));流不存在时服务器返回404,可作为"流是否就绪"的探测手段。拉流端实现可参考 whep_client.go,Monibuca 也能反过来作为 WHEP 客户端从外部服务器拉流。
关键配置:port、publicip 与 iceservers
这三个参数决定了 WebRTC 连接能否"打得穿"网络:
1. port —— 传输协议选择
port: tcp:9000 # TCP:Docker/严格防火墙下最稳,推荐 port: udp:9000 # UDP:延迟更低 port: udp:10000-20000 # UDP 端口池:每连接独立端口,高并发首选2. publicip —— NAT 穿透的钥匙
服务器位于 Docker 或内网时,ICE 候选中只会带内网地址,客户端永远连不进来。配置publicip后,Monibuca 会通过 NAT 1:1 映射机制把公网 IP 写进 SDP Answer(实现见 index.go 的initSettingEngine):
publicip: 203.0.113.1 # 实际对外的公网 IPv4 publicipv6: 2001:db8::1 # 可选 IPv63. iceservers —— STUN/TURN 兜底
公网直连场景可留空;企业网、对称 NAT 建议配置 TURN 中继:
webrtc: iceservers: - urls: - stun:stun.l.google.com:19302 - urls: - turn:turn.example.com:3478 username: user credential: passwordDocker 部署推荐--network host模式,彻底规避端口映射与 PublicIP 问题;bridge 模式则需精确映射对应协议的端口(如-p 9000:9000/udp)。
常见问题速查:连不上先查这 5 处
| 现象 | 可能原因 | 解决建议 |
|---|---|---|
| ICE 一直卡在 checking | NAT 后未配publicip | 配置正确公网 IP 或换 host 网络模式 |
| 企业网/手机连不上 | 对称 NAT 无法打洞 | 部署 TURN 中继服务器兜底 |
| 连接成功但无画面 | 编码不被支持(如 H.265) | 开启enabledc: true走 DataChannel |
| 音频无声(AAC 源流) | WebRTC 仅支持 Opus/PCMA/PCMU | 编码端改 Opus,或启用 DataChannel |
| 跨域 fetch 被拦截 | 前端与服务器不同源 | 同源部署或配置 CORS |
更多细节(连接状态监听、BatchV2 多路流、H.265 推流技巧)完整收录在 plugin/webrtc/README_CN.md。
总结:把低延迟直播变成一次 POST
Monibuca 的 WebRTC 插件把 WHIP/WHEP 的标准能力做成了"零信令开发"体验:
- 配置 1 分钟:
webrtc段几个字段搞定端口与 NAT 设置 - 验证 1 分钟:内置测试页面点选即推即播
- 集成 3 分钟:10 行 JS 接入自己的业务
依托 Monibuca 的插件化核心(环缓冲、任务系统、发布订阅),一路 WebRTC 低延迟直播流可以同时分发给 RTMP、HLS、FLV、GB28181 等协议用户,是构建实时音视频业务的理想底座。
【免费下载链接】monibucaMonibuca(简称 m7s)是一款纯 Go 开发的开源流媒体服务器开发框架。项目地址: https://gitcode.com/langhuihui/monibuca
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考