javascript 无法在 webrtc 中添加远程冰候选

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23325510/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 00:43:53  来源:igfitidea点击:

Not able to add remote ice candidate in webrtc

javascriptwebwebrtc

提问by CodeQ

I am trying to establish a p2p audio/video connection b/w 2 peers. Peer P1 sends an offer to peer P2. On getting offer, P2 does-

我正在尝试建立 b/w 2 个对等点的 p2p 音频/视频连接。对等方 P1 向对等方 P2 发送要约。拿到offer后,P2确实——

{
    pc = new RTCPeerConnection(ice);
    pc.setRemoteDescription(new RTCSessionDescription(msg.offer),
            onSetRemoteDescriptionSuccess, onSetSessionDescriptionError);                    

    function onSetRemoteDescriptionSuccess() {
        console.log('onSetRemoteDescriptionSuccess called');                                 
    }                                                                                        

    function onSetSessionDescriptionError() {
        console.log('onSetSessionDescriptionError called');                                  
    }                                                                                        

    pc.onicecandidate = function(evt) {                                                      
        if (evt.candidate) {
            console.log('got local icecandidate', evt.candidate);                            
            send_ice_candicate(evt.candidate.sdpMLineIndex,                                  
                      evt.candidate.sdpMid,
                      evt.candidate.candidate                                                
                      );                                                                     
        }                                                                                    
    }                                                                                        

    pc.onaddstream = function (evt) {
        var remote_video = document.getElementById('remote_video');                          
        remote_video.src = window.URL.createObjectURL(evt.stream);                           
    }                                                                                        

    navigator.getUserMedia({ "audio": true, "video": true },                                 
            gotStream, logError);
} 

function gotStream(stream) {                                                                     
    pc.addStream(stream);                                                                        

    var local_video = document.getElementById('local_video');                                    
    local_video.src = window.URL.createObjectURL(stream);                                        

    pc.createAnswer(function(answer) {
        pc.setLocalDescription(answer);
        console.log('creating answer', answer.sdp)                                           
        signalingChannel.send(answer.sdp);                                                 
        });
    got_ice_candidate(remote_ice_candidate);                                                     
}                                     

remote_ice_candidate is something which was received before offer and hence is buffered and I am trying to add after the answer is ready and other pre-requisites are done.

remote_ice_candidate 是在报价之前收到的东西,因此被缓冲,我试图在答案准备好并完成其他先决条件后添加。

But still I am getting error while trying to add remote ice candidate.

但是我在尝试添加远程冰候选时仍然出错。

Peer connection object on P2 looks like-

P2 上的对等连接对象看起来像-

RTCPeerConnection {ondatachannel: null, oniceconnectionstatechange: null, onremovestream: null, onaddstream: function, onsignalingstatechange: null…}
iceConnectionState: "new"
iceGatheringState: "gathering"
localDescription: RTCSessionDescription
sdp: "v=0
?o=- 5043546633484176483 2 IN IP4 127.0.0.1
?s=-
?t=0 0
?a=group:BUNDLE audio video
?a=msid-semantic: WMS irIWtGZ87WFi8P6XH94I85sUsKYcu775glZk
?m=audio 10990 RTP/SAVPF 111 103 104 0 8 106 105 13 126
?c=IN IP4 122.171.69.180
?a=rtcp:1 IN IP4 0.0.0.0
?a=candidate:3022624816 1 udp 2122260223 192.168.1.4 50063 typ host generation 0
?a=candidate:4205470912 1 tcp 1518280447 192.168.1.4 0 typ host generation 0
?a=candidate:494278629 1 udp 1686052607 122.171.69.180 10990 typ srflx raddr 192.168.1.4 rport 50063 generation 0
?a=ice-ufrag:1ZCyumc5I0T8mbFJ
?a=ice-pwd:+JUisFsiKa8ezPXDIuzu99tv
?a=fingerprint:sha-256 BE:16:E6:7B:C8:18:E6:B9:50:D9:31:F3:24:85:3B:63:26:BA:EA:6B:5D:F4:4E:0E:29:47:16:C0:1D:9D:B7:F3
?a=setup:active
?a=mid:audio
?a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
?a=sendrecv
?a=rtcp-mux
?a=rtpmap:111 opus/48000/2
?a=fmtp:111 minptime=10
?a=rtpmap:103 ISAC/16000
?a=rtpmap:104 ISAC/32000
?a=rtpmap:0 PCMU/8000
?a=rtpmap:8 PCMA/8000
?a=rtpmap:106 CN/32000
?a=rtpmap:105 CN/16000
?a=rtpmap:13 CN/8000
?a=rtpmap:126 telephone-event/8000
?a=maxptime:60
?a=ssrc:2173896727 cname:PZV2reyyZuw6KufJ
?a=ssrc:2173896727 msid:irIWtGZ87WFi8P6XH94I85sUsKYcu775glZk fb1b496d-ffa9-43cd-940a-7c68df86d3b3
?a=ssrc:2173896727 mslabel:irIWtGZ87WFi8P6XH94I85sUsKYcu775glZk
?a=ssrc:2173896727 label:fb1b496d-ffa9-43cd-940a-7c68df86d3b3
?m=video 10990 RTP/SAVPF 100 116 117
?c=IN IP4 122.171.69.180
?a=rtcp:1 IN IP4 0.0.0.0
?a=candidate:3022624816 1 udp 2122260223 192.168.1.4 50063 typ host generation 0
?a=candidate:4205470912 1 tcp 1518280447 192.168.1.4 0 typ host generation 0
?a=candidate:494278629 1 udp 1686052607 122.171.69.180 10990 typ srflx raddr 192.168.1.4 rport 50063 generation 0
?a=ice-ufrag:1ZCyumc5I0T8mbFJ
?a=ice-pwd:+JUisFsiKa8ezPXDIuzu99tv
?a=fingerprint:sha-256 BE:16:E6:7B:C8:18:E6:B9:50:D9:31:F3:24:85:3B:63:26:BA:EA:6B:5D:F4:4E:0E:29:47:16:C0:1D:9D:B7:F3
?a=setup:active
?a=mid:video
?a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
?a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
?a=sendrecv
?a=rtcp-mux
?a=rtpmap:100 VP8/90000
?a=rtcp-fb:100 ccm fir
?a=rtcp-fb:100 nack
?a=rtcp-fb:100 nack pli
?a=rtcp-fb:100 goog-remb
?a=rtpmap:116 red/90000
?a=rtpmap:117 ulpfec/90000
?a=ssrc:2118221653 cname:PZV2reyyZuw6KufJ
?a=ssrc:2118221653 msid:irIWtGZ87WFi8P6XH94I85sUsKYcu775glZk a735b317-1752-40fa-96df-511c0febb55e
?a=ssrc:2118221653 mslabel:irIWtGZ87WFi8P6XH94I85sUsKYcu775glZk
?a=ssrc:2118221653 label:a735b317-1752-40fa-96df-511c0febb55e
?"
type: "answer"
__proto__: RTCSessionDescription
onaddstream: function (evt) {
arguments: null
caller: null
length: 1
name: ""
prototype: Object
__proto__: function Empty() {}
<function scope>
ondatachannel: null
onicecandidate: function (evt) {
oniceconnectionstatechange: null
onnegotiationneeded: null
onremovestream: null
onsignalingstatechange: null
remoteDescription: RTCSessionDescription
sdp: "v=0
?o=- 8847796014807563532 2 IN IP4 127.0.0.1
?s=-
?t=0 0
?a=group:BUNDLE audio video
?a=msid-semantic: WMS na7tuNpnYZpmg56IJULDdF8oMUG8V5ndTjkK
?m=audio 1 RTP/SAVPF 111 103 104 0 8 106 105 13 126
?c=IN IP4 0.0.0.0
?a=rtcp:1 IN IP4 0.0.0.0
?a=ice-ufrag:mfL29tarMKRBN9F/
?a=ice-pwd:/my1DZo1Yjne4BrcQGKN1o3I
?a=ice-options:google-ice
?a=fingerprint:sha-256 BE:16:E6:7B:C8:18:E6:B9:50:D9:31:F3:24:85:3B:63:26:BA:EA:6B:5D:F4:4E:0E:29:47:16:C0:1D:9D:B7:F3
?a=setup:actpass
?a=mid:audio
?a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
?a=sendrecv
?a=rtcp-mux
?a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:ggGTdSmkygu0aVidv2M6kO25w5DX/OknOXFnRBYK
?a=rtpmap:111 opus/48000/2
?a=fmtp:111 minptime=10
?a=rtpmap:103 ISAC/16000
?a=rtpmap:104 ISAC/32000
?a=rtpmap:0 PCMU/8000
?a=rtpmap:8 PCMA/8000
?a=rtpmap:106 CN/32000
?a=rtpmap:105 CN/16000
?a=rtpmap:13 CN/8000
?a=rtpmap:126 telephone-event/8000
?a=maxptime:60
?a=ssrc:702054304 cname:++QJWJ3eyXhSOSgH
?a=ssrc:702054304 msid:na7tuNpnYZpmg56IJULDdF8oMUG8V5ndTjkK 054d6450-034f-48ca-85dc-3a843c7f7554
?a=ssrc:702054304 mslabel:na7tuNpnYZpmg56IJULDdF8oMUG8V5ndTjkK
?a=ssrc:702054304 label:054d6450-034f-48ca-85dc-3a843c7f7554
?m=video 1 RTP/SAVPF 100 116 117
?c=IN IP4 0.0.0.0
?a=rtcp:1 IN IP4 0.0.0.0
?a=ice-ufrag:mfL29tarMKRBN9F/
?a=ice-pwd:/my1DZo1Yjne4BrcQGKN1o3I
?a=ice-options:google-ice
?a=fingerprint:sha-256 BE:16:E6:7B:C8:18:E6:B9:50:D9:31:F3:24:85:3B:63:26:BA:EA:6B:5D:F4:4E:0E:29:47:16:C0:1D:9D:B7:F3
?a=setup:actpass
?a=mid:video
?a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
?a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
?a=sendrecv
?a=rtcp-mux
?a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:ggGTdSmkygu0aVidv2M6kO25w5DX/OknOXFnRBYK
?a=rtpmap:100 VP8/90000
?a=rtcp-fb:100 ccm fir
?a=rtcp-fb:100 nack
?a=rtcp-fb:100 nack pli
?a=rtcp-fb:100 goog-remb
?a=rtpmap:116 red/90000
?a=rtpmap:117 ulpfec/90000
?a=ssrc:846853801 cname:++QJWJ3eyXhSOSgH
?a=ssrc:846853801 msid:na7tuNpnYZpmg56IJULDdF8oMUG8V5ndTjkK c0dde33c-f422-4774-9f7b-65cec136e107
?a=ssrc:846853801 mslabel:na7tuNpnYZpmg56IJULDdF8oMUG8V5ndTjkK
?a=ssrc:846853801 label:c0dde33c-f422-4774-9f7b-65cec136e107
?"
type: "offer"
__proto__: RTCSessionDescription
signalingState: "stable"
__proto__: RTCPeerConnection    

The error that I get is

我得到的错误是

Failed to add Ice Candidate: Error processing ICE candidate      

回答by liosedhel

I don't know exactly from where you have remote_ice_candidate object. But to deal proper with ice messages you should have something like this:

我不知道你从哪里有 remote_ice_candidate 对象。但是要正确处理冰消息,你应该有这样的东西:

First: On ice candidate event you should send it to other peer. e.g.:

第一:在 ice 候选事件中,您应该将其发送给其他对等方。例如:

pc.onicecandidate = function (event) {
    if (!event || !event.candidate) return;
    socket.emit("iceCandidate", event.candidate); //send ice candidate through your signaling server to other peer
};

Then: We should also listen on "iceCandidate" message from signaling server and add ice candidate to RTCPeerConnection e.g. :

然后:我们还应该监听来自信令服务器的“iceCandidate”消息并将 ice 候选添加到 RTCPeerConnection 例如:

socket.on("iceCandidate", function(iceCandidate){
  pc.addIceCandidate(new RTCIceCandidate(iceCandidate));
});

And that's all. From my observation, exchanging ice messages starts after offer/answer communication, so until then you should not have ice candidate object ready. Of course this code work only in chrome.

就这样。根据我的观察,在提供/回答通信之后开始交换冰消息,所以在那之前你不应该准备好冰候选对象。当然,此代码仅适用于 chrome。