https://github.com/ScaleDrone/webrtc
错误是:
setRemoteDescription:InvalidStateError:无法设置远程应答
pc.setRemoteDescription.error@ webrtc.js:1012webrtc.js:26
funct localDescCreated:OperationError:未能设置本地应答sdp:
调用状态错误:kStable onError@webrtc.js:26
pc.setLocalDescription.error@ webrtc.js:115三webrtc.js:26
createAnswer:InvalidStateError:PeerConnection无法创建
还有我的js(对不起,一团糟!):
if (!location.hash) {
location.hash = Math.floor(Math.random() * 0xFFFFFF).toString(16);
}
const roomHash = location.hash.substring(1);
const roomName = 'test';
const configuration = {
iceServers: [
{
'urls': [
'stun:74.125.142.127:19302',
'stun:23.21.150.121:3478'
]
}
]
};
let room;
let pc;
function onSuccess() { };
function onError(context, error) {
console.error(`${context} : ${error}`);
};
const connection = new signalR.HubConnectionBuilder()
.withUrl("/video")
.build();
connection.on('Start', () => {
connection.invoke('JoinRoom', roomName).catch(error => onError("on invoke join room",error));
connection.invoke('GetMembers', roomName).catch(error => onError("on invoke GetMembers",error));
});
connection.on('members',
users => {
console.log('MEMBERS', users);
users = JSON.parse(users);
const isOfferer = users.length === 2 ? true : false;
console.log("isOfferer", isOfferer);
console.log("users length = ", users.length);
startWebRTC(isOfferer);
});
function sendMessage(message) {
connection.invoke('send', message);
}
function startWebRTC(isOfferer) {
pc = new RTCPeerConnection(configuration);
pc.onicecandidate = event => {
if (event.candidate) {
sendMessage(JSON.stringify({ 'candidate': event.candidate }));
console.log("send message - ", { 'candidate': event.candidate });
}
};
if (isOfferer) {
pc.onnegotiationneeded = () => {
pc.createOffer().then(localDescCreated).catch(error => onError("onnegotiationneeded",error));
}
}
pc.ontrack = event => {
const stream = event.streams[0];
if (!remoteVideo.srcObject || remoteVideo.srcObject.id !== stream.id) {
remoteVideo.srcObject = stream;
}
};
navigator.mediaDevices.getUserMedia({
audio: true,
video: true,
}).then(stream => {
localVideo.srcObject = stream;
stream.getTracks().forEach(track => pc.addTrack(track, stream));
}, error => onError("adding media devices", error));
connection.on('newMessage', (message) => {
message = JSON.parse(message);
if (message.sdp) {
pc.setRemoteDescription(new RTCSessionDescription(message.sdp), () => {
if (pc.remoteDescription.type === 'offer') {
pc.createAnswer().then(localDescCreated).catch(error => onError("createAnswer", error));
}
}, error => onError("setRemoteDescription", error));
} else if (message.candidate) {
pc.addIceCandidate(
new RTCIceCandidate(message.candidate), onSuccess, error => onError("addIceCandidate", error)
);
}
});
}
function localDescCreated(desc) {
pc.setLocalDescription(
desc,
() => sendMessage(JSON.stringify({ 'sdp': pc.localDescription })),
error => onError("func localDescCreated", error)
);
}
connection.start().catch(err => console.error(err.toString()));