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

Flutter WebRTC在Android端崩溃:AddStream不适用于Unified Plan SdpSemantics

Flutter WebRTC在Android端崩溃:AddStream不适用于Unified Plan SdpSemantics

看起来你遇到的问题根源在崩溃日志里写得非常明确:

AddStream is not available with Unified Plan SdpSemantics. Please use AddTrack instead.

简单来说,新版本的WebRTC(包括flutter_webrtc在Android端的底层实现)已经默认启用Unified Plan SDP语义,旧的addStream方法已经被彻底废弃不再支持——这就是为什么代码在Web端还能正常运行(Web端通常会保留对旧API的兼容),但在Android端直接触发崩溃的原因。

具体修复步骤

你需要把代码里的旧API调用替换为Unified Plan支持的新API,主要涉及两个部分:

1. 替换本地流的添加方式

原来的代码中直接添加整个流的写法:

pc.addStream(_localStream!);

需要改成遍历本地流的音视频轨道,逐个添加到PeerConnection:

// 遍历本地流的所有音视频轨道,添加到PeerConnection
_localStream!.getTracks().forEach((track) {
  pc.addTrack(track, _localStream!);
});

2. 替换远程流的监听事件

原来监听onAddStream事件的写法:

pc.onAddStream = (stream) {
  print('addStream: ' + stream.id);
  _remoteVideoRenderer.srcObject = stream;
};

需要改成监听onTrack事件,这是Unified Plan标准下的正确方式:

pc.onTrack = (event) {
  print('onTrack: ' + event.streams[0].id);
  _remoteVideoRenderer.srcObject = event.streams[0];
};

修改后的完整_createPeerConnecion方法示例

_createPeerConnecion() async {
  Map<String, dynamic> configuration = {
    "iceServers": [
      {"url": "stun:stun.l.google.com:19302"},
    ]
  };

  final Map<String, dynamic> offerSdpConstraints = {
    "mandatory": {
      "OfferToReceiveAudio": true,
      "OfferToReceiveVideo": true,
    },
    "optional": [],
  };

  _localStream = await _getUserMedia();
  RTCPeerConnection pc =
      await createPeerConnection(configuration, offerSdpConstraints);

  // 替换addStream为addTrack
  _localStream!.getTracks().forEach((track) {
    pc.addTrack(track, _localStream!);
  });

  pc.onIceCandidate = (e) {
    if (e.candidate != null) {
      print(json.encode({
        'candidate': e.candidate.toString(),
        'sdpMid': e.sdpMid.toString(),
        'sdpMlineIndex': e.sdpMLineIndex,
      }));
    }
  };

  pc.onIceConnectionState = (e) {
    print(e);
  };

  // 替换onAddStream为onTrack
  pc.onTrack = (event) {
    print('onTrack: ' + event.streams[0].id);
    _remoteVideoRenderer.srcObject = event.streams[0];
  };

  return pc;
}

额外提醒

  • 你当前使用的flutter_webrtc: ^0.9.17版本已经默认启用Unified Plan,不需要额外配置SDP语义;
  • 修改完成后记得重新编译Android项目,因为底层Native代码的变更需要完整编译才能生效;
  • 这种修改方式同时兼容Web端,不会影响原有Web端的功能。

这样调整后,Android端的崩溃问题应该就能彻底解决了。

备注:内容来源于stack exchange,提问作者shapoor molaee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 07:18:06