Обработка нескольких предложений от разных пиров в WebRT C с использованием Javascript - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь создать приложение для видеоконференцсвязи, в котором все одноранговые узлы подключаются ко мне sh, я делаю, когда одноранговый узел присоединяется к комнате, они передают свой идентификатор всем присутствующим в комнате, и все перезванивают вещателю с идентификатором. Иногда он может подключиться ко всем, но в других случаях вещатель получил все предложения, но отправил обратно только некоторые ответы, пропуская другие предложения. Есть ли способ использовать async / await для обработки и отправки ответов один за другим? Я новичок в javascript и WebRT C, много чего пробовал, но не могу понять.

Код для обработки предложений:

socket.on('message',function(message) {
 if(message.type === 'offer') {
   if(message.specific === clientId){
      if(message.isSuperNode === false)
        isNodeCap++;
      createPeerConnection(message.userid,message.isSuperNode);
      pc.peerConnection.addStream(pc.mixer.getMixedStream());
      pc.peerConnection.setRemoteDescription(new RTCSessionDescription(message));
      console.log("Offer Received");
      localPeerList.push(pc);
      doAnswer(message.userid);
    }
});

function createPeerConnection(userid,isSN) {
  try {
    var obj ={};
    obj.peerConnection = new RTCPeerConnection(pcConfig);
    obj.mixer = new MultiStreamsMixer([localStream]);
    obj.mixer.startDrawingFrames();
    obj.connectionWith = userid;  
    obj.isSuperNode = isSN;
    obj.peerConnection.onicecandidate = handleIceCandidate
    obj.peerConnection.onaddstream = handleRemoteStreamAdded;
    obj.peerConnection.onremovestream = handleRemoteStreamRemoved;
    pc = Object.assign({},obj);
    console.log('Created RTCPeerConnnection');
  } catch (e) {
    console.log('Failed to create PeerConnection, exception: ' + e.message);
    alert('Cannot create RTCPeerConnection object.');
    return;
  }
}

function doAnswer(userid) {
  console.log('Sending answer to peer.');
  pc.peerConnection.createAnswer().then(function(offer){
    pc.peerConnection.setLocalDescription(offer).then(function(){
        answering = true;
      }
    ).catch(function(e) {
      alert(e.name);
    });
  });
}

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Если вы новичок в javascript и webrt c, то simple-peer упростит обработку webrt c. По сути, это оболочка для соединения RTCPeerconnection.

Вот простой проект с DEMO для многопользовательского видеозвонка с одноранговым узлом.

0 голосов
/ 27 мая 2020

Я не уверен насчет семантики в вашем примере, но потенциальная проблема заключается в том, что doAnswer не «ожидается».

Итак, вы можете попробовать сделать обработчик сообщений asyn c и дождаться вызова doAnswer следующим образом:

socket.on('message', async function(message) {
 if(message.type === 'offer') {
   if(message.specific === clientId){
      if(message.isSuperNode === false)
        isNodeCap++;
      createPeerConnection(message.userid,message.isSuperNode);
      pc.peerConnection.addStream(pc.mixer.getMixedStream());
      pc.peerConnection.setRemoteDescription(new RTCSessionDescription(message));
      console.log("Offer Received");
      localPeerList.push(pc);
      await doAnswer(message.userid);
    }
});

async function doAnswer(userid) {
  console.log('Sending answer to peer.');
  const offer = await pc.peerConnection.createAnswer();
  try {
    await pc.peerConnection.setLocalDescription(offer);
    answering = true;
  }
  catch(e) {
    alert(e.name);
  }
}
...