Как уничтожить RTCPeerConnection? - PullRequest
0 голосов
/ 26 августа 2018

Я могу использовать следующий код для создания нового однорангового объекта соединения:

var peer = new RTCPeerConnection();

Когда это происходит, Chrome показывает его как новый объект соединения в chrome://webrtc-internals/

Я хотел быуничтожить этот объект позже.Как это сделать?Я попытался

peer.close();

, но это, похоже, ничего не делает, поскольку переменная peer по-прежнему имеет тип RTCPeerConnection, и я все еще вижу ее активной в chrome://webrtc-internals/.

ЕслиЯ сбрасываю переменную, как

peer=false;

, она все еще показывает ее в chrome://webrtc-internals/.Тем не менее, если я закрою веб-страницу, она сразу исчезнет с chrome://webrtc-internals/.

Как правильно освободить объект RTCPeerConnection?Я спрашиваю, потому что, если я не освобождаю их, я иногда получаю отказ от веб-браузера на создание нового RTCPeerConnection, потому что их слишком много.

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

на каком событии вы хотите его уничтожить?возможно, в вашем коде отсутствует часть, которая оставляет соединение открытым, вот целая книга в формате PDF, объясняющая, как WebRtc работает в браузерах,

нажмите здесь, чтобы загрузить ее

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

Что касается вашего вопроса, предположим, что вы хотите закрыть его нажатием кнопки, давайте назовем его кнопкой Отбой, // повесим трубку

hangUpBtn.addEventListener("click", function () { 

send({ 
  type: "leave" 
});

handleLeave(); 
});

function handleLeave() { 
connectedUser = null; 
remoteVideo.src = null; 

yourConn.close(); 
yourConn.onicecandidate = null; 
yourConn.onaddstream = null; 
};

Когда пользователь отключается, вы должны очистить егоподключение.Вы можете удалить пользователя при срабатывании события закрытия.Добавьте следующий код в обработчик соединения

connection.on("close", function() { 
if(connection.name) { 
 delete users[connection.name]; 
} 
});

, когда пользователь нажмет на кнопку зависания. Он отправит другому пользователю сообщение о выходе. Он закроет RTCPeerConnection и локально уничтожит соединение

это должно закрыть соединение rtc, насколько я помню, есть ошибка в chrome, даже если вы закрыли соединение, это приведет к утечке памяти, не уверенной, если эта ошибка все еще существует.

еще одна вещь, когда пользователь выходит, например, закрывает окно браузера, это может помочь, если мы все еще в состоянии «предложение», «ответ» или «кандидат»

  connection.on("close", function() { 

  if(connection.name) { 
  delete users[connection.name]; 

  if(connection.otherName) { 
  console.log("Disconnecting from ", connection.otherName); 
  var conn = users[connection.otherName]; 
  conn.otherName = null;  

  if(conn != null) { 
  sendTo(conn, { 
  type: "leave" 
  }); 
  }  
  } 
  } 
  });  

  connection.send("Hello world"); 
  }); 
0 голосов
/ 27 августа 2018

На самом деле

peer.close();

- верный способ сделать это.

Вы также можете сделать что-то вроде этого:

peer.close();
peer = null;

Вот некоторые фрагменты из оригинальных примеров кода WebRTC:

function hangup() {
  console.log('Ending call');
  pc1.close();
  pc2.close();
  pc1 = null;
  pc2 = null;
  hangupButton.disabled = true;
  callButton.disabled = false;
}

https://github.com/webrtc/samples/blob/gh-pages/src/content/peerconnection/pc1/js/main.js#L175

...