Webrtc DomeException:无法设置远程提供sdp:在错误状态下调用:状态\u SENTOFFER
我正在尝试使用webRTC制作一个视频呼叫web应用程序。我正在使用angularjs和express.io 我得到这个错误: DomeException:无法设置远程提供sdp:在错误状态下调用:状态\u SENTOFFER 我的一些代码是:Webrtc DomeException:无法设置远程提供sdp:在错误状态下调用:状态\u SENTOFFER,webrtc,Webrtc,我正在尝试使用webRTC制作一个视频呼叫web应用程序。我正在使用angularjs和express.io 我得到这个错误: DomeException:无法设置远程提供sdp:在错误状态下调用:状态\u SENTOFFER 我的一些代码是: // in controller (socket is already defined in controller) var videolocal = document.getElementById('videolocal'); var videorem
// in controller (socket is already defined in controller)
var videolocal = document.getElementById('videolocal');
var videoremote = document.getElementById('videoremote');
var streamlocal = null;
var pc = null;
window.URL = window.URL || window.webkitURL;
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
window.RTCPeerConnection = window.RTCPeerConnection || window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var configuration = {'iceServers': [
// {'url': 'stun:stun.services.mozilla.com'},
{'url': 'stun:stun.l.google.com:19302'}
]};
// run start(true) to initiate a call
$scope.start = function() {
console.log('start');
// get the local stream, show it in the local video element and send it
navigator.getUserMedia({ "audio": true, "video": true }, function (stream) {
videolocal.src = URL.createObjectURL(stream);
pc = new RTCPeerConnection(configuration);
pc.addStream(stream);
// once remote stream arrives, show it in the remote video element
pc.onaddstream = function (evt) {
console.log('onaddstream');
videoremote.src = URL.createObjectURL(evt.stream);
};
// send any ice candidates to the other peer
pc.onicecandidate = function (evt) {
console.log('onicecandidate');
if(evt.candidate){
socket.emit('video_call',{user:2, type: 'candidate', candidate: evt.candidate});
}
};
// create an offer
pc.createOffer(function (offer) {
socket.emit('video_call', {user:2, type: "offer", offer: offer});
pc.setLocalDescription(offer);
}, function (error) {
alert("Error when creating an offer");
});
}, function () {alert('error in start')});
}
$scope.start();
socket.on('video_call', function (data) {
console.log(data);
//when somebody sends us an offer
function handleOffer(offer) {
// this line is giving error
pc.setRemoteDescription(new RTCSessionDescription(offer), function(){alert('success')}, function(e){ console.log(e); alert(e)});
//create an answer to an offer
pc.createAnswer(function (answer) {
pc.setLocalDescription(answer);
socket.emit('video_call', {user:2, type: "answer", answer: answer});
}, function (error) {
console.log(error);
alert("Error when creating an answer");
});
};
//when we got an answer from a remote user
function handleAnswer(answer) {
pc.setRemoteDescription(new RTCSessionDescription(answer));
};
//when we got an ice candidate from a remote user
function handleCandidate(candidate) {
pc.addIceCandidate(new RTCIceCandidate(candidate));
};
switch(data['type']) {
case "offer":
handleOffer(data["offer"]);
break;
case "answer":
handleAnswer(data['answer']);
break;
//when a remote peer sends an ice candidate to us
case "candidate":
handleCandidate(data['candidate']);
break;
default:
break;
}
});
在服务器上:
// this function is called on video_call event
video_call: function (data) {
var id = data.user;
// if user is active
// users is dict of users (user_id as key)
if(Object.keys(users).indexOf(id.toString()) > -1){
// for each device of the user
users[id].forEach(function(user_socket){
console.log(data);
user_socket.emit('video_call', data);
});
}
}
请告诉我这个代码有什么问题。本地流正在正确捕获。我正在使用chromium浏览器
服务器上的数据:
我认为问题在于,在您的
handleOffer()
函数中,您需要创建另一个PeerConnection并在该pc上调用setRemoteDescription()
var remote_pc = new RTCPeerConnection(configuration)
remote_pc.setRemoteDescription(new RTCSessionDescription(offer), ...) {
remote_pc.createAnswer()
}
这就是我的代码中的内容
编辑:在中,您可以转到第11.7章,检查第15章之后的步骤(发送报价时,其他对等方收到报价时) JS中生成此错误的确切行是什么?当收到要约时,这行“pc.setRemoteDescription(新RTCSessionDescription(要约),function(){alert('success')},function(e){console.log(e);alert(e)};”发出警报(并在控制台中打印):domeException:无法设置远程提供sdp:在错误状态下调用:状态\发送提供。然后它打印:Uncaught(in promise)DOMException:Error processing ICE candidate我得到了这个错误:Uncaught(in promise)DOMException:Error processing ICE candidate。请你能分享最简单的前端代码的工作例子。我不能分享所有的代码,因为我的公司是业主。。。您是否将
pc.addIceCandidate()
更改为远程\u pc
?您需要区分这两种对等连接。如何连接remote_pc和videoremote(远程元素的视频标签)?事件onaddstream
接收远程视频。你已经实现了。我没有在不同的电脑上检查过。检查完后,我会用完整的代码更新这个答案。谢谢你的帮助。