我正在使用简单对等方构建视频聊天应用程序,用户还可以共享屏幕。该应用程序的流程是这样的:当用户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未捕获的错误:[对象RTCErrorEvent] 在makeError(index.js:17) 在RTCDataChannel._channel.onerror(index.js:490)
我不确定自己出了什么问题。
答案 0 :(得分:0)
经过一些测试,我发现了错误的来源。
您需要做的是在调用函数peer.signal(incomingSignal)
之后再调用函数addPeer()
,以及从peer
函数返回的addPeer()
变量。
这是一个例子:
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;
}
let peer = addPeer(incomingSignal, callerId, stream);
peer.signal(incomingSignal);
它将正常工作