Tutorial: WebRTC 已知问题及规避方案
Chrome
- 开启硬件加速,当出现丢包时,偶现视频花屏的问题。
解决方案:升级 Chrome 86+ 以及使用 TRTC Web SDK v4.6.6+ 版本。
- Chrome 88 开启硬件加速时,使用 HTMLMediaElement.captureStream 推 MP4 文件,远端拉流观看黑屏问题。Chrome 88 bug。
规避方案:
- 升级至 Chrome 90+ 版本。
- 可以通过 canvas.captureStream 采集 videoTrack,HTMLMediaElement.captureStream 采集 audioTrack 的方式规避。可参考: demo
- 可通过关闭硬件加速来规避。
- 注意,若推流端的 video/audio element 的 muted 为 true,HTMLMediaElement.captureStream 拿到的 audioTrack 是没声音的,需将 element 状态置为 false,captureStream 才会有声音。
但是 muted = false 时,推流端就会播放本地音频,若不想要本地音频播放,可以将 volume 设置为非0值,可以是 0.00001。详见:issue
- Mac Chrome 88(88.0.4324.96) 关闭硬件加速时,推摄像头采集的视频流,远端拉流观看黑屏问题。 Chrome 88 bug
规避方案:
- 升级 Chrome 88.0.4324.146+ 版本
- 保持开启硬件加速不会出现该问题(Chrome 默认是打开硬件加速的)
- Chrome 使用 deviceId 为 default 或 communications (Windows 设备下会有该 deviceId) 时,若插入新的麦克风,再拔出,可能会导致麦克风采集中断。
规避方案:
- 避免使用 deviceId 为 default 或 communications 的麦克风设备即可。
- Mac Chrome 开启硬件加速时,调用 LocalStream.muteVideo 再调用 LocalStream.unmuteVideo 可能会导致推流帧率掉至 2fps 无法恢复。Chrome bug。规避方案:
Firefox
- Firefox 不支持设置采集帧率,只能采集 30fps 的视频。
iOS Safari
- iOS Safari 频繁调用 stream.stop → stream.play 方法,会偶现远端流无声,但是各项数据正常。webkit bug
规避方案:
- 暂无较好的规避方案,建议避免在 iOS Safari 中频繁调用 stream.stop → stream.play 方法。
- iOS Safari 不支持多个 tab getUserMedia,否则前一个 tab 会停止采集,远端流也有可能出现黑屏无声。webkit bug
规避方案:
- iOS Safari 尚无计划支持多 tab getUserMedia 特性,若业务侧需要在 iOS Safari 使用多个 tab getUserMedia,建议在切换新 tab 之前,停止设备采集,在切换回来后,再恢复设备采集。
注:多个 tab getUserMedia 的业务场景一般有:在视频通话过程中,切换新 tab 进行人脸识别。
- iOS Safari 和 Mac Big Sur Safari 音视频互通,iOS Safari 观看 Mac Safari 的视频卡顿掉帧。
规避方案:暂无
- iOS 14.2 部分设备及 Mac Big Sur Safari,音频播放会有杂音。webkit bug
规避方案:
- iOS 设备升级 14.3 及其以上版本、Mac Big Sur 升级最新版本。
- 第一次打开 Safari 调用 localstream.play('local-stream', { muted: false } ) 播放本地流的声音,会出现声音延迟情况。
华为设备
- 华为浏览器、华为设备中的 Chrome 浏览器无法推流。由于华为设备的限制,对应浏览器不支持 H264 编码,因此无法推流。
屏幕分享
- Windows & Mac Chrome 浏览器屏幕分享某个 app 后,最小化会导致采集停止,fps = 0
- Windows 端使用 Chrome WebRTC 采集屏幕分享,选择应用窗口分享【微信】时,可能会出现黑屏,暂无法解决。
- Windows Chrome 使用 H264 编码,开启硬件加速时,屏幕分享码率可能无法达到目标码率,导致画质不及预期。可引导用户关闭硬件加速:浏览器中打开 chrome://settings/system,点击关闭硬件加速重启浏览器即可。
其他厂商
- 网易 WebRTC SDK 会改写 RTCPeerConnection.prototype.getStats 方法,返回的数据格式与标准 WebRTC 协议不一致。若同时引入 TRTC 和网易的 WebRTC SDK,TRTC 会拿不到音视频数据,导致无法向正常向仪表盘上报音视频通话数据。