实现智能调度
更新时间: 2024/11/26 15:44:05
网易云信 K 歌场景会根据合唱双方的网络和设备情况,自动选择采用 NTP 实时合唱或串行合唱。
功能原理
RTC 服务器计算主唱和合唱者的网络延时均满足如下要求,且连接了有线耳机时,自动选择 NTP 实时合唱方案,否则采用串行合唱方案:
- 主唱的采集播放延时 + 主唱上报的 RTT(Round-Trip Time) + 合唱者上报的 RTT < 特定阈值
- 合唱者的采集播放延时 + 主唱上报的 RTT + 合唱者上报的 RTT < 特定阈值
- 如果主唱或合唱者任意一方的网络延时不满足要求,则采用串行合唱方案。
- 因蓝牙耳机会有较大延时,所以 NTP 实时合唱方案要求主唱和合唱者连接有线耳机。
实现方法
采集播放延时
iOS 端的采集播放延时固定为 30ms。
获取上报的 RTT
// 处理rtt
func onRtcStats(stats: NERoomRtcStats) {
let downRtt = stats.downRtt
let upRtt = stats.upRtt
if downRtt > 0, upRtt > 0 {
rtt = convertRtt((downRtt + upRtt) / 2)
} else if downRtt == 0, upRtt > 0 {
rtt = convertRtt(upRtt)
} else if downRtt > 0, upRtt == 0 {
rtt = convertRtt(downRtt)
}
}
// originRtt代表用户手机到rtc边缘节点一个来回的时间。除以2得到单向的时间。合唱双方连接的边缘节点,典型情况会经过1到3个中心节点,取中间值2个,每个节点之间的单向时间估计为10ms,得到总共节点之间耗时30ms,两个人评分,每人加15ms
func convertRtt(_ originRtt: UInt64) -> UInt64 {
(originRtt / UInt64(2.0)) + 15
}
获取是否连接了有线耳机
/// 是否插入耳机
func isHeadSetPlugging() -> Bool {
let route = AVAudioSession.sharedInstance().currentRoute
var isHead = false
for desc in route.outputs {
switch desc.portType {
case .headphones, .bluetoothA2DP, .usbAudio:
isHead = true
break
default: break
}
}
return isHead
}
此文档是否对你有帮助?