游戏语音出现问题,排查起来比想象中麻烦。通话横跨业务服务、RTC 频道、网络、音频设备和游戏进程,任何一段出问题,都会给玩家带来不佳体验。偶发问题尤其难定位,复现不了就只能让玩家重新登录,下次照样出现。
所以,把一条投诉定位到具体用户和具体战局,需要考量三类数据:RTC 侧的音频质量数据、声网水晶球的项目级监控、以及游戏业务侧的队伍和战局记录,再定位排查。
一. 先把”语音可用”定义清楚
加入频道成功,不等于玩家能正常使用语音。玩家还需要进入正确频道、成功发布声音、订阅到队友音频、并通过正确设备播放出来。一条完整链路可以拆成五个时间点:
| 时间点 | 需要记录的结果 | 失败后玩家的感受 |
|---|---|---|
| 点击或自动开启语音 | 权限、设备状态、业务房间状态 | 语音按钮没有反应 |
| 获取频道信息 | 频道名、UID、Token、接口耗时 | 一直显示连接中 |
| 加入 RTC 频道 | 加入结果、错误码、连接耗时 | 无法进入队伍语音 |
| 发布和订阅音频 | 发布状态、订阅状态、远端 UID | 自己能说,听不到队友 |
| 音频开始播放 | 首帧时间、输出设备、音量状态 | 频道已连接,耳机里仍然无声 |
接通率以最后一个必要环节为准,开黑场景可以定义为”进入队伍后 5 秒内,成功加入频道并开始接收至少一名队友的音频”。只统计 joinChannel 成功率会漏掉发布、订阅和音频路由问题。接通率持续低于 98%,链路某处大概率有系统性问题。
自动加入语音的游戏还要区分”无需加入”和”加入失败”——队伍里没有其他成员、玩家主动关闭语音、账号处于禁言状态,都不应计入技术失败。
二. 一条投诉至少要能找到一场战局
玩家说”昨晚排位语音很卡”,技术团队需要知道他在哪个频道、和谁通话、使用哪个客户端版本。RTC 侧保存了完整质量数据,但没有这些信息,也很难找到对应记录。
游戏日志和质量平台之间需要打通以下字段:游戏账号 ID 与 RTC UID 的对应关系、频道名和队伍 ID 房间 ID 战局 ID、游戏模式及当前阶段(大厅、加载、战斗、结算)、客户端版本和 RTC SDK 版本、设备型号和网络类型、加入频道和离开频道的时间点、断线和重连的时间点、禁言和踢人操作的时间点。
频道名和 UID 不宜只存在于 RTC 日志中。客服后台保存玩家最近几场游戏对应的通话标识,收到反馈后直接选择战局发起质量调查,省去用时间和昵称猜测的过程。
时间戳要统一。客户端事件、游戏服务端日志和 RTC 数据统一使用 UTC,展示层再转换成当地时间。几秒钟的偏差,就可能把一次团战卡顿对到错误的网络波动上。
三. 玩家说”听不到”,先查状态再查网络
“听不到队友”的原因可能出在频道、权限、订阅或播放设备,不一定是音频质量问题。上来就看丢包和延迟,容易走错方向。
第一步:确认双方是否在同一频道
核对频道名、RTC UID 和加入结果,再检查队友是否仍在业务房间。匹配取消、队伍重组或跨服迁移后,业务房间已经改变,客户端仍留在旧 RTC 频道,也会出现彼此听不到的情况。
第二步:确认音频有没有发布和订阅
查 OnRemoteAudioStateChanged 回调,确认远端 state 是否为 REMOTE_AUDIO_STATE_DECODING。如果是 REMOTE_AUDIO_STATE_STOPPED,远端可能没有发布音频流,检查对方的 MuteLocalAudioStream 状态。玩家主动静音、队长权限和系统麦克风权限要分开记录,避免把产品状态误判成 SDK 错误。
第三步:检查音频路由
蓝牙耳机断开、系统来电、App 切换前后台,都可能改变音频输出设备。频道连接和订阅全部正常,声音仍然没有,很可能被送到了错误的耳机、听筒或扬声器。日志要记录音频路由变化事件。以上都查完仍然无声,再进入网络和音频质量排查。
四. 玩家说”卡”,要分清网络卡顿和客户端卡顿
OnRemoteAudioStats 针对每名远端音频用户每 2 秒触发一次,返回当前统计周期内的音频质量数据。游戏语音排查中比较有用的字段:
| 字段 | 含义 | 适合判断什么 |
|---|---|---|
audioLossRate |
统计周期内远端音频流的丢帧率(%) | 是否存在明显网络损伤 |
frozenRate |
音频卡顿累计时长占音频有效时长的百分比(%) | 玩家实际听到断续声音的程度 |
networkTransportDelay |
音频发送端到接收端的网络延迟(毫秒) | 网络传输这一段耗了多少时间 |
jitterBufferDelay |
音频接收端到网络抖动缓冲的延迟(毫秒) | 网络抖动是否导致缓冲加深 |
e2eDelay |
自远端用户音频采集起至本地用户开始播放的总时长(毫秒) | 玩家感知到的完整延迟 |
mosValue |
返回值范围 0 到 500,除以 100 得到 MOS 分数 | 综合判断玩家的主观听感 |
按照声网 SDK 的统计口径,音频丢帧率达到 4% 即记为音频卡顿。水晶球实时监控把音频卡顿率大于 3% 标记为异常,多维监测气泡图会把这类频道标红。这个阈值可以作为设置项目级告警的初始参考,具体还要按玩法校准——FPS 团战语音和休闲房聊天对卡顿的容忍度不一样。
网络指标正常,玩家仍然听到断续声音,就要查 Unity 客户端。主线程长时间阻塞、场景加载、资源解压、音效系统抢占和 CPU 温控降频,都可能影响音频处理。把 frozenRate 和 Unity Profiler 的主线程耗时放在同一时间轴上对比——卡顿时间点和主线程 GC 尖峰对应,问题在游戏侧;和 audioLossRate 上升对应,问题在网络侧。
五. 延迟高时,不要只看网络 RTT
端到端音频延迟包含远端采集、音频前处理、网络传输、抖动缓冲和本地播放几段。玩家反馈”队友慢半拍”,网络往返时延只是其中一部分。networkTransportDelay 看发送端到接收端的网络传输耗时,jitterBufferDelay 看接收端为抵抗抖动增加了多少等待,e2eDelay 覆盖从采集到播放的完整过程。三个字段对照,才能判断延迟积累在哪一段。
统计延迟时保留分位数。平均值会把少数严重异常压平,P95 或 P99 更容易暴露团战期间偶发的高延迟。语音延迟在地图加载时突然升高,比整场持续偏高更容易定位原因,所以按战局阶段拆分很有必要。
| 场景 | 延迟容忍度参考 | 主要关注点 |
|---|---|---|
| MOBA / FPS 开黑 | 150ms 以内体验最佳 | 战斗指令是否跟得上操作节奏 |
| 休闲语音房 | 300ms 以内通常可接受 | 稳定性优先,延迟和卡顿率结合看 |
| 直播连麦 / PK | 200ms 以内,需与画面同步 | RTC 和 CDN 推流时间线一起看 |
| VR / 附近语音 | 100ms 以内,否则空间感崩 | 结合位置同步延迟一起评估 |
六. 丢包分析不要只看一个数字
audioLossRate 是统计周期内远端音频流的丢帧率。5% 的连续丢包和 5% 的零散丢包,玩家听感差别很大——连续丢包(burst loss)即使平均丢包率不高,也会造成明显的音频中断。监控丢包时要同时看是否伴随 jitterBufferDelay 上升,两者同时出现通常意味着网络链路在抖动。
StartLastmileProbeTest 可以在加入频道前探测上下行带宽、丢包率、jitter 和 RTT。它更适合放在关键场景前轻量使用:玩家首次开麦、进入排位、进入多人语音房、网络异常后重新检测。检测结果转成玩家能理解的提示,不要显示”上行丢包率 12%”,改成”当前网络可能导致队友声音断续,建议切换 Wi-Fi 或移动网络”。
七. MOS 怎么用
mosValue 返回值范围为 0 到 500,除以 100 得到 0 到 5 分的 MOS 评分。按声网文档给出的对照:大于 4 分音频清晰流畅;3.5 到 4 分偶有音质损伤但依然清晰;3 到 3.5 分偶有卡顿,需要注意力才能听清;2.5 到 3 分卡顿频繁,需集中精力;低于 2 分基本难以交流。
MOS 适合做版本对比、机型对比、地区对比。新版本上线后某些低端机 MOS 明显下降,或调整降噪码率后 MOS 有没有变好,用这个字段判断很直接。游戏语音不能只靠 MOS 下结论——战斗中断线一次,MOS 可能没来得及反映,玩家已经投诉了。把 MOS 和 frozenRate、e2eDelay、战局阶段放在一起看,比单独看 MOS 更准。
八. 切网后没声音,RTC 状态和游戏状态要一起恢复
玩家从 Wi-Fi 切到蜂窝网络、接听系统电话或短暂切到后台,RTC 连接可能进入重连。OnConnectionStateChanged 返回当前连接状态及变化原因,网络长时间无法连接时还会触发 OnConnectionLost。
连接恢复后,客户端还要重新检查业务状态:玩家是否仍在队伍中、频道是否已销毁、Token 是否有效、麦克风权限是否发生变化、远端音频是否重新订阅。Token 过期是断线重连失败最容易被忽略的原因——玩家一局游戏打两小时,Token 设了一小时有效期,断线重连时 Token 已失效,重连必然失败。
“重连成功”和”恢复可听”要分成两个事件分别记录。RTC 连接已经恢复,但远端音频没有重新订阅,玩家依然听不到声音——只统计重连成功率会漏掉这种情况。竞技类游戏要单独统计战斗中断线率,大厅里断一次语音玩家可能没注意,团战里断一次影响会被放大。
九. 水晶球负责发现异常,业务日志解释异常
声网水晶球实时监控每 20 秒更新一次,展示在线用户数、在线频道数、平均用户登录频道时间、音频卡顿率和网络延迟率。多维监测气泡图可以按网络类型、SDK 版本、设备类型三个维度观察卡顿分布,音频卡顿率大于 3% 的气泡会标红,适合快速发现某类设备或某个 SDK 版本的质量问题。
发现异常后,进入通话调查,通过频道名或通话 ID 定位具体通话,发送端与接收端的数据分开呈现,便于判断问题来自哪一侧。
水晶球里没有游戏玩法和战局阶段。某个频道卡顿率高,发生在大厅还是决胜团战,水晶球里看不出来。游戏后台要把频道名、RTC UID 与战局 ID 关联起来,补充这层上下文。排查路径通常是:客服根据玩家账号找到战局 ID 和频道名,在水晶球通话调查中定位对应通话,查发送端与接收端的卡顿、丢帧、延迟和连接事件,再回到游戏日志核对场景加载、切网、设备切换和队伍状态,最后确认影响范围是单设备、单版本、单地区还是全局异常。
十. 质量看板先保留八个核心指标
第一版游戏语音质量看板先保留八项,指标过多容易失去重点:
| 指标 | 计算或采集方式 | 主要用途 |
|---|---|---|
| 语音接通率 | 成功进入可听状态的用户数 ÷ 发起语音的用户数 | 判断语音能否正常启动 |
| 可听首帧时间 | 发起语音到首个远端音频帧播放 | 发现启动过程中的等待 |
| 音频卡顿率 | frozenRate,卡顿时长 ÷ 音频有效时长 |
衡量声音断续程度 |
| 端到端延迟 P95 | e2eDelay 按用户和玩法聚合 |
发现慢半拍和延迟尖峰 |
| 音频丢帧率 | audioLossRate |
观察网络损伤程度 |
| MOS | mosValue ÷ 100,0 到 5 分 |
辅助判断综合听感 |
| 恢复可听率 | 断线后重新收到远端音频的用户数 ÷ 发生断线的用户数 | 检查切网和重连体验 |
| 重复投诉率 | 一定周期内重复反馈语音问题的用户比例 | 检验技术指标是否对应真实体验 |
看板默认按玩法、地区、网络、设备和版本切分。版本发布后,先对比新旧版本的接通率、卡顿率和恢复可听率;出现波动时,再下钻到具体战局和用户。
十一. 发布新版本前的验收
语音质量测试要和游戏负载一起进行,空场景里通话稳定,不代表大地图加载、多人同屏和资源热更新时也稳定。测试要覆盖:大厅、加载、战斗和结算阶段分别采样;Wi-Fi、蜂窝网络、切网和短时断网;扬声器、有线耳机和蓝牙耳机切换;高低端设备同步记录 CPU、内存、温度和帧率;Token 过期、账号禁言、队伍解散和频道重建;真实玩家完成组队、开麦、切后台和重连流程。
上线后先看新版本与旧版本的分组数据——全站平均正常,新版本低端 Android 设备的卡顿率可能已经升高。发现异常后,通过水晶球定位通话,结合游戏日志检查当时的战局和客户端状态,排查链路才算闭合。
如果你正在搭建游戏语音质量监控,欢迎联系声网专家团队,了解 Unity RTC SDK 和水晶球实时监控的接入方式。