Проблема с NodeJS (Peer to Peer) - MediaStream - PullRequest
0 голосов
/ 07 февраля 2019

Я уже несколько дней пытаюсь настроить групповую голосовую систему, используя одноранговую технологию, управляемую сервером nodejs.Моя система работает хорошо, когда два человека общаются, A звонит B, чтобы A и B могли говорить.Проблема возникает, когда добавляется третье лицо, вот моя проблема:

Простой маленький сюжет:

  • A вызов B -> A и B могут обсуждать (аудиои голос)

  • C вызов A -> A и C могут обсуждать (аудио и голос), и B всегда слышит A, но A больше не слышит B.

Однако для каждого разговора у меня есть тег, который настраивается, но он ничего не меняет.Я даю вам бесплатный доступ к моему коду, если вы можете дать мне обратную связь, я полностью заинтересован:)

// ===== =====
// Variables
// ===== =====

var peers = new Map();
var calls = new Map();
var remotes = new Map();
var streams = new Map();
var ids = {};

var localStream = null;
var answer = null;

// ===== =====
// Intiialize : LocalStream
// ===== =====

navigator.webkitGetUserMedia({audio: true,video: false},

    // ===== =====
    // Function
    // ===== =====

    function(stream) {

        // ===== =====
        // Initialize : LocalStream
        // ===== =====

        localStream = stream;
    },

    function(err) {

        // ===== =====
        // Console
        // ===== =====

        logError('Failed to access : Microphone');
        logError(err.message);
    }
);


// ===== =====
// Initialize : Answer
// ===== =====

answer = function(call) {

    // ===== =====
    // Error : LocalStream
    // ===== =====

    if (!localStream) {

        // ===== =====
        // Console
        // ===== =====

        logError('LocalStream not ready');
        return;
    }

    
    // ===== =====
    // Error : LocalStream
    // ===== =====

    if (!localStream) {

        // ===== =====
        // Console
        // ===== =====

        logError('LocalStream not ready');
        return;
    }

    remote(call.id);

    // ===== =====
    // Console
    // ===== =====

    logMessage('Call answered');

    // ===== =====
    // Call : On : Stream
    // ===== =====

    call.on('stream', function(stream) { remotes.get(call.id).srcObject = stream; });

    // ===== =====
    // Call : Answer
    // ===== =====

    call.answer(localStream);
};


// ===== =====
// Function : Connection
// ===== =====

function connection(id) {

    // ===== =====
    // Try
    // ===== =====

    try {

        // ===== =====
        // Peer : Exist
        // ===== =====

        if(peers[id] == null){

            // ===== =====
            // Initialize : Peer
            // ===== =====
            
            peers.set(id, new Peer(id, {host: 'voice.edwastonrp.com', port: '444', path: '/erpvoice'}));

            // ===== =====
            // Instance : Peer
            // ===== =====

            var peer = peers.get(id);

            // ===== =====
            // Error : Peer : Close
            // ===== =====

            peer.socket._socket.onclose = function(test) {

                // ===== =====
                // Console
                // ===== =====

                logError('Server connection : Close');
            };

            // ===== =====
            // Peer : Call
            // ===== =====

            peer.on('call', answer);
        }

    } catch (e) {

        // ===== =====
        // Console
        // ===== =====

        logError('error while connecting to server');
    }
};

// ===== =====
// Function : Interact
// ===== =====

function interact(id, partner) {

    // ===== =====
    // Instance : Peer
    // ===== =====

    var peer = peers.get(id);

    // ===== =====
    // Error : Peer : Exist
    // ===== =====

    if (!peer) {

        // ===== =====
        // Console
        // ===== =====

        logError('Not connected');
        return;
    }

    // ===== =====
    // Error : Stream : Exist
    // ===== =====

    if (!localStream) {

        // ===== =====
        // Console
        // ===== =====

        logError('Not Microphone ');
        return
    }

    // ===== =====
    // Error : Partner
    // ===== =====

    if (partner == null) {

        // ===== =====
        // Console
        // ===== =====

        logError('Not Partner');
        return;
    }

    // ===== =====
    // Console
    // ===== =====

    logMessage('Initialize Stream');

    // ===== =====
    // Calls : Set
    // ===== =====

    calls.set(id, peer.call(partner, localStream));

    // ===== =====
    // Instance : Call
    // ===== =====

    var call = calls.get(id);

    remote(call.id);

    // ===== =====
    // Call : On : Stream
    // ===== =====

    call.on('stream', function(stream) { remotes.get(call.id).srcObject = stream; });

    // ===== =====
    // Call : Error
    // ===== =====

    call.on('error', function(e) {

        // ===== =====
        // Console
        // ===== =====

        logError('Error : Call');
        logError(e.message);
    });
};

// ===== =====
// Function : Interruption
// ===== =====

function interruption(id){

    // ===== =====
    // Instance : Call
    // ===== =====

    var call = calls.get(id);

    // ===== =====
    // Call : Exist
    // ===== =====

    if(call != null){

        // ===== =====
        // Call : Close
        // ===== =====

        call.close();
        calls.delete(id);
    }
}

function remote(id){
    if(remotes.get(id) == null){
        document.getElementById("remote-video").innerHTML += '<video id="' + id + '" autoplay></video>'; 
        remotes.set(id, document.querySelector("#" + id));
    }
}
...