





















用户反馈在聊天开麦说话,后端没有收到活跃的数据,聊天室是基于Web-RTC实现的,活跃数据是根据RTC的回调获取的,
在RTC后台查询发现确实用户开麦了,但是采集到的音量一直是0,像是用户一直没说话;
分析后发现,这些用户都是使用了前端自定义的录音功能,自定义录音是使用 mediaRecorder 进行了录音,并且这次录音跟Web-RTC使用的麦克风ID 是一样的
相当于 同一时段内存在多路麦克风使用(RTC 一路 + 再 getUserMedia 一路),就是说有两个线程对系统麦克风进行了抢占使用;
在外置声卡 + 厂商驱动的机器上反馈更多,且往往不是必现。
| 表现 | 说明 |
|---|---|
| 音量长时间为 0 或接近静音 | 不是偶发丢包,而是一段时间内持续异常 |
| 与「多路采麦」时间重叠 | RTC 已占用麦克风期间,页面又拉起第二路采集时更容易出现 |
| 外置声卡用户比例偏高 | 驱动/路由更复杂;集成麦 + 系统默认栈相对省事 |
| 同机同版本也可能时好时坏 | 与驱动设置、其它占麦软件、负载等有关 |
对同一物理设备多次 getUserMedia(含指定 deviceId),一般会得到多条独立轨道,规范上 允许 多路并存,因此不是 「标准禁止双开」 这一句话能解释所有问题。
deviceId(一路默认、一路指定错),可能一路对真麦、一路对空设备。getUserMedia 采完不关:MediaStreamTrack 不 stop,会长时间占着第二路消费者,与 RTC 并发时间拉长。做法:从 RTC 本地音频对象取出已发布的 MediaStreamTrack(具体 API 依 SDK 而定),再 new MediaStream([track]) 交给 MediaRecorder 等,不再为录音单独 getUserMedia。
getUserMedia,但用完立即释放做法:业务录音仍单独 getUserMedia,在录音结束、失败或取消时对这一路 stream.getTracks().forEach(t => t.stop()),必要时清空引用。
stop() 后第二路消费者结束,不再与 RTC 并发争同一设备;RTC 那一路若仍正常发布,后续音量应能回到「只有一路采集」时的表现。小结:
chrome://webrtc-internals 或等价手段)。getUserMedia、MediaStreamTrack、WebRTC、多路麦克风、声卡驱动、MediaRecorder、音量指示
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。