泄漏 RTCPeerConnection。即使在页面刷新之后

Leaking RTCPeerConnections. Even after page refresh

我有一个非常简单的 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 内部如何在页面刷新后仍然可以显示它。请帮忙!

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

peerConnection = null;

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

因为我 我会避免使用 createObjectURL 并直接使用 video.srcObject = stream ,但这与释放相机有关,如果你忘记停止所有轨道。

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

例子

您可以在两个不同的选项卡中尝试 this https fiddle 或 windows 并查看远程失败的情况。

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

disconnected
failed
closed

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

Chrome

就是说,我不会完全排除 Chrome 中的错误,因为它可能会比应有的时间更长时间地占用资源,正如我所看到的与您描述的相同(但请注意例如,当我单击 "Stop!" 时 "packets sent" 下降到零,这是重要的部分)。

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