Я уже несколько дней пытаюсь настроить групповую голосовую систему, используя одноранговую технологию, управляемую сервером 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));
}
}