-1

我几乎到处搜索,但由于某种原因,似乎在这种情况下找不到任何资源。任何帮助将不胜感激。

问题是这样的:

我有 4 个用户。可以说:A、B、C 和 D。我想根据 url 匹配它们。例如,如果 A 和 B 连接到 &room=1 并且 C 和 D 连接到 &room=2 我想在 A 和 B 对以及 C 和 D 对之间建立连接。

目前我的代码只建立A和B之间的连接,如果C或D用户之一发起呼叫,A和B之间的连接断开,C找不到D。


为了解决这个问题,我尝试创建一个像这样的对象:

{ 房间:1,对等点:RTCPeerConnection }

并将其存储在一个数组中,根据 roomid 获取对等连接,并基于根据 roomId 存储的 RTCPeerConnection 建立连接。但这没有用。

如果不建立处理此通信的套接字服务器,我将如何解决这个问题?


如果有帮助,我目前以这种方式建立连接:

navigator.mediaDevices
    .getUserMedia({
        audio: true,
        video: true
    })
    .then(function (stream) {
        localStream = stream;
        localVideo.srcObject = localStream;
        try {
            conn = new RTCPeerConnection(servers);
        } catch (err) {
            console.log("Can't establish connection");
            return;
        }
        localStream.getTracks().forEach(function (track) {
            conn.addTrack(track, localStream);
        });
        conn.onaddstream = function (event) {
            setTimeout(() => {
                callButton.click();
            }, 2000);
            remoteVideo.srcObject = event.stream;
        };
        conn.onicecandidate = function (event) {
            if (event.candidate) {
                chat.server.iceCandidate(
                    JSON.stringify({ candidate: event.candidate })
                );
            }
        };
    })
    .catch(function (err) {
        console.log("Error", err);
    });

这是我失败的解决方案:

    var connections = JSON.parse(localStorage.getItem("connections")) || [];
    var connection;
    if (connections) {
        connection = connections.find(function (conn) {
            return conn.id = roomId;
        })
    }
    if (!connection) {
        conn = new RTCPeerConnection(servers);
        var data = {
            id: roomId,
            peer: conn
        }
        localStorage.removeItem("connections");
        localStorage.setItem("connections", JSON.stringify(connections));
    } else {
        conn = JSON.parse(connection.peer);
        conn.__proto__ = new RTCPeerConnection();
    }

这失败了,因为您当然不能将对象的原型存储在 localStorage (RTCPeerConnection) 中。当我对它进行字符串化/解析时,它的对等属性是一个空对象。如果我尝试使用全局变量而不是 localStorage,它总是为空。我非常感谢有关此问题的任何提示。

4

1 回答 1

0

就像您弄乱了 localStorage 变量一样,出于测试目的并避免信号服务器实现,我建议使用serverless-webrtcjameshfisher更新

有了这个,您可以创建房间(分离客户端)并向您显示一条 sdp 消息以复制并粘贴到另一个客户端(没有 localStorage)以建立对等连接。这将更好地在浏览器 firefox <-> chrome、safari 等之间进行测试。

于 2018-10-04T09:44:10.503 回答