You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:09:00