跳转到内容

WebRTC 协议

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

属性
信令传输HTTP(WHIP/WHEP)
媒体传输UDP(ICE/DTLS/SRTP)
推流✅ 支持(WHIP)
拉流✅ 支持(WHEP)
延迟< 500ms
Feature Flagwebrtc
Cargo.toml
[features]
webrtc = ["dep:plugin-webrtc"]
webrtc:
enable: true
port_range: "udp:9000-9100"
pli_interval: 2
public_ip: ""
enable_cors: true
cors_origins:
- "*"
ice_servers:
- urls:
- "stun:stun.l.google.com:19302"
配置项类型默认值说明
enablebooltrue是否启用 WebRTC 插件
port_rangestring"udp:9000-9100"UDP 端口范围
pli_intervalu642PLI(关键帧请求)间隔(秒)
public_ipstring""公网 IP(NAT 穿透时使用)
enable_corsbooltrue是否启用 CORS
cors_originsVec["*"]允许的跨域来源
ice_serversVec[]ICE 服务器列表
ice_servers:
# STUN 服务器(NAT 穿透用)
- urls:
- "stun:stun.l.google.com:19302"
# TURN 服务器(中继用)
- urls:
- "turn:turn.example.com:3478"
username: "user"
credential: "pass"
类型编码说明
视频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 群二维码