Как уничтожить 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");
});