NodeJS问题(点对点)-MediaStream

时间:2019-02-07 16:12:36

标签: javascript node.js stream peer mediastream

几天来我一直在尝试使用由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));
    }
}

0 个答案:

没有答案