WebRTC RTCPeerConnection not established
WebRTC RTCPeerConnection not established
我的简单WebRTC javascript代码无法按预期工作。事实上,音频呼叫并没有建立起来(请注意,我对WebRTC了解最少,我是通过查看互联网上的示例创建的)。页面应启动两名参与者之间的音频通话。作为参与者之间的信号服务器,我使用了一个websocket服务器。此服务器仅在参与者之间中继消息。在呼叫发起过程中,通过websocket真正发送消息(一个报价、几个候选人、一个回答和其他候选人)
尽管如此,Firefox还是告诉我"ICE失败了,请参阅:webrtc了解更多详细信息"。两个参与者都在普通路由器后面
我会尽快添加我的websocket服务器的日志和about的示例:webrtc(当然是缩写)。
为什么这个代码不起作用?我忽略了什么?
我的代码是(记住这只适用于firefox):
ws = new WebSocket("ws://" + location.hostname + ":9000");
navigator.getUserMedia = function(a, b){ return navigator.mozGetUserMedia(a, b, error);};
offerOptions = {offerToRecieveAudio: 1, offerToRecieveVideo: 1};
var pc = new RTCPeerConnection({"iceServers": [
{url:'stun:stun.l.google.com:19302'},
{url:'stun:stunserver.org'},
]});
pc.onaddstream = function(obj) {
if (obj.stream instanceof LocalMediaStream) return;
var audio = document.createElement("audio");
audio.controls = "true";
audio.autoplay = "true";
document.body.appendChild(audio);
audio.srcObject = obj.stream;
}
pc.onicecandidate = function(evt){
if (!evt.candidate) return;
console.log(evt.candidate);
ws.send(JSON.stringify(evt.candidate));
}
// Helper functions
function endCall() {
var audios = document.getElementsByTagName("audio");
for (var i = 0; i < audios.length; i++) {
audios[i].pause();
}
pc.close();
}
function error(err) {
endCall();
}
function startCall(){
navigator.getUserMedia({audio: true}, function(stream) {
pc.onaddstream({stream: stream});
pc.addStream(stream);
pc.createOffer(function(offer) {
pc.setLocalDescription(new RTCSessionDescription(offer),function() {
ws.send(JSON.stringify(offer));
}, error, offerOptions);
}, error);
});
}
ws.onmessage = function(message){
var m = JSON.parse(message.data);
console.log(m);
if (m.type){
if (m.type == "offer"){
navigator.getUserMedia({audio: true}, function(stream) {
pc.onaddstream({stream: stream});
pc.addStream(stream);
pc.setRemoteDescription(new RTCSessionDescription(m), function() {
pc.createAnswer(function(answer) {
pc.setLocalDescription(new RTCSessionDescription(answer), function() {
ws.send(JSON.stringify(answer));
}, error);
}, error, offerOptions);
}, error);
});
}
if (m.type == "answerswer"){
pc.setRemoteDescription(new RTCSessionDescription(m), function() { }, error);
}
}
if (m.candidate){
pc.addIceCandidate(new RTCIceCandidate(m));
}
};
要启动调用,您应该只调用名称正确的startCall()
-函数。
两个给定之间的websocket通信(ip已删除):
Client connecting: tcp:ip1:62322
Client connecting: tcp:ip2:50075
Text message received: {"type":"offer","sdp":"v=0'r'no=mozilla...THIS_IS_SDPARTA-45.0.2 8467526262723029465 0 IN IP4 0.0.0.0'r'ns=-'r'nt=0 0'r'na=fingerprint:sha-256 8E:FC:F3:42:12:68:95:13:98:CC:B0:8D:41:F6:4E:39:19:60:70:5A:4B:4A:9D:93:4C:A0:53:CF:58:AB:3F:A1'r'na=ice-options:trickle'r'na=msid-semantic:WMS *'r'nm=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8'r'nc=IN IP4 0.0.0.0'r'na=sendrecv'r'na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level'r'na=ice-pwd:0a7123357b97345c6f9a9474aabf0c27'r'na=ice-ufrag:5d02cec2'r'na=mid:sdparta_0'r'na=msid:{512da0cd-689a-4981-9d88-9e857ba62803} {f7e81293-42b4-44e1-9d5b-80afe2857cf8}'r'na=rtcp-mux'r'na=rtpmap:109 opus/48000/2'r'na=rtpmap:9 G722/8000/1'r'na=rtpmap:0 PCMU/8000'r'na=rtpmap:8 PCMA/8000'r'na=setup:actpass'r'na=ssrc:2285633480 cname:{90d0392b-c8f1-4be9-af57-8c34d08567cd}'r'n"}
Text message received: {"candidate":"candidate:0 1 UDP 2122187007 localip2 51858 typ host","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:7 1 UDP 2122252543 ipv6-2 51859 typ host","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:0 2 UDP 2122187006 ip2 51860 typ host","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:7 2 UDP 2122252542 ipv6-2 52724 typ host","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:2 1 UDP 1685987327 ip2 51858 typ srflx raddr localip2 rport 51858","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:2 2 UDP 1685987326 ip2 51860 typ srflx raddr localip2 rport 51860","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"type":"answerswer","sdp":"v=0'r'no=mozilla...THIS_IS_SDPARTA-45.0.2 1868980908691513816 0 IN IP4 0.0.0.0'r'ns=-'r'nt=0 0'r'na=fingerprint:sha-256 04:2A:EB:AD:90:95:A3:A8:B8:3A:76:FE:3A:E7:DA:1F:D6:77:30:8A:87:BB:B9:3A:30:B4:9B:3D:E5:8F:58:04'r'na=ice-options:trickle'r'na=msid-semantic:WMS *'r'nm=audio 9 UDP/TLS/RTP/SAVPF 109'r'nc=IN IP4 0.0.0.0'r'na=sendrecv'r'na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level'r'na=ice-pwd:b5665ac44d79e66c392408e08bdc32ee'r'na=ice-ufrag:1a8f59a4'r'na=mid:sdparta_0'r'na=msid:{358aa02b-b035-41a8-acf6-2b787a192c60} {28e8765a-4a56-42e3-8f45-897ca7c99c05}'r'na=rtcp-mux'r'na=rtpmap:109 opus/48000/2'r'na=setup:active'r'na=ssrc:3277858225 cname:{8cee2fed-1a9e-46b9-90d7-3cad80050f3b}'r'n"}
Text message received: {"candidate":"candidate:0 1 UDP 2122252543 localip1 59706 typ host","sdpMid":"sdparta_0","sdpMLineIndex":0}
Text message received: {"candidate":"candidate:1 1 UDP 1686052863 ip1 59706 typ srflx raddr localip1 rport 59706","sdpMid":"sdparta_0","sdpMLineIndex":0}
更改此行:
if (m.candidate){
pc.addIceCandidate(new RTCIceCandidate(m));
}
至:
if (m.candidate){
pc.addIceCandidate(new RTCIceCandidate(m.candidate))
.catch(e => console.error(e));
}
一般来说,您做错的不是像err
那样记录错误。更改:
function error(err) {
endCall();
}
至:
function error(err) {
console.error(err);
endCall();
}
浏览器正试图帮助你,并经常告诉你哪里出了问题。这样你下次就不用问SO了。
更新:
InvalidStateError: Cannot add ICE candidate in state stable
意味着被叫在接收到要约之前正在接收候选者。这是WebRTC的时间敏感部分。一旦在主叫端调用了setLocalDescription
,则ice候选者开始流动。例如,电线看起来是这样的:
offer, candidate, candidate, candidate
因此,在接收端,您应该立即致电setRemoteDescription
,否则对等连接还没有准备好接收候选者。您的代码正在getUserMedia
上等待,这是问题所在。
将代码更改为在getUserMedia
之前调用setRemoteDescription
,这样会更好地工作。
您尚未配置任何TURN服务器,因此您可以看到,您的候选列表中没有中继候选服务器。两个参与者很可能处于使用WebRTC无法实现对等的场景中,这需要中继连接。因此,配置TURN服务器可能会解决您的问题。为了验证这种情况,当两个参与者都在同一个子网或网络后面时,你可以尝试设置一个呼叫,如果可以进行对等,那么你的代码是可以的,配置TURN服务器将解决你的问题。
- jQuery is not loaded
- AngularJS JSON not arriving php
- $rootScope not working
- reactRedux is not defined
- jQuery document.ready not working
- Javascript/Jquery Blob not showing Chrome PDF
- ReferenceError: not defined
- ReferenceError: cordova is not defined @ng-cordova.min.js:7
- Javascript getElementsByTagName not working?
- jQuery's trim()的前缀为not运算符
- Javascript - element.childNodes does not see an append.newch
- SemanticUI模态not onDeny/onApprove事件未激发
- WebkitTransform not fluent
- JQuery.val( ) not working
- Tomcat websocket is not working
- :not选择器不适用于ul类-备选方案
- Javascript JSON.parse not working
- NodeJS Multer is not working
- React, Webpack: bundle.js is not generated
- WebRTC RTCPeerConnection not established