Как уничтожить RTCPeerConnection?

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

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 ответа

На самом деле

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

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

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

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

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

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"); 
  }); 
Другие вопросы по тегам