Flutter 颤振-WebRTC:不在WIFI上工作/在移动数据上工作
我正在使用FlatterWebRTC创建P2P视频通话 我遇到了一个与网络相关的问题:我已经完成了应用程序,但它只适用于移动数据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
_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');
}