onNetworkQualityChanged 与 onMediaMetric 通过 RTCMediaEvent 被动下发,业务层订阅即可、无需轮询;getMetric() 用于主动按需拉取。
Metric 各字段的完整数据字典见媒体质量。
一、订阅质量等级变化(推荐)
大多数业务只需要”网络状态灯 + 弱网提示”,推荐优先使用onNetworkQualityChanged。它只在质量等级发生跨档变化时回调(而非每个采样周期都回调),并已处理好弱网抖动:
- 非对称迟滞:等级下降(变差)立即回调,便于及时响应;等级回升(变好)需连续多次采样确认后才回调,避免网络抖动导致状态灯频繁跳变。因此业务层无需自己再做时间去抖,直接响应回调即可。
- 分方向:上行、下行各自独立判断与回调,一次回调只表示一个方向(
direction)的变化。
RTCMediaSimpleEvent 只重写关心的回调,再通过 setRtcMediaEvent 注册:
onNetworkQualityChanged 在信令通道的后台线程回调,更新 UI 前请切换到主线程(如 runOnUiThread / View.post)。
:::
NetworkQualityChange 结构:
二、周期性质量快照 onMediaMetric
需要详细诊断面板(每条轨道的码率、丢包、帧率等)时,订阅 onMediaMetric。SDK 入会后每约 5 秒下发一份完整的 MediaMetric.Metric:
qualityReport 由服务端计算并下发,首次入会后需等待服务端首个质量报告到达,在此之前可能为 null,示例中已用可空写法处理。
:::
三、主动查询 getMetric
在任意时刻主动拉取最近一次采集到的完整质量快照(含 qualityReport),适合”点开详情才计算”的诊断面板等按需场景:
getStats;采样周期约 5 秒,起播初期可能为 null。
:::
四、连接质量评估 qualityReport
三种方式拿到的连接质量都是同一份 qualityReport:服务端已综合丢包、RTT、抖动、码率等多维指标计算出等级与 MOS,业务层直接用即可,无需自己算。它区分上行(本端到服务端)与下行(服务端到本端)两个方向。
level 取值说明:
除onNetworkQualityChanged、onMediaMetric.qualityReport、getMetric().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. 关闭摄像头、只保留音频。 音频码率低,弱网下几乎总能保住。停止摄像头采集即可显著降低上行占用,且保留发布通道,网络恢复后可随时重新采集:
qualityLimitationReason:
5.3 下行变差
当下行等级持续为poor:
1. 先确认是不是对端的问题。 本端有下行丢包(downlink.loss 明显 > 0),才是你的接收链路差;若本端几乎无丢包、只是某人画面卡顿,通常是对方上行差,此时退订也无济于事,提示”对方网络不佳”即可。
2. 发布方发大小流时,服务端自动切层。 服务端会依据每个订阅者自身的下行带宽和丢包,自动把它切到合适的大 / 小流,订阅端无需手动切换(订阅时通过候选层列表告知服务端可切的层)。只发单流则无法自动降。
3. 退订视频、只收音频。
onActiveSpeakersChanged 获取:
5.4 连接断开与重连
连接状态相关的通知在RTCClientEvent 中,通过 setRtcClientEvent 注册。SDK 会在网络中断时自动重连,业务层据此更新 UI 即可:
5.5 速查表
六、完整示例
把上面的做法串起来:用onNetworkQualityChanged 驱动状态灯与分方向提示(内置迟滞,无需自行去抖),按需降级与恢复,并处理断线重连。
示例中stopCapture/startCapture/unPublishLocalVideo/unSubscribeRemoteTrack均为 SDK 现有方法。关摄像头这类改变通话形态的操作建议通过按钮交给用户确认,未静默执行;普通会议等场景可自行改为自动。