Only arbeitet an Eins-zu-Eins, von denen viele-zu-viele sein sollten, webrtc

Ich entwickle eine Konferenzanwendung (viele zu viele) für VideoanrufeDie style. Der Code ist auf GitHub verfügbar, aber ich habe nicht viel Erfahrung mit node.js. Daher habe ich beschlossen, meinen eigenen Server mit PHP zu erstellen.

Ich habe den Server mit WebSockets erstellt. Es ist einfach - es empfängt Nachrichten und leitet sie an alle anderen verbundenen Clients weiter (d. H. Nicht an den Client, der die Nachricht gesendet hat). Nur das - nichts mehr; Nicht weniger

Aber mein Problem ist, dass diese Architektur es Clients nicht ermöglicht, eine Verbindung mit mehr als einer Person herzustellen, d. H., Wenn ein Client versucht, eine Verbindung mit der dritten Person herzustellen, schlagen die zusätzlichen Streams fehl. Clients können nur eine Eins-zu-Eins-Verbindung herstellen.

Ich weiß nicht, ob der Fehler in JavaScript liegt oder ob ich den Server verbessern muss. Was kann ich tun, um eine Verbindung zu allen Clients herzustellen, die beitreten?

Meinen Code anzeigen:

HTML

<script type="text/javascript" src="http://127.0.0.1/scr/js/jquery.js"></script>

JavaScript

var Server = new WebSocket('ws://127.0.0.1:1805/'),
    myStream = null,
    peerConn = null,
    mediaConstraints = {
        'mandatory': {
            'OfferToReceiveAudio': true,
            'OfferToReceiveVideo': true
        }
    };


navigator.webkitGetUserMedia({
    audio: true,
    video: true
}, function(stream) {
    myStream = stream;

    $("body").append('<video width="320" height="240" muted="muted" autoplay="true" src="' + window.URL.createObjectURL(stream) + '"></video>');

    createPeerConnection();

    peerConn.addStream(myStream);
    peerConn.createOffer(function(sessionDescription) {
        peerConn.setLocalDescription(sessionDescription);
        console.log("Sending offer description");
        Server.send(JSON.stringify(sessionDescription));
    }, null, mediaConstraints);
}, function() {
    console.error('Error in my stream');
});

function createPeerConnection() {
    console.log('Creating peer connection');

    peerConn = new webkitRTCPeerConnection({
        'iceServers': [{
            'url': 'stun:stun.l.google.com:19302'
        }, {
            'url': 'turn:107.150.19.220:3478',
            'credential': 'turnserver',
            'username': 'subrosa'
        }]
    }, {
        'optional': [{
            'DtlsSrtpKeyAgreement': 'true'
        }]
    });

    peerConn.onicecandidate = function(event) {
        if (event.candidate) {
            Server.send(JSON.stringify({
                type: 'candidate',
                label: event.candidate.sdpMLineIndex,
                id: event.candidate.sdpMid,
                candidate: event.candidate.candidate
            }));
        } else {
            console.error('Candidate denied');
        }
    };
    peerConn.onaddstream = function(event) {
        console.log("Adding remote strem");
        $("body").append('<video width="320" height="240" autoplay="true" src="' + window.URL.createObjectURL(event.stream) + '"></video>');
    };
    peerConn.onremovestream = function(event) {
        console.log("Removing remote stream");
    };
}
Server.addEventListener("message", function(message) {
    var msg = JSON.parse(message.data);

    if(!myStream) {
        console.error('Error in my stream');
    }

    if (msg.type === 'offer') {
        createPeerConnection();

        console.log('Adding local stream...');

        peerConn.addStream(myStream);
        peerConn.setRemoteDescription(new RTCSessionDescription(msg));

        console.log("Sending answer to peer.");

        peerConn.createAnswer(function(sessionDescription) {
            peerConn.setLocalDescription(sessionDescription);
            Server.send(JSON.stringify(sessionDescription));
        }, null, mediaConstraints);
    } else if (msg.type === 'answer') {
        peerConn.setRemoteDescription(new RTCSessionDescription(msg));
    } else if (msg.type === 'candidate') {
        var candidate = new RTCIceCandidate({
            sdpMLineIndex: msg.label,
            candidate: msg.candidate
        });
        peerConn.addIceCandidate(candidate);
    }
}, false);

Antworten auf die Frage(4)

Ihre Antwort auf die Frage