概述在NAT复杂或网络受限场景,STUN可能无法打洞,需启用TURN中继作为ICE回退路径。结合 `RTCRtpSender.setParameters` 控制编码层与最大码率,以及优先级与QoS策略,可提升首联通与通话稳定性。关键实践与参数服务器:部署可用的TURN (coturn),TCP+UDP端口范围开放认证:`lt-cred-mech` 用户名/密码或长期凭证,`realm` 一致ICE策略:`iceTransportPolicy=all`,优先 `relay` 作为回退编码层:Simulcast/SVC 按带宽与设备能力配置码率控制:视频 `maxBitrate=1–2Mbps`(HD) 或 `600–800kbps`(SD),音频 `64–128kbps`观测:`getStats()` 输出码率、丢包、RTT、candidateType示例/配置/实现# turnserver.conf (coturn)
listening-port=3478
tls-listening-port=5349
fingerprint
lt-cred-mech
realm=rtc.example.com
user=rtcuser:strongpassword
min-port=49152
max-port=65535
no-stdout-log
const pc = new RTCPeerConnection({
iceServers: [
{ urls: ['stun:stun.l.google.com:19302'] },
{ urls: ['turn:turn.example.com:3478'], username: 'rtcuser', credential: 'strongpassword' }
],
iceTransportPolicy: 'all'
})
// 码率与层控制
const sender = pc.getSenders().find(s => s.track && s.track.kind === 'video')
if (sender) {
const params = sender.getParameters()
params.encodings = [{ maxBitrate: 800_000 }, { maxBitrate: 200_000 }]
sender.setParameters(params)
}
// 观测统计
setInterval(async () => {
const stats = await pc.getStats()
stats.forEach(r => {
if (r.type === 'outbound-rtp' && r.kind === 'video') {
console.log('bitrate', r.bytesSent, r.timestamp)
}
if (r.type === 'candidate-pair' && r.selected) {
console.log('candidate', r.localCandidateId, r.remoteCandidateId, r.currentRoundTripTime)
}
})
}, 2000)
验证回退路径:在受限网络下触发 `relay` 候选并建立连接,`getStats` 中 `candidateType=relay`码率控制:限速网络(如 1Mbps)下视频保持流畅,观察 `outbound-rtp` 的发送码率与丢包QoS效果:提高关键层优先级,验证首屏与卡顿恢复时间稳定性:持续 30 分钟通话无断链,RTT与抖动维持在阈值内注意事项TURN端口范围与协议需在防火墙放行,注意TCP回退认证凭证需安全管理且定期轮换不同浏览器对Simulcast/SVC支持差异,需要能力检测与降级对移动端在弱网与切换场景测试并优化重连逻辑

发表评论 取消回复