1

我正在使用 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)

我不确定我哪里出错了。

4

1 回答 1

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

它会正常工作

于 2020-05-14T01:26:53.897 回答