3

我可以使用以下代码创建一个新的对等连接对象:

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,因为它们中有太多正在使用中。

4

2 回答 2

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

于 2018-08-27T07:35:20.877 回答
1

你想在哪个事件上摧毁它?您的代码中可能有一个缺失的部分使连接在此处打开,这是一本完整的 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 上也存在错误,它会导致内存泄漏,不确定此错误是否仍然存在。

用户退出时的另一件事,例如关闭浏览器窗口,如果我们仍处于“offer”、“answer”或“candidate”状态,这可能会有所帮助

  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"); 
  }); 
于 2018-08-27T10:26:28.940 回答