diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index 178865d..f68c4af 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -145,10 +145,19 @@ CScreenSpy::~CScreenSpy() LPBYTE CScreenSpy::GetFirstScreenData(ULONG* ulFirstScreenLength) { + if (m_hTargetWnd && IsIconic(m_hTargetWnd)) { + *ulFirstScreenLength = 0; + return nullptr; + } ScanScreen(m_hFullMemDC, m_hDeskTopDC, m_ulFullWidth, m_ulFullHeight); m_RectBuffer[0] = TOKEN_FIRSTSCREEN; LPBYTE bmp = scaleBitmap(m_BmpZoomBuffer, (LPBYTE)m_BitmapData_Full); memcpy(m_FirstBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage); + // H264/AV1:不发原始位图,IDR 到达后服务端自行解锁;节省每次切窗口的流量峰值 + if (m_bAlgorithm == ALGORITHM_H264) { + *ulFirstScreenLength = 0; + return nullptr; + } memcpy(1 + m_RectBuffer, bmp, m_BitmapInfor_Send->bmiHeader.biSizeImage); if (m_bAlgorithm == ALGORITHM_GRAY) { ToGray(1 + m_RectBuffer, 1 + m_RectBuffer, m_BitmapInfor_Send->bmiHeader.biSizeImage); diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index ef7bb8f..b143be5 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -1478,6 +1478,11 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(bool keyFrame) if (!m_bHide) { if (Decode((LPBYTE)NextScreenData, NextScreenLength)) { bChange = TRUE; + // 解码成功即代表 IDR 参考帧已建立(编码器首帧强制 IDR),解除门控。 + // 不依赖 IsAnyKeyframe:某些硬编输出格式或解码器首帧 EAGAIN 延迟会导致 + // 关键帧检测误判,进而让 m_bIsFirst 永久为 TRUE("请等待"卡死)。 + if (m_bIsFirst) + m_bIsFirst = FALSE; } } // Broadcast video frame to web clients (only for Web session dialogs)