我写的webrtc的demo中, 只要调用setRemoteDescription就会报Failed to set remote offer sdp: Called in wrong state: STATE_SENTINITIATE
这是我前端的代码
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
</head>
<body>
<video id="video1" autoplay></video>
<video id="video2" autoplay></video>
</body>
</html>
<script>
var PeerConnection = window.mozRTCPeerConnection || window.webkitRTCPeerConnection;
var SessionDescription = window.mozRTCSessionDescription || window.RTCSessionDescription;
var IceCandidate = window.mozRTCIceCandidate || window.RTCIceCandidate;
navigator.getUserMedia = navigator.getUserMedia || navigator.mozGetUserMedia || navigator.webkitGetUserMedia;
var server = {
iceServers: [
{url: "stun:23.21.150.121"},
{url: "stun:stun.l.google.com:19302"},
{url: "turn:numb.viagenie.ca", credential: "webrtcdemo", username: "louis%40mozilla.com"}
]
};
var options = {
optional: [
{DtlsSrtpKeyAgreement: true}
]
}
var socket = new WebSocket('ws://192.168.0.218:9999');
//var activity = prompt('please input the activity', 'offerer');
socket.onopen = function(){
console.log('socket connected');
navigator.getUserMedia({
video: true,
audio: true
}, function(stream){
//绑定本地媒体流到video标签用于输出
document.getElementById('video1').src = URL.createObjectURL(stream);
//向PeerConnection中加入需要发送的流
pc.addStream(stream);
//如果是发送方则发送一个offer信令,否则发送一个answer信令
pc.createOffer(function(desc){
pc.setLocalDescription(desc);
socket.send(JSON.stringify({
event: "sdp",
data: {
sdp: desc
}
}));
});
}, function(e) {
console.log('Reeeejected!', e);
});
}
socket.onmessage = function(event){
var json = JSON.parse(event.data);
console.log(json);
//如果是一个ICE的候选,则将其加入到PeerConnection中,否则设定对方的session描述为传递过来的描述
if( json.event === "ice_candidate" ){
if(json.data.candidate){
pc.addIceCandidate(new RTCIceCandidate(json.data.candidate));
}
}else if(json.event === 'sdp'){
pc.setRemoteDescription(new RTCSessionDescription(json.data.sdp), function(){
pc.createAnswer(function(desc){
pc.setLocalDescription(desc);
socket.send(JSON.stringify({
event: "sdp",
data: {
sdp: desc
}
}));
}, function(error) {
console.log(error);
alert(error);
})
}, function(error){
console.log(error);
alert(error);
});
}
};
socket.onclose = function(){
console.log('socket closed');
}
// create the PeerConnection
var pc = new PeerConnection(server, options);
pc.onicecandidate = function(event){
socket.send(JSON.stringify({
event: "ice_candidate",
data: {
candidate: event.candidate
}
}));
};
//如果检测到媒体流连接到本地,将其绑定到一个video标签上输出
pc.onaddstream = function(event){
if(!event){
return;
}
//someVideoElement.src = URL.createObjectURL(event.stream);
document.getElementById('video2').src = URL.createObjectURL(event.stream);
};
// generic error handler
function errorHandler (err) {
console.error(err);
}
</script>
这是我用nodejs写的websocket服务器的代码
(function(){
var http = require('http');
var websocketServer = require('websocket').server;
var server_for_websocket = http.createServer(function(req, res){
})
.listen(9999, function(){
console.log('websocket server start listening at port '+this.address().port);
});
var wsServer = new websocketServer({
httpServer:server_for_websocket
})
var clients = {};
wsServer.on('request', function(request){
console.log(new Date() + ' connection from origin ' + request.origin);
var socket_id = create_uid();
var connection = request.accept(null, request.origin);
console.log(new Date()+' connection accepted');
clients[socket_id] = {
connection : connection,
socket_id : socket_id
}
connection.on('message', function(message){
if(message.type == 'utf8'){
var msg_str = message.utf8Data;
console.log(msg_str);
broadcast(clients, socket_id, msg_str);
}
})
connection.on('close', function(){
delete clients[socket_id];
})
})
})()
function create_uid(){
return Date.now()+'_'+Math.floor(Math.random()*100000);
}
function broadcast(clients, my_socket_id, message){
for(var i in clients){
if(i != my_socket_id){
clients[i]['connection'].sendUTF(message);
}
}
}
DOMException: Failed to set remote answer sdp: Called in wrong state: STATE_INPROGRESS
我遇到这个……