Skip to main content
SDK 提供三种获取网络质量的方式,从”被动感知变化”到”主动查询”,按需选择: onNetworkQualityChangedonMediaMetric 通过 RTCMediaEvent 被动下发,业务层订阅即可、无需轮询;getMetric() 用于主动按需拉取。 Metric 各字段的完整数据字典见媒体质量

一、订阅质量等级变化(推荐)

大多数业务只需要”网络状态灯 + 弱网提示”,推荐优先使用 onNetworkQualityChanged。它只在质量等级发生跨档变化时回调(而非每个采样周期都回调),并已处理好弱网抖动:
  • 非对称迟滞:等级下降(变差)立即回调,便于及时响应;等级回升(变好)需连续多次采样确认后才回调,避免网络抖动导致状态灯频繁跳变。因此业务层无需自己再做时间去抖,直接响应回调即可。
  • 分方向:上行、下行各自独立判断与回调,一次回调只表示一个方向direction)的变化。
继承 RTCMediaSimpleEvent 只重写关心的回调,再通过 setRtcMediaEvent 注册:
:::note onNetworkQualityChanged 在信令通道的后台线程回调,更新 UI 前请切换到主线程(如 runOnUiThread / View.post)。 ::: NetworkQualityChange 结构:

二、周期性质量快照 onMediaMetric

需要详细诊断面板(每条轨道的码率、丢包、帧率等)时,订阅 onMediaMetric。SDK 入会后每约 5 秒下发一份完整的 MediaMetric.Metric
:::note qualityReport 由服务端计算并下发,首次入会后需等待服务端首个质量报告到达,在此之前可能为 null,示例中已用可空写法处理。 :::

三、主动查询 getMetric

在任意时刻主动拉取最近一次采集到的完整质量快照(含 qualityReport),适合”点开详情才计算”的诊断面板等按需场景:
:::note 返回线程安全副本,不会触发底层 getStats;采样周期约 5 秒,起播初期可能为 null。 :::

四、连接质量评估 qualityReport

三种方式拿到的连接质量都是同一份 qualityReport:服务端已综合丢包、RTT、抖动、码率等多维指标计算出等级与 MOS,业务层直接用即可,无需自己算。它区分上行(本端到服务端)与下行(服务端到本端)两个方向。
level 取值说明:
onNetworkQualityChangedonMediaMetric.qualityReportgetMetric().qualityReport 三者数据源一致,均来自服务端下发的同一份质量报告;区别只在下发方式(变化触发 / 周期 / 主动拉取)。
qualityReport 外,Metric 还包含网络总体统计 networkStats、上下行聚合 localUploadStats / remoteDownloadStats、以及轨道级统计 localAudios / localVideos / remoteAudios / remoteVideos,完整字段见媒体质量

五、弱网处理

处理弱网先分清两件事:方向处置
  • 上行差是你发不出去,可以主动降级(关摄像头、取消发布视频);下行差是你收不进来,多数由服务端自动优化,必要时可退订视频。所以要看 uplink / downlink 两个方向,而不是只看一侧。
  • onNetworkQualityChanged 驱动即可——它已内置迟滞去抖,无需业务层再做时间去抖;若走 onMediaMetric 周期读取,则需自行去抖(见 5.1)。

5.1 展示网络状态

用质量等级映射一个状态灯即可,不要把丢包率、RTT 这类原始数据直接展示给终端用户: 上行差和下行差的提示文案不同,需要区分。用 onNetworkQualityChanged 时,直接响应变化即可,无需自己去抖:
若改用周期性的 onMediaMetric,由于每约 5 秒回调一次,需自行做一次去抖,避免频繁打扰:

5.2 上行变差

当上行等级持续为 poor / lost,按从轻到重逐级降级: 1. 关闭摄像头、只保留音频。 音频码率低,弱网下几乎总能保住。停止摄像头采集即可显著降低上行占用,且保留发布通道,网络恢复后可随时重新采集:
2. 彻底取消发布视频。 比关摄像头更彻底,释放上行编码与发送资源:
关摄像头会改变通话形态,建议提示用户后再执行,不要静默操作——应急指挥、执法记录等场景尤其如此。 如需进一步定位上行受限的原因,可读取本地视频轨道的 qualityLimitationReason

5.3 下行变差

当下行等级持续为 poor 1. 先确认是不是对端的问题。 本端有下行丢包(downlink.loss 明显 > 0),才是你的接收链路差;若本端几乎无丢包、只是某人画面卡顿,通常是对方上行差,此时退订也无济于事,提示”对方网络不佳”即可。 2. 发布方发大小流时,服务端自动切层。 服务端会依据每个订阅者自身的下行带宽和丢包,自动把它切到合适的大 / 小流,订阅端无需手动切换(订阅时通过候选层列表告知服务端可切的层)。只发单流则无法自动降。 3. 退订视频、只收音频。
4. 多路会议:只订阅当前说话人的视频,其余成员只收音频。当前说话人可通过 onActiveSpeakersChanged 获取:

5.4 连接断开与重连

连接状态相关的通知在 RTCClientEvent 中,通过 setRtcClientEvent 注册。SDK 会在网络中断时自动重连,业务层据此更新 UI 即可:

5.5 速查表

六、完整示例

把上面的做法串起来:用 onNetworkQualityChanged 驱动状态灯与分方向提示(内置迟滞,无需自行去抖),按需降级与恢复,并处理断线重连。
示例中 stopCapture / startCapture / unPublishLocalVideo / unSubscribeRemoteTrack 均为 SDK 现有方法。关摄像头这类改变通话形态的操作建议通过按钮交给用户确认,未静默执行;普通会议等场景可自行改为自动。