WebRTC安卓端发起Offer呼叫Web端时Web侧无法显示远端流求助
问题根因及修复方案
你遇到的安卓WebRTC与Web端互通单边无流的问题,是多个典型的WebRTC跨端兼容问题叠加导致的,按优先级排查修复即可:
1. 最高优先级:修复SDP发送时序问题
你当前代码的致命问题是在setLocalDescription异步操作完成前就发送了Offer SDP:
override fun onCreateSuccess(sessionDescription: SessionDescription?) { peerConnection.setLocalDescription(CustomSdpObserver(), sessionDescription) // 错误:setLocalDescription还未执行完成就发送SDP if (sessionDescription != null) { // sending sessionDescription from here } }
setLocalDescription是异步操作,安卓原生WebRTC对时序容错性高,所以安卓之间互通正常,但浏览器端WebRTC实现非常严格,未完成本地协商的SDP会被直接判定为无效,导致后续媒体流协商失败。
修复方式:将SDP发送逻辑放到setLocalDescription的成功回调中:
peerConnection.setLocalDescription(object : CustomSdpObserver() { override fun onSetSuccess() { super.onSetSuccess() // 这里才是正确的发送时机 if (sessionDescription != null) { SignalingServer.get()?.sendOffer(sessionDescription) } } }, sessionDescription)
2. 第二优先级:修复编解码器兼容问题
安卓硬件编码器默认输出的H264 High Profile编码,大部分桌面/移动端浏览器都不支持,优先修改编码优先级:
在生成Offer SDP之后、设置本地SDP之前,修改SDP内容,将VP8/VP9或者H264 Baseline Profile放到编码列表最前面,过滤掉不兼容的高 profile 编码。
3. 第三优先级:确认Web端事件监听正确
现代浏览器WebRTC已经废弃了旧的onaddstream事件,必须监听ontrack事件才能获取到远端流:
// Web端正确监听方式 peerConnection.ontrack = (event) => { const remoteStream = event.streams[0]; // 赋值给video元素的srcObject remoteVideo.srcObject = remoteStream; }
不要使用peerConnection.onaddstream,这个接口在2020年之后的所有主流浏览器中都已经被移除。
4. 可选验证项
如果上述修改完成还是有问题,按顺序排查:
- 确认Web端PeerConnection配置和安卓端匹配:
rtcpMuxPolicy设置为require,bundlePolicy设置为max-bundle,和安卓端配置对齐 - 在Web端打印
peerConnection.iceConnectionState,确认ICE状态最终走到connected或completed,排除ICE协商失败的问题 - 检查安卓端添加的媒体流Track是否不为空,且
enabled属性为true
内容的提问来源于stack exchange,提问作者Soumik Bhattacharjee
相关产品推荐
相关产品推荐

