Flutter 颤振-WebRTC:不在WIFI上工作/在移动数据上工作

Flutter 颤振-WebRTC:不在WIFI上工作/在移动数据上工作,flutter,networking,webrtc,p2p,stun,Flutter,Networking,Webrtc,P2p,Stun,我正在使用FlatterWebRTC创建P2P视频通话 我遇到了一个与网络相关的问题:我已经完成了应用程序,但它只适用于移动数据 _createPeer() async { try { if (_peerConnection != null) return; navigator.getUserMedia(mediaConstraints).then((stream) { _localStream = stream; _localR

我正在使用FlatterWebRTC创建P2P视频通话

我遇到了一个与网络相关的问题:我已经完成了应用程序,但它只适用于移动数据

_createPeer() async {
    try {
      if (_peerConnection != null) return;

      navigator.getUserMedia(mediaConstraints).then((stream) {
        _localStream = stream;
        _localRenderer.srcObject = stream;
      });

      _peerConnection = await createPeerConnection(configuration, constraints);

      _peerConnection.onSignalingState = _onSignalingState;
      _peerConnection.onIceGatheringState = _onIceGatheringState;
      _peerConnection.onIceConnectionState = _onIceConnectionState;
      _peerConnection.onAddStream = _onAddStream;
      _peerConnection.onRemoveStream = _onRemoveStream;
      _peerConnection.onIceCandidate = _onCandidate;
      _peerConnection.onRenegotiationNeeded = _onRenegotiationNeeded;

      _peerConnection.addStream(_localStream);

      RTCSessionDescription offer =
          await _peerConnection.createOffer(_offer_constraints);
      _peerConnection.setLocalDescription(offer);

      socket.emit('add-student', [
        {'room': room, 'offer': offer.sdp}
      ]);
    } catch (e) {
      _snackBar(e.toString());
    }
  }

  _onSignalingState(RTCSignalingState state) {
    // _snackBar(state.toString());
  }

  _onIceGatheringState(RTCIceGatheringState state) {
    // _snackBar(state.toString());
  }

  _onIceConnectionState(RTCIceConnectionState state) {
    _snackBar(state.toString());
  }

  _onAddStream(MediaStream stream) {
    if (stream == null) {
      _snackBar('null');
      return;
    }
    _progressVisible = false;
    _buttonsVisible = true;
    _remoteRenderer.srcObject = stream;
    setState(() {});
  }

  _onRemoveStream(MediaStream stream) {
    _snackBar('remove');
  }

  _onCandidate(RTCIceCandidate candidate) {
    socket.emit('studentCandidate', [
      {
        'room': room,
        'candidate': {
          'candidate': candidate.candidate,
          'sdpMid': candidate.sdpMid,
          'sdpMLineIndex': candidate.sdpMlineIndex
        }
      }
    ]);
  }

  _onRenegotiationNeeded() {
    _snackBar('reneg');
  }
将网络更改为WiFi时,网络不工作,连接状态挂起检查


我使用谷歌社区STUN/TURN服务器和Node JS socket.io发送信号。当手机不在同一个网络上,但只有移动数据时,它也能工作。

我知道很少有公共STUN服务器,但有公共转向服务器吗?在这两种情况下,您的问题似乎与NAT有关,并且缺少使用正确的TURN服务器。在WIFI上,您的计算机位于路由器后面,因此其他人无法直接连接到它。@user482594计算机和手机都在同一WIFI上。但是wifi和移动设备中的计算机可以使用移动数据。但是wifi中的计算机和wifi中的移动设备不工作。@user482594应用程序的使用基于kurento。播音员和观众部分。移动设备在使用移动数据时接收视频,而不是在使用wifi时接收视频。如果wifi和移动数据同时开启,则会自动选择移动数据路由。我需要它来强制WIFI路由。您的问题缺少您在评论中添加的详细信息。您可能需要详细说明有关设置的问题,例如什么在工作,什么不在工作,您尝试了什么,以及一些代码示例。应用程序是在Flatter Webrtc中创建的,该应用程序在移动数据上运行良好,但在wifi连接上使用时,Webrtc ice处于检查状态。在Flatter中允许wifi连接,并且能够通过wifi连接到信令服务器。但问题是webrtc自动使用移动网络作为mediastream的传输介质,并根据移动网络生成ice候选。是的,观察到同样的问题,适用于移动数据/4G,但不适用于wifi
_createPeer() async {
    try {
      if (_peerConnection != null) return;

      navigator.getUserMedia(mediaConstraints).then((stream) {
        _localStream = stream;
        _localRenderer.srcObject = stream;
      });

      _peerConnection = await createPeerConnection(configuration, constraints);

      _peerConnection.onSignalingState = _onSignalingState;
      _peerConnection.onIceGatheringState = _onIceGatheringState;
      _peerConnection.onIceConnectionState = _onIceConnectionState;
      _peerConnection.onAddStream = _onAddStream;
      _peerConnection.onRemoveStream = _onRemoveStream;
      _peerConnection.onIceCandidate = _onCandidate;
      _peerConnection.onRenegotiationNeeded = _onRenegotiationNeeded;

      _peerConnection.addStream(_localStream);

      RTCSessionDescription offer =
          await _peerConnection.createOffer(_offer_constraints);
      _peerConnection.setLocalDescription(offer);

      socket.emit('add-student', [
        {'room': room, 'offer': offer.sdp}
      ]);
    } catch (e) {
      _snackBar(e.toString());
    }
  }

  _onSignalingState(RTCSignalingState state) {
    // _snackBar(state.toString());
  }

  _onIceGatheringState(RTCIceGatheringState state) {
    // _snackBar(state.toString());
  }

  _onIceConnectionState(RTCIceConnectionState state) {
    _snackBar(state.toString());
  }

  _onAddStream(MediaStream stream) {
    if (stream == null) {
      _snackBar('null');
      return;
    }
    _progressVisible = false;
    _buttonsVisible = true;
    _remoteRenderer.srcObject = stream;
    setState(() {});
  }

  _onRemoveStream(MediaStream stream) {
    _snackBar('remove');
  }

  _onCandidate(RTCIceCandidate candidate) {
    socket.emit('studentCandidate', [
      {
        'room': room,
        'candidate': {
          'candidate': candidate.candidate,
          'sdpMid': candidate.sdpMid,
          'sdpMLineIndex': candidate.sdpMlineIndex
        }
      }
    ]);
  }

  _onRenegotiationNeeded() {
    _snackBar('reneg');
  }