
事情要从去年底的一次海外直播项目说起。客户要求在香港落地一套面向全球观众的超低延迟直播系统,要求端到端延迟必须控制在 100 毫秒以内,否则会影响用户与主播之间的实时互动体验。传统 RTMP/CDN 架构根本无法满足这个延迟要求,即便是 HLS + HTTP2 优化也只能降到 2~3 秒。
当时我们决定大胆一试:在香港服务器部署 WebRTC 流媒体中继,并结合运营商提供的 5G 边缘节点做分布式接入优化,搭建一套真正面向低延迟互动直播的基础架构。以下就是我当时的技术落地全过程。
架构设计:WebRTC SFU + 边缘节点 + 自研路由调度系统
整体架构如下图所示(文字示意):
[主播端 WebRTC]──▶[香港主节点 SFU]──▶[全球观众端 WebRTC]
▲
│
[5G MEC/边缘节点 + TURN/Relay + IP调度]
核心组成:
- 主播端:通过 Chrome/OBS 推送 WebRTC 流(VP8 + Opus 编码)。
- 香港主服务器:部署基于 mediasoup 的 SFU(Selective Forwarding Unit),负责转发流。
- 观众端:全球用户通过 WebRTC 观看直播,走最近的边缘节点接入。
- 5G MEC 节点:合作运营商的边缘计算节点部署 TURN + NAT 中继 + 地理选路逻辑。
- 调度系统:根据 IP 来源实时调度用户到最优接入点。
实战部署步骤
步骤一:香港服务器部署 WebRTC SFU
我们选择了 mediasoup 作为 SFU 核心,具备高并发、低延迟的优势。
环境准备
# 基于 Ubuntu 22.04
sudo apt update && sudo apt install -y nodejs npm build-essential python3
npm install -g mediasoup-cli
配置 mediasoup-worker
编辑 mediasoup.config.js:
module.exports = {
mediaCodecs: [
{
kind: 'audio',
mimeType: 'audio/opus',
clockRate: 48000,
channels: 2
},
{
kind: 'video',
mimeType: 'video/VP8',
clockRate: 90000
}
],
webRtcTransportOptions: {
listenIps: [{ ip: '你的香港公网IP', announcedIp: null }],
enableUdp: true,
enableTcp: true,
preferUdp: true,
initialAvailableOutgoingBitrate: 1000000
}
}
配置 nginx 反代 + HTTPS
server {
listen 443 ssl;
server_name live.example.com;
ssl_certificate /etc/letsencrypt/live/live.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/live.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
步骤二:部署 TURN Server 到运营商边缘节点
我们用的是 coturn,配合公网 IPv6 + 5G 边缘路由器做转发。
安装 coturn
sudo apt install coturn
修改配置 /etc/turnserver.conf:
listening-port=3478
min-port=49160
max-port=49200
realm=live.example.com
use-auth-secret
static-auth-secret=YOUR_SECRET
fingerprint
lt-cred-mech
external-ip=边缘节点公网IP
步骤三:接入用户侧自动分配最优边缘节点
部署一个 GeoIP + Anycast 路由调度系统(我们用 Golang 写的轻量服务):
核心逻辑(伪代码):
func selectEdgeNode(ip string) string {
geo := GeoIP.Lookup(ip)
switch geo.Country {
case "CN":
return "Shanghai-MEC"
case "SG":
return "Singapore-MEC"
default:
return "HK-Core"
}
}
然后动态返回 STUN/TURN 服务器地址以及信令服务器地址。
| 参数 | 建议配置 | 说明 |
|---|---|---|
initialAvailableOutgoingBitrate |
1000000 或更高 | 提升初始带宽 |
enableTcp |
true | 支持弱网环境 fallback |
| STUN/TURN | 用 IPv6 + 边缘就近部署 | 降低 NAT 穿透延迟 |
| 帧率控制 | 25 FPS + VP8 | 保证低码率下的流畅画面 |
| Audio jitterBuffer | 自定义 Buffer 长度 | 降低音频卡顿(关键) |
实测结果
我们在香港主节点与新加坡、东京、洛杉矶多个点测试,端到端延迟均控制在 80~95 ms 范围内,其中:
- 5G 用户平均延迟:< 70 ms
- WiFi 跨境用户:< 95 ms
- 落后地区(如印度部分地区):约 120 ms,部分观众需走香港主节点中继
常见故障与排查
| 问题 | 原因分析 | 解决方案 |
|---|---|---|
| 无法连接 TURN | UDP 被封 | 配置 enableTcp 并开放 443 fallback |
| 视频卡顿或花屏 | 网络抖动/编码器不兼容 | 降低帧率,切换 VP8 + 分辨率动态调节 |
| 延迟异常升高 | SFU 资源耗尽/ICE 协商失败 | 开启 SFU 多实例 + 监控 worker 状态 |
| 用户端出现黑屏 | 编解码器不兼容 | 客户端开启 VP8 fallback / H264 支持 |
WebRTC + MEC,是真正的低延迟直播“解法”
单靠中心化节点和传统 CDN 已经无法满足实时互动的直播需求,必须将接入层尽可能下沉到离用户最近的边缘节点,WebRTC + 5G MEC 是当前技术条件下最可行的方案。香港服务器作为全球中转核心节点,再加上就近接入和灵活转发的架构,能真正把直播延迟压到 100 毫秒以内。











