泄漏 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)并点击刷新和 [清除历史记录] 按钮时,我的对等连接已从列表中消失。
我有一个非常简单的 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;
让对等连接本身被垃圾收集。
因为我 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)并点击刷新和 [清除历史记录] 按钮时,我的对等连接已从列表中消失。