泄漏RTCPeerConnections。即使页面刷新后

时间:2016-10-22 23:41:28

标签: javascript webrtc peer-connection

我有一个非常简单的RTCPeerConnection应用程序正在运行。使用Firebase进行信令。 RTCPeerConnections建立,然后我获取流,并使用它执行以下操作:

let streamURL = window.URL.createObjectURL(stream);

然后我接受streamURL并设置video.src = streamURL。这就是我如何看到远程用户'视频。然后,当我完成连接(我想结束对话)时,我会执行以下操作:

peerConnection.getLocalStreams().forEach(stream=>{
    stream.getTracks().forEach(t=>{
        t.stop();
        stream.removeTrack(t);
    });
});
peerConnection.close();

这样就结束了连接,包括关闭本地网络摄像头的绿灯。这告诉我事情已经结束了大部分。

然后我检查chrome://webrtc-internals并且连接仍在那里。即使我刷新后,连接就在那里。这看起来很奇怪。即使刷新后它怎么还能存在?请帮忙。我没有正确结束RTCPeerConnection吗?我认为这是正确的方法。我无法弄清楚即使页面刷新后webrtc内部仍然可以显示它。请帮助!

1 个答案:

答案 0 :(得分:3)

你做得对。唯一缺少的是:

peerConnection = null;

让对等连接本身被垃圾收集。

正如我mentioned elsewhere我要避免使用createObjectURL并直接使用video.srcObject = stream,但这与释放相机有关,如果您忘记停止所有曲目。

我不会过多地阅读Chrome的webrtc-internals页面,因为查看对等连接对于调试很有用,即使事后也是如此。重要的问题是:是否有任何JavaScript或电线可观察到的连接标志?

实施例

您可以在两个不同的标签页或窗口中尝试this https fiddle,并查看远程失败的内容。

确保您可以同时看到两个小提琴,然后单击其中一个中的[开始!]按钮进行连接。您应该在两个地方看到视频。现在,当您单击[停止!]按钮时,您应该在另一端看到以下输出(可能需要几秒钟才能显示所有三个):

disconnected
failed
closed

因为我检查"failed"状态并关闭它的连接(虽然在生产中使用data channels to communicate hangups更常见)。

也就是说,我不会完全排除Chrome中的错误,因为它可能会延长资源的使用时间,因为我看到了您正在描述的相同内容(但请注意,例如"当我点击"停止!"这是重要部分时,发送的数据包"降至零。

与Firefox对比,当我转到:webrtc(相当于chrome:// webrtc-internals)和点击刷新以及[清除历史记录]按钮时,我的对等连接已从列表中删除。