PeerJs 关闭视频通话不触发关闭事件
PeerJs close video call not firing close event
我正在尝试使用 PeerJs 创建一个单向视频应用程序。我已经成功地能够 运行 我自己的对等服务器并通过单击按钮进行连接,但是我无法关闭连接以便对等方可以 receive/establish 与新对等方建立新连接。
每个用户要么是宿主,要么是客户端,永远不会倒退。因此主机可以选择连接到哪个客户端,客户端将开始将其摄像头反馈流式传输回主机。单击按钮调用 closeCon()
函数。
$(document).ready(function(){
peer = new Peer('100001', {host: 'my.url', port: '9900', path: '/peerjs', key: 'peerjs', secure: true, debug: 3});
peer.on("open", function(id) {
console.log("My peer ID is: " + id);
});
video = document.getElementById('vidSrc');
})
function callTheGuy(id){
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
getUserMedia({video: true, audio: false}, function(stream) {
window.call = peer.call(id, stream);
localStream = stream;
window.call.on('stream', function(remoteStream) {
let video = document.getElementById('vidArea');
video.srcObject = remoteStream;
video.play();
$("#videoModal").modal('show')
});
}, function(err) {
console.log('Failed to get local stream' ,err);
});
}
function closeCon(){
window.call.close();
}
这一切都很好,我得到了我的视频源,没问题。这是我的客户端代码:
peer = new Peer(serverId, {
host: "my.url",
port: "9900",
path: "/peerjs",
key: "peerjs",
debug: 3,
secure: true
});
peer.on("open", function(id) {
console.log("My peer ID is: " + id);
});
var getUserMedia =
navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
peer.on("call", function(call) {
getUserMedia(
{ video: true, audio: false },
function(stream) {
localStream = stream;
call.answer(stream); // Answer the call with an A/V stream.
},
function(err) {
console.log("Failed to get local stream", err);
}
);
call.on("close", function() {
console.log("closing");
});
});
问题是当我调用 closeCon()
时,客户端文件没有收到关闭事件。
的部分
call.on("close", function() {
console.log("closing");
});
永远不会被解雇。我不确定为什么会发生这种情况,但除非关闭事件得到处理,否则客户端会保持与原始主机的连接,并且无法接受来自后续主机请求的连接。有人有什么建议吗?
2021 年 3 月 7 日更新
我发现这是个问题,PeerJs 还没有修复。 (问题link:https://github.com/peers/peerjs/issues/636)
你可以在Socketio“disconnect”中触发close事件作为解决方案
服务器
socket.on("disconnect", (reason)=>{
socket.broadcast.emit("user-disconnected", userId);
});
客户
socket.on("user-disconnected", (userId)=>{
// remove video or add your code here
});
在发现我的 peerConnections 继续使用 chrome://webrtc-internals 发送流数据后,我 运行 陷入了这个问题。我目前正在使用 public peerjs 服务器。 MediaConnection does not fire the close
event, but the DataConnection 仍然是 class。我的特定流程等待远程启动(数据)连接,然后开始呼叫。
我通过以下方式关闭了 MediaConnection:
- 打开到远程对等点的 DataConnection 和 MediaConnection
- 监控 MediaConnection 关闭事件
- 在作为 DataConnection 关闭处理程序的一部分后关闭所有 WebRTCpeerConnections
这看起来像:
function handlePeerDisconnect() {
// manually close the peer connections
for (let conns in peer.connections) {
peer.connections[conns].forEach((conn, index, array) => {
console.log(`closing ${conn.connectionId} peerConnection (${index + 1}/${array.length})`, conn.peerConnection);
conn.peerConnection.close();
// close it using peerjs methods
if (conn.close)
conn.close();
});
}
}
peer.on('connection', conn => {
let call = peer.call(peerToCall, localStream);
// peerjs bug prevents this from firing: https://github.com/peers/peerjs/issues/636
call.on('close', () => {
console.log("call close event");
handlePeerDisconnect();
});
}
// this one works
conn.on('close', () => {
console.log("conn close event");
handlePeerDisconnect();
});
});
我正在尝试使用 PeerJs 创建一个单向视频应用程序。我已经成功地能够 运行 我自己的对等服务器并通过单击按钮进行连接,但是我无法关闭连接以便对等方可以 receive/establish 与新对等方建立新连接。
每个用户要么是宿主,要么是客户端,永远不会倒退。因此主机可以选择连接到哪个客户端,客户端将开始将其摄像头反馈流式传输回主机。单击按钮调用 closeCon()
函数。
$(document).ready(function(){
peer = new Peer('100001', {host: 'my.url', port: '9900', path: '/peerjs', key: 'peerjs', secure: true, debug: 3});
peer.on("open", function(id) {
console.log("My peer ID is: " + id);
});
video = document.getElementById('vidSrc');
})
function callTheGuy(id){
var getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia;
getUserMedia({video: true, audio: false}, function(stream) {
window.call = peer.call(id, stream);
localStream = stream;
window.call.on('stream', function(remoteStream) {
let video = document.getElementById('vidArea');
video.srcObject = remoteStream;
video.play();
$("#videoModal").modal('show')
});
}, function(err) {
console.log('Failed to get local stream' ,err);
});
}
function closeCon(){
window.call.close();
}
这一切都很好,我得到了我的视频源,没问题。这是我的客户端代码:
peer = new Peer(serverId, {
host: "my.url",
port: "9900",
path: "/peerjs",
key: "peerjs",
debug: 3,
secure: true
});
peer.on("open", function(id) {
console.log("My peer ID is: " + id);
});
var getUserMedia =
navigator.getUserMedia ||
navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia;
peer.on("call", function(call) {
getUserMedia(
{ video: true, audio: false },
function(stream) {
localStream = stream;
call.answer(stream); // Answer the call with an A/V stream.
},
function(err) {
console.log("Failed to get local stream", err);
}
);
call.on("close", function() {
console.log("closing");
});
});
问题是当我调用 closeCon()
时,客户端文件没有收到关闭事件。
call.on("close", function() {
console.log("closing");
});
永远不会被解雇。我不确定为什么会发生这种情况,但除非关闭事件得到处理,否则客户端会保持与原始主机的连接,并且无法接受来自后续主机请求的连接。有人有什么建议吗?
2021 年 3 月 7 日更新
我发现这是个问题,PeerJs 还没有修复。 (问题link:https://github.com/peers/peerjs/issues/636)
你可以在Socketio“disconnect”中触发close事件作为解决方案
服务器
socket.on("disconnect", (reason)=>{
socket.broadcast.emit("user-disconnected", userId);
});
客户
socket.on("user-disconnected", (userId)=>{
// remove video or add your code here
});
在发现我的 peerConnections 继续使用 chrome://webrtc-internals 发送流数据后,我 运行 陷入了这个问题。我目前正在使用 public peerjs 服务器。 MediaConnection does not fire the close
event, but the DataConnection 仍然是 class。我的特定流程等待远程启动(数据)连接,然后开始呼叫。
我通过以下方式关闭了 MediaConnection:
- 打开到远程对等点的 DataConnection 和 MediaConnection
- 监控 MediaConnection 关闭事件
- 在作为 DataConnection 关闭处理程序的一部分后关闭所有 WebRTCpeerConnections
这看起来像:
function handlePeerDisconnect() {
// manually close the peer connections
for (let conns in peer.connections) {
peer.connections[conns].forEach((conn, index, array) => {
console.log(`closing ${conn.connectionId} peerConnection (${index + 1}/${array.length})`, conn.peerConnection);
conn.peerConnection.close();
// close it using peerjs methods
if (conn.close)
conn.close();
});
}
}
peer.on('connection', conn => {
let call = peer.call(peerToCall, localStream);
// peerjs bug prevents this from firing: https://github.com/peers/peerjs/issues/636
call.on('close', () => {
console.log("call close event");
handlePeerDisconnect();
});
}
// this one works
conn.on('close', () => {
console.log("conn close event");
handlePeerDisconnect();
});
});