所以在提供者上我有这个代码。它具有将 SDP 发送到数据库的功能。
const videoConstraints = {
'video': true,
'audio': false
}
var localStream = new MediaStream();
try {
navigator.mediaDevices.getUserMedia(videoConstraints).then((stream) => {
localStream = stream;
video = document.getElementById("video");
video.srcObject = stream;
})
} catch (error) {
console.log(error);
}
const turnConfig = {
iceServers: [
//servers
]
}
const createOfferer = () => {
var peer = new RTCPeerConnection(turnConfig);
localStream.getTracks().forEach(track => {
peer.addTrack(track, localStream);
});
peer.createOffer()
.then((offer) => {
fetch(window.location.href, {
method: "POST",
body: JSON.stringify(offer),
headers: {
"Content-Type": "application/json"
}
});
})
}
从那里,SDP被应答者获取,然后调用createAnswerer:
const setOnTrack = (peer, remoteVideo) => {
var remoteStream = new MediaStream();
remoteVideo.srcObject = remoteStream;
peer.addEventListener('track', async (e) => {
remoteStream.addTrack(e.track, remoteStream);
})
}
const createAnswererForSeat = (offer) => {
var peer = new RTCPeerConnection(turnConfig);
var remoteVideo = createVideoForSeat(); //this function only creates the video element
setOnTrack(peer, remoteVideo);
peer.setRemoteDescription(offer)
.then(() => {
return peer.createAnswer();
})
.then((answer) => {
peer.setLocalDescription(answer);
});
}
出于某种原因,在 Chrome 上,应答者端没有摄像头,而在 Firefox 上,我收到 WebRTC 错误。
为什么它不起作用?我是 WebRTC 的新手,所以如果我遗漏了一些明显的东西,抱歉 :)
谢谢。
在报价者中,您需要在创建报价后设置本地描述:
peer.createOffer()
.then((offer) => {
peer.setLocalDescription(offer) // <--- here
fetch(window.location.href, {
method: "POST",
body: JSON.stringify(offer),
headers: {
"Content-Type": "application/json"
}
});
})
在回答者中,您需要将答案发送回提供者并将其设置为远程描述。应该是这样的:
const onAnswer = async (answer) => {
await peer.setRemoteDescription(answer)
}
此外,RTCPeerConnection 应该存储在回调之外的某个地方,否则它将在函数退出后被垃圾收集。