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
相关产品推荐
相关产品推荐

