React Native Android WebRTC语音聊天LTE转WiFi连接失败求助
React Native Android WebRTC实时语音聊天跨网络连接问题求助
我在React Native Android中实现WebRTC实时语音聊天功能,最初使用coturn搭建TURN服务器,因怀疑配置有误更换为付费的ExpressTURN服务器后,WebRTC仅能在本地环境正常通信;仅使用coturn时,LTE转WiFi场景可正常通信。
通信基于HTTPS协议,但使用的是自签名根证书,且未部署到TURN服务器上,目前无法定位问题原因,恳请有相关经验的开发者协助排查解决。
连接测试结果
wifi(私有网络) -> wifi(私有网络) = successlte -> lte = successwifi(私有网络) -> lte = successlte -> wifi(私有网络) = failurewifi(热点) -> lte = successlte -> wifi(热点) = failure
核心代码
async initialize() { try { await this.initializeData() this.peerConnection = new RTCPeerConnection({ iceServers: [ // { urls: 'stun:stun.l.google.com:19302' }, { urls: [ "turn:??", "turn:??", "turn:??", "turn:??", "turn:??", ], username: '??', credential: '??', } ] }) this.localStream = await mediaDevices.getUserMedia({ audio: true, video: false }) this.localStream.getTracks().forEach(track => this.peerConnection.addTrack(track, this.localStream)) // 对等连接事件 this.peerConnection.addEventListener('track', this.onTrackEvent) this.peerConnection.addEventListener('icecandidate', this.onIcecandidateEvent) this.peerConnection.addEventListener('connectionstatechange', (event) => { console.log(`connectionState`, this.peerConnection?.connectionState) }) this.peerConnection.addEventListener('iceconnectionstatechange', (event) => { console.log(`iceConnectionState`, this.peerConnection?.iceConnectionState) }) this.peerConnection.addEventListener('signalingstatechange', () => { console.log(`signalingState`, this.peerConnection?.signalingState) }) } catch (error) { console.error(error) } } onTrackEvent = (event) => { try { this.remoteStream = event.streams[0] } catch (error) { console.error(error) } } onIcecandidateEvent = (event) => { try { if (event.candidate) { socketManager.socket?.emit('WebRTC_ICEcandidate', { target: id, candidate: event.candidate }) } } catch (error) { console.error(error) } } onIcecandidateEvent = (event) => { try { if (event.candidate) { socketManager.socket?.emit('WebRTC_ICEcandidate', { target: id, candidate: event.candidate }) } } catch (error) { console.error(error) } } async startOffer() { try { const offer = await this.peerConnection?.createOffer() await this.peerConnection?.setLocalDescription(offer) socket?.emit('WebRTC_startOffer', { target: id, offer: offer }) } catch (error) { console.error(error) } } async answerOffer({ offer }) { try { await this.peerConnection?.setRemoteDescription(offer) const answer = await this.peerConnection?.createAnswer() await this.peerConnection?.setLocalDescription(answer) socket?.emit('WebRTC_answerOffer', { target: id, answer: answer }) } catch (error) { console.error(error) } } async setRemoteOffer({ answer }) { try { await this.peerConnection?.setRemoteDescription(answer) } catch (error) { console.error(error) } } async setRemoteIceCandidate({ iceCandidate }) { try { if (this.peerConnection) { this.peerConnection?.addIceCandidate(new RTCIceCandidate(iceCandidate)) } } catch (error) { console.error(error) } }
内容的提问来源于stack exchange,提问作者이영준
相关产品推荐
相关产品推荐

