webrtc onaddstream not being called on first peer
我创建了下面的脚本,它是混合应用程序的一部分,有时它运行正常,我可以接收/发送音频/视频呼叫,但有时甚至没有从发送方调用
在这里发送来自
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | sendOffer() { let that = this; that.call_status = 'connecting'; let call_type; if (that.call_type == 'audio') call_type = { video: false, audio: true }; else call_type = { video: true, audio: true }; that.pc = new RTCPeerConnection(that.peerConnectionConfig); that.haveGum = navigator.mediaDevices.getUserMedia(call_type) .then(stream => { that.pc.addStream(that.from_video.nativeElement.srcObject = stream); that.from_video.nativeElement.style.display = 'block'; }).then(() => that.pc.createOffer()) .then(d => that.pc.setLocalDescription(d)) .catch(log => { alert(log) }); that.pc.oniceconnectionstatechange = function (e) { that.call_status = that.pc.iceConnectionState; if (that.pc.iceConnectionState == 'disconnected') { console.log('Disconnected'); } } that.pc.onaddstream = e => { that.to_video.nativeElement.srcObject = e.stream; }; that.pc.onicecandidate = e => { if (e.candidate) { return; } that.offerSent = true; that.socket.emit('sdp-offer', { from: that.user, sdp: that.pc.localDescription.sdp, call_type: call_type }); }; that.socket.on('sdp-offer-reply', (sdp: any) => { that.pc.setRemoteDescription(new RTCSessionDescription(({ type:"answer", sdp: sdp.sdp }))).catch(log => console.log(log)); }); that.socket.on('call-closed', (sdp: any) => { that.closeConnection(); }); } |
在其他设备上
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | answerCall() { let that = this; let call_type; if (this.call_type == 'audio') call_type = { video: false, audio: true }; else call_type = { video: true, audio: true }; that.pc2 = new RTCPeerConnection(this.peerConnectionConfig); that.haveGum = navigator.mediaDevices.getUserMedia(call_type) .then(stream => { that.pc2.addStream(this.from_video.nativeElement.srcObject = stream); }); that.pc2.oniceconnectionstatechange = function (e) { console.log(that.pc2.iceConnectionState); } that.pc2.onaddstream = e => { that.to_video.nativeElement.srcObject = e.stream; that.to_video.nativeElement.style.display = 'block'; }; if (that.pc2.signalingState !="stable") { that.call_status = that.pc2.signalingState; alert("not stable"); return; } that.pc2.setRemoteDescription(new RTCSessionDescription(({ type:"offer", sdp: this.sdp.sdp }))) .then(() => that.pc2.createAnswer()) .then(d => { that.sendSdpAnswer = d; that.pc2.setLocalDescription(d); this.call_connected = true; }) .catch(log => console.log(log)); that.pc2.onicecandidate = e => { if (e.candidate) { console.log("not e.candidate"); return; } that.socket.emit('offeraccepted', { from: that.user, sdp: that.sendSdpAnswer.sdp }); }; that.socket.on('call-closed', (sdp: any) => { that.closeConnection(); that.call_status ="Hung Up"; }); } |
这是我调用的最终函数,用于在通话结束时关闭双方的对等连接:
1 2 3 4 5 6 7 8 | closeConnection() { if (typeof this.pc !=="undefined" && this.pc.signalingState !="closed") { this.pc.close(); } if (typeof this.pc2 !=="undefined" && this.pc2.signalingState !="closed") { this.pc2.close(); } } |
我正在使用 webrtc latest-adapter.js 和 socket.io 作为信号服务器。首先,我在
创建报价时我必须通过约束:
1 2 3 4 | this.pc.createOffer({ offerToReceiveAudio: 1, offerToReceiveVideo: 1 }) |