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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:00:04