Flutter WebRTC屏幕共享问题:远端仍接收摄像头流而非屏幕流
解决Flutter WebRTC屏幕共享远端接收摄像头画面的问题
你当前的代码仅完成了本地屏幕流的获取与渲染,但未将新的屏幕流同步到WebRTC的PeerConnection中,导致远端仍接收之前摄像头的媒体轨道。以下是具体解决步骤:
1. 替换PeerConnection中的媒体轨道
获取屏幕流后,需将原有摄像头视频轨道替换为屏幕流的视频轨道,同时按需处理音频轨道:
Future<void> makeScreenSharing() async { final mediaConstraints = <String, dynamic>{'audio': true, 'video': true}; try { var screenStream = await navigator.mediaDevices.getDisplayMedia(mediaConstraints); // 停止原有摄像头流(若存在) localStream?.getTracks().forEach((track) => track.stop()); localStream = screenStream; localRenderer.srcObject = localStream; // 替换PeerConnection中的发送轨道 if (peerConnection != null) { final screenVideoTrack = screenStream.getVideoTracks().first; final screenAudioTrack = screenStream.getAudioTracks().firstOrNull; // 遍历现有发送轨道,替换视频/音频轨道 final senders = peerConnection!.getSenders(); for (var sender in senders) { if (sender.track?.kind == 'video') { await sender.replaceTrack(screenVideoTrack); } else if (sender.track?.kind == 'audio' && screenAudioTrack != null) { await sender.replaceTrack(screenAudioTrack); } } } } catch (e) { print(e.toString()); } }
2. 触发SDP重新协商(部分场景必需)
若替换轨道后远端仍未收到屏幕流,需重新发起Offer/Answer流程,让远端更新媒体会话:
// 在替换轨道后添加以下代码 if (peerConnection != null) { final offer = await peerConnection!.createOffer(); await peerConnection!.setLocalDescription(offer); // 用你原有信令逻辑将新Offer发送给远端 sendSignalingMessage(offer.toMap()); }
关键说明
- 确保已初始化
peerConnection对象,且之前已建立基础WebRTC连接。 - 停止原有摄像头轨道可避免资源浪费,防止远端持续接收旧流。
- 部分浏览器或平台需重新协商SDP才能让远端识别新轨道,若替换轨道无效,务必尝试重新发起Offer。
内容的提问来源于stack exchange,提问作者Ardeshir ojan
相关产品推荐
相关产品推荐

