From f62d7ff6872fdbff0fb2f932efe3e95db880a43e Mon Sep 17 00:00:00 2001 From: wdvipa Date: Sun, 15 Feb 2026 19:21:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=E9=BB=91=E5=B8=A7=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2?= =?UTF-8?q?=E6=97=A0=E9=9A=9C=E7=A2=8D=E6=88=AA=E5=9B=BE=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 连续黑帧不再发送captureMode:accessibility指令给安卓端 - 黑帧计数仅用于日志统计,不触发模式切换 - 避免服务端误判导致安卓端回退到低帧率无障碍截图 --- devices.db | Bin 585728 -> 585728 bytes src/index.ts | 17 +++++---------- src/services/MessageRouter.ts | 39 ++++------------------------------ 3 files changed, 9 insertions(+), 47 deletions(-) diff --git a/devices.db b/devices.db index c7a60ba9dcccf6ab62b8a2b23584f33b360f4303..6a0f7af96ca22a747e4dd1cb0410b4b5a3794e62 100644 GIT binary patch delta 530 zcmZvZJx{_w9EU|jSXwo4z^KuLxTu`>(jMiUsP#Qsz=oJx5JBDoDJllzWaD7sq+ww3 zJE&oBc5rbsaW;Mfzkzskg6Qxpmps4!licN3=<+LcJLyT?O|5uRPY3!;2qA_cBM_(v z^MS`YZJ>%(KCw#GSYsoz7K_F7_UnucJ&)}Vb9z=*Eny&y5dtD8deyP7JGMtKDDVn~ z1U|vA!2jH_1HRgLK#C8H+>cQCUA~d$q)(|O#oJ?}n&dSc*nC+IF8y~FLrlXEhmm_y zL}Cq4q;SJo63zrD(9?W^Y;9)M)kdLs)-C<3AV9RP0^BplQDP)dIj@%X)MBNY7S2Y$ z12v{ZK!hTG=!Bc^N^mE-ex7V3vAJC?%!z#S+A!nbbl=+7Oh?rGKDaV0l^VbvEWwd=j$mole3O$W<9r=ITX%r kzeAw-7JyXPSK)3!1!z&k2Yf-9#B@M!Ss(PV)Q)mR2T)R)!{ehQ`KG46CLGzUL6xd{my#fN|C4 zEB>+ye8wS$23E#~R>o#}X67c%|MT1b=Q9E^6A&{4F$)m00x=s9vv2>O&%s*2!NhOI bz(0rIY_p()7C&=xqt^6^r`RPxX0HbTlaekg diff --git a/src/index.ts b/src/index.ts index b54b153..4541f52 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1786,17 +1786,14 @@ class RemoteControlServer { }, 5000) // 5s grace period for reconnect } else if (socket.clientType === 'web' && socket.clientId) { - // 🔧 优化Web客户端断开处理 const clientId = socket.clientId const client = this.webClientManager.getClient(clientId) if (client) { - // 如果客户端正在控制设备,释放控制权 if (client.controllingDeviceId) { - this.logger.info(`🔓 Web客户端断开,释放设备控制权: ${client.controllingDeviceId}`) + this.logger.info(`[Disconnect] Web client disconnected, releasing device control: ${client.controllingDeviceId}`) this.webClientManager.releaseDeviceControl(client.controllingDeviceId) - // 通知设备控制者已离开 const deviceSocketId = this.deviceManager.getDeviceSocketId(client.controllingDeviceId) if (deviceSocketId) { const deviceSocket = this.io.sockets.sockets.get(deviceSocketId) @@ -1807,19 +1804,15 @@ class RemoteControlServer { } this.webClientManager.removeClient(clientId) - this.logger.info(`Web客户端断开连接: ${clientId} (IP: ${client.ip})`) + this.logger.info(`[Disconnect] Web client removed: ${clientId} (IP: ${client.ip})`) } else { - // 通过Socket ID移除客户端 this.webClientManager.removeClientBySocketId(socket.id) - this.logger.info(`Web客户端断开连接 (通过Socket ID): ${socket.id}`) + this.logger.info(`[Disconnect] Web client removed by socketId: ${socket.id}`) } - this.logger.info(`📊 当前Web客户端数量: ${this.webClientManager.getClientCount()}`) + this.logger.info(`[Disconnect] Web client count: ${this.webClientManager.getClientCount()}`) } else { - // 🔧 处理未识别的连接类型 - this.logger.warn(`⚠️ 未识别的连接断开: ${socket.id} (类型: ${socket.clientType})`) - - // 尝试清理可能存在的记录 + this.logger.warn(`[Disconnect] Unknown client type: ${socket.id} (type: ${socket.clientType})`) this.webClientManager.removeClientBySocketId(socket.id) } } diff --git a/src/services/MessageRouter.ts b/src/services/MessageRouter.ts index 6b621a4..3a6cbc4 100644 --- a/src/services/MessageRouter.ts +++ b/src/services/MessageRouter.ts @@ -546,52 +546,21 @@ export class MessageRouter { if (dataSize > 0 && dataSize < MIN_VALID_FRAME_SIZE) { this.droppedFrames++ - // ✅ 追踪连续黑帧数 + // 追踪连续黑帧数(仅记录日志,不触发模式切换) const deviceId = screenData.deviceId const count = (this.consecutiveBlackFrames.get(deviceId) || 0) + 1 this.consecutiveBlackFrames.set(deviceId, count) - if (this.routedFrames % 100 === 0) { - this.logger.warn(`⚠️ 过滤黑屏帧: ${dataSize} 字符 < ${MIN_VALID_FRAME_SIZE}, 设备${deviceId}, 连续黑帧${count}, 已丢弃${this.droppedFrames}帧`) - } - - // ✅ 连续50个黑帧后,通知Android端切换到无障碍截图模式 - if (count >= 50 && !this.captureModeSwitchSent.has(deviceId)) { - this.captureModeSwitchSent.add(deviceId) - this.logger.warn(`🔄 设备${deviceId}连续${count}个黑帧,发送切换到无障碍截图模式指令`) - - try { - const deviceSocketId = this.deviceManager.getDeviceSocketId(deviceId) - if (deviceSocketId) { - const deviceSocket = this.webClientManager.io?.sockets.sockets.get(deviceSocketId) - if (deviceSocket) { - deviceSocket.emit('quality_adjust', { - captureMode: 'accessibility', - fps: 10, - quality: 50, - maxWidth: 480, - maxHeight: 854 - }) - this.logger.info(`📤 已向设备${deviceId}发送切换采集模式指令`) - } - } - } catch (e) { - this.logger.error(`❌ 发送切换采集模式指令失败:`, e) - } + if (count % 100 === 1) { + this.logger.warn(`过滤黑屏帧: ${dataSize} 字符 < ${MIN_VALID_FRAME_SIZE}, 设备${deviceId}, 连续黑帧${count}, 已丢弃${this.droppedFrames}帧`) } return false } - // ✅ 收到有效帧,重置黑帧计数 + // 收到有效帧,重置黑帧计数 if (screenData.deviceId) { - const prevCount = this.consecutiveBlackFrames.get(screenData.deviceId) || 0 - if (prevCount > 0) { - this.logger.info(`✅ 设备${screenData.deviceId}收到有效帧(${dataSize}字符),重置黑帧计数(之前${prevCount})`) - } this.consecutiveBlackFrames.set(screenData.deviceId, 0) - // 收到有效帧后允许再次发送切换指令(如果后续又出现黑帧) - this.captureModeSwitchSent.delete(screenData.deviceId) } // 🔧 检查设备是否有控制者,没有控制者直接丢弃(提前检查,减少处理开销)