尝试共享屏幕时出现简单对等webrtc错误

时间:2020-05-13 00:09:34

标签: javascript webrtc 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未捕获的错误:[对象RTCErrorEvent] 在makeError(index.js:17) 在RTCDataChannel._channel.onerror(index.js:490)

我不确定自己出了什么问题。

1 个答案:

答案 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);

它将正常工作