实现智能调度

更新时间: 2022/11/04 10:02:17

网易云信 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
    }

此文档是否对你有帮助?
有帮助
去反馈
  • 功能原理
  • 实现方法
  • 采集播放延时
  • 获取上报的 RTT
  • 获取是否连接了有线耳机