Flutter - WebRTC:不适用于 WIFI / 适用于移动数据

Sur*_*wal 5 networking p2p stun webrtc flutter

我正在使用 Flutter WebRTC 来创建 P2P 视频通话。

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

将网络更改为 WiFi 时,它不起作用并且连接状态挂起Checking

我使用 Google 社区 STUN/TURN 服务器和 Node JS socket.io 来发送信号。当移动设备不在同一网络上但仅使用移动数据时,它也可以工作。

Sur*_*wal 0

_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');
  }
Run Code Online (Sandbox Code Playgroud)