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