2

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

4

1 回答 1

3

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

peerConnection = null;

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

正如我在别处提到的那样,我会避免 createObjectURL 并video.srcObject = stream直接使用,但这与释放相机有关,如果您忘记停止所有轨道。

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

例子

您可以在两个不同的选项卡或窗口中尝试这个 https fiddle ,然后远程查看失败的情况。

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

disconnected
failed
closed

因为我检查"failed"状态并关闭它的连接(尽管在生产中更常见的是使用数据通道来通信 hangups)。

铬合金

也就是说,我不会完全排除 Chrome 中的错误,因为它可能会比它应该更长时间地挂在资源上,因为我看到你正在描述同样的事情(但请注意,例如“发送的数据包”下降到零当我单击“停止!”时,这是重要的部分)。

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

于 2016-10-24T18:02:46.550 回答