我正在使用 simple-peer 构建一个视频聊天应用程序,用户也可以在其中共享屏幕。应用程序的流程是这样的,当用户 A 创建房间时,他可以获取页面 url 并与用户 B 共享。当用户 B 加入时,会为他创建一个发起者对等体,如图所示。
function createPeer(partnerID, callerID, stream) {
const peer = new Peer({
initiator: true,
trickle: false,
stream,
});
peer.on("signal", signal => {
const payload = {
partnerID,
callerID,
signal
}
socketRef.current.emit("call partner", payload);
});
peer.on("stream", handleStream);
return peer;
}
当用户 A 从用户 B 获得报价时,会为他创建一个非发起者对等点,如此处所示。
function addPeer(incomingSignal, callerID, stream) {
const peer = new Peer({
initiator: false,
trickle: false,
stream,
});
peer.on("signal", signal => {
const payload = {
callerID,
signal
}
socketRef.current.emit("accept call", payload);
});
peer.on("stream", handleStream);
peer.signal(incomingSignal);
return peer;
}
现在,当任何用户决定共享他们的屏幕时,都会调用此函数。
function shareScreen() {
navigator.mediaDevices.getDisplayMedia().then(stream => {
const track = stream.getTracks()[0];
peerRef.current.removeStream(videoStream.current);
peerRef.current.addStream(stream);
userVideoRef.current.srcObject = stream;
track.onended = function () {
userVideoRef.current.srcObject = videoStream.current;
peerRef.current.removeTrack(track, stream);
};
});
}
我得到的行为真正奇怪的是,当用户 B,即调用方,想要共享他的屏幕时,一切正常,但是当用户 A,被调用方,想要共享他的屏幕时,我得到以下错误。
index.js:17 未捕获的错误:[object RTCErrorEvent] at makeError (index.js:17) at RTCDataChannel._channel.onerror (index.js:490)
我不确定我哪里出错了。