跳转到内容

WebRTC 服务器 - Monibuca WHIP/WHEP 低延迟方案

WebRTC 是实现浏览器端超低延迟音视频通信的标准技术。Monibuca V6 基于 WHIP(WebRTC-HTTP Ingestion Protocol)和 WHEP(WebRTC-HTTP Egress Protocol)标准实现推流和拉流,底层使用 rustrtc 引擎提供完整的 ICE/DTLS/SRTP 支持。

典型架构:浏览器 WHIP 推流 → Monibuca 房间/会议插件 → WHEP 观众拉流,同一流可回落 RTMP/HLS 给不支持 WebRTC 的终端。

能力说明
延迟通常 < 500ms(局域网/优质公网)
信令HTTP WHIP/WHEP,无需独立 WebSocket 信令服务
业务层搭配 会议室直播间
运维Admin 流级码率/卡顿监控

自建视频会议部署与成本对比见 会议室插件 · 部署与成本

属性
信令传输HTTP(WHIP/WHEP)
媒体传输UDP / 可选 TCP ICE(ICE/DTLS/SRTP)
推流✅ 支持(WHIP)
拉流✅ 支持(WHEP)
延迟< 500ms
配置节webrtc

预编译二进制已内置该插件,在 config.yaml 中配置即可:

webrtc:
enable: true
# UDP only (default). Dual ICE example: "udp:9000-9100,tcp:9101-9200"
port_range: "udp:9000-9100"
pli_interval: 2
nack_buffer_size: 200
prefer_srflx_over_natted_host: false
public_ip: ""
enable_cors: true
cors_origins:
- "*"
ice_servers:
- urls:
- "stun:stun.l.google.com:19302"
配置项类型默认值说明
enablebooltrue是否启用 WebRTC 插件
port_rangestring"udp:9000-9100"ICE 媒体端口:udp:A-Btcp:A-B,或双栈 udp:A-B,tcp:C-D(默认仅 UDP)
pli_intervalu642PLI(关键帧请求)间隔(秒)
nack_buffer_sizeusize200NACK 重传历史包数量;浏览器 offer 含 apt= 时使用 RFC 4588 RTX(rustrtc ≥0.3.92)
prefer_srflx_over_natted_hostboolfalseICE 连通性检查中优先 srflx、降低私网 host 优先级
public_ipstring""公网 IP(NAT 穿透时写入 candidate)
enable_corsbooltrue是否启用 CORS
cors_originsVec["*"]允许的跨域来源
ice_serversVec[]STUN/TURN 列表

企业网常屏蔽 UDP。可同时收集 UDP host 与 TCP passive candidate(opt-in):

webrtc:
port_range: "udp:9000-9100,tcp:9101-9200"
public_ip: "203.0.113.10" # 建议配置,便于浏览器连到公网地址

防火墙需放行:9000-9100/udp9101-9200/tcp(按你的区间调整)。仅 TCP 时可写 port_range: "tcp:9101-9200"

ice_servers:
# STUN(NAT 打洞)
- urls:
- "stun:stun.l.google.com:19302"
# TURN(对称 NAT / UDP 全堵时中继;推荐旁挂 coturn,非进程内嵌)
- urls:
- "turn:turn.example.com:3478?transport=udp"
- "turn:turn.example.com:3478?transport=tcp"
username: "user"
credential: "pass"

最小 coturn 示例(宿主机旁挂,按需改 realm/密钥):

# docker-compose 片段
services:
coturn:
image: coturn/coturn:latest
network_mode: host
command:
- "-n"
- "--log-file=stdout"
- "--listening-port=3478"
- "--fingerprint"
- "--lt-cred-mech"
- "--user=user:pass"
- "--realm=example.com"

浏览器端 WHIP/WHEP 客户端也应配置相同的 iceServers,否则只服务端开 TURN 不够。

完整 Compose 参考栈(origin + coturn):仓库 deploy/compose/

类型编码说明
视频H.264广泛支持
视频H.265部分浏览器支持
音频OpusWebRTC 标准音频编码
POST /webrtc/whip/{streamPath}
Content-Type: application/sdp

请求体为 SDP Offer,响应返回 SDP Answer。

FFmpeg 6.1+ 支持 WHIP 推流:

Terminal window
ffmpeg -re -i input.mp4 \
-c:v libx264 -preset ultrafast -tune zerolatency \
-c:a libopus \
-f whip "http://localhost:8080/webrtc/whip/live/test"

OBS 30+ 内置 WHIP 支持:

  1. 进入 设置直播
  2. 服务选择 WHIP
  3. 服务器填写:http://your-server:8080/webrtc/whip/live/test
  4. 点击 开始推流
POST /webrtc/whep/{streamPath}
Content-Type: application/sdp

请求体为 SDP Offer,响应返回 SDP Answer。

async function play(streamPath) {
const pc = new RTCPeerConnection({
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
});
pc.addTransceiver('video', { direction: 'recvonly' });
pc.addTransceiver('audio', { direction: 'recvonly' });
pc.ontrack = (event) => {
document.getElementById('player').srcObject = event.streams[0];
};
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const response = await fetch(`/webrtc/whep/${streamPath}`, {
method: 'POST',
headers: { 'Content-Type': 'application/sdp' },
body: offer.sdp,
});
const answer = await response.text();
await pc.setRemoteDescription({ type: 'answer', sdp: answer });
}
play('live/test');

Monibuca 提供内置的 WebRTC 测试页面,方便快速验证功能:

页面URL说明
推流测试/webrtc/test/publish使用摄像头/屏幕推流
拉流测试/webrtc/test/subscribe播放已有的 WebRTC 流

在浏览器中直接访问即可使用。

在有 NAT 的网络环境下,需要正确配置以确保 WebRTC 连通:

webrtc:
public_ip: "203.0.113.1" # 服务器公网 IP
webrtc:
ice_servers:
- urls:
- "stun:stun.l.google.com:19302"
- urls:
- "turn:turn.example.com:3478"
username: "user"
credential: "pass"

确保 port_range 中配置的 UDP 端口范围在防火墙上已开放:

Terminal window
# 开放 UDP 端口范围
sudo ufw allow 9000:9100/udp

WebRTC 推流后,可以通过其他协议拉取:

Terminal window
# WebRTC WHIP 推流后...
# 通过 RTMP 拉流(Opus 自动转码为 AAC)
ffplay rtmp://localhost:1935/live/test
# 通过 HTTP-FLV 拉流
ffplay http://localhost:8080/flv/live/test.flv
# 通过 HLS 拉流
ffplay http://localhost:8080/hls/live/test/index.m3u8

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码