Flutter WebRTC跨端通话异常:真实iOS与Android触发Stream空PlatformException
mediaStream AddTrack: Stream is null解决方案 问题背景
基于Flutter WebRTC开发通话功能,安卓设备间、安卓与iOS模拟器间、iOS模拟器与真实iOS设备间通话均正常,但真实iOS设备与安卓设备互通时,出现错误:PlatformException(mediaStream AddTrack: Stream is null, null, null, null)。
针对性解决方案
强制校验iOS媒体权限有效性
真实iOS设备对媒体权限的校验比模拟器严格,务必确保Info.plist中添加了NSCameraUsageDescription和NSMicrophoneUsageDescription字段并填写合理描述。同时在代码中使用权限库(如permission_handler)主动检查权限状态,只有在权限被用户授予后,再执行媒体流初始化操作。确保媒体流初始化完成后再执行Track添加
报错核心原因是执行addTrack时媒体流对象为空,检查代码中getUserMedia的调用逻辑,必须在Future完成(通过await或then回调)后,确认MediaStream实例不为null,再执行Track添加操作。示例代码:final mediaStream = await navigator.mediaDevices.getUserMedia({ 'audio': true, 'video': true, }); if (mediaStream != null && mediaStream.getAudioTracks().isNotEmpty) { peerConnection.addTrack(mediaStream.getAudioTracks()[0], mediaStream); } if (mediaStream != null && mediaStream.getVideoTracks().isNotEmpty) { peerConnection.addTrack(mediaStream.getVideoTracks()[0], mediaStream); }适配iOS音频会话配置
iOS的AVAudioSession对媒体资源占用有严格管控,在初始化WebRTC前主动配置音频会话类别:if (Platform.isIOS) { await FlutterWebRTC.setAudioSessionCategory(AudioSessionCategory.playAndRecord); await FlutterWebRTC.setAudioSessionActive(true); }升级WebRTC插件至稳定版
部分旧版flutter_webrtc插件存在跨平台Track交互的兼容性bug,执行flutter pub upgrade flutter_webrtc更新至最新稳定版本,同时执行cd ios && pod install同步iOS端依赖。排查SDP交换完整性
检查真实iOS与安卓设备间的SDP Offer/Answer交换日志,确认SDP内容中包含正确的媒体流描述。如果SDP缺失媒体信息,会导致后续Track添加时无法关联到有效流对象。
内容的提问来源于stack exchange,提问作者UITHCM

