From 92bf9c9ccb00b154874b62813830fde0d37173e4 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sat, 23 May 2026 12:09:14 +0200 Subject: [PATCH] Fix(record): correct MJPEG upside-down playback and remove 0-byte AVI residue on encoder open failure --- server/2015Remote/Bmp2Video.cpp | 6 +++--- server/2015Remote/Bmp2Video.h | 9 +++++---- server/2015Remote/ScreenSpyDlg.cpp | 1 + server/2015Remote/lang/en_US.ini | 4 ++++ server/2015Remote/lang/zh_TW.ini | 4 ++++ 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/server/2015Remote/Bmp2Video.cpp b/server/2015Remote/Bmp2Video.cpp index 91457d0..d01e994 100644 --- a/server/2015Remote/Bmp2Video.cpp +++ b/server/2015Remote/Bmp2Video.cpp @@ -284,13 +284,13 @@ bool BmpToJpeg(LPVOID lpBuffer, int width, int height, int quality, return false; } - // 复制数据(注意:DIB 是底部到顶部,需要翻转) + // 输入已为 top-down 的紧凑 BGR24(调用方已通过 Process24BitBmp / + // ConvertScreenshot32to24 完成翻转与去对齐),此处直接按行拷贝即可 BYTE* srcData = (BYTE*)lpBuffer; BYTE* dstData = (BYTE*)bitmapData.Scan0; for (int y = 0; y < height; y++) { - // DIB 是从底部开始的,所以需要翻转 - BYTE* srcRow = srcData + (height - 1 - y) * rowSize; + BYTE* srcRow = srcData + y * rowSize; BYTE* dstRow = dstData + y * bitmapData.Stride; memcpy(dstRow, srcRow, width * 3); } diff --git a/server/2015Remote/Bmp2Video.h b/server/2015Remote/Bmp2Video.h index 17b79ab..1cabadd 100644 --- a/server/2015Remote/Bmp2Video.h +++ b/server/2015Remote/Bmp2Video.h @@ -1,6 +1,7 @@ #pragma once #include #pragma comment(lib,"Vfw32.lib") +#include "LangManager.h" #define ERR_INVALID_PARAM 1 #define ERR_NO_ENCODER 2 @@ -30,13 +31,13 @@ public: { switch (result) { case ERR_INVALID_PARAM: - return ("无效参数"); + return _L("无效参数").GetString(); case ERR_NOT_SUPPORT: - return ("不支持的位深度,需要24位或32位"); + return _L("不支持的位深度,需要24位或32位").GetString(); case ERR_NO_ENCODER: - return ("未安装x264编解码器 \n下载地址:https://sourceforge.net/projects/x264vfw"); + return _L("未安装x264编解码器 \n下载地址:https://sourceforge.net/projects/x264vfw").GetString(); case ERR_INTERNAL: - return("创建AVI文件失败"); + return _L("创建AVI文件失败").GetString(); default: return "succeed"; } diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index f412072..cc0df9d 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -1911,6 +1911,7 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) FCCHandler handler = nID == IDM_SAVEAVI ? ENCODER_MJPEG : ENCODER_H264; int code; if (code = m_aviStream.Open(m_aviFile, m_BitmapInfor_Full, rate, handler)) { + DeleteFile(m_aviFile); // 删除 AVIFileOpen 残留的 0 字节文件 MessageBoxL(CString("Create Video(*.avi) Failed:\n") + m_aviFile + "\r\n" + _TR("错误代码: ") + CBmpToAvi::GetErrMsg(code).c_str(), "提示", MB_ICONINFORMATION); m_aviFile = _T(""); diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 13f22f2..9a210c5 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -1888,3 +1888,7 @@ FRPC Զ FRP =Revoke FRP Configuration ѳȨ %s FRP ãԶ̶˿ %d ͷš=Revoked FRP configuration for license %s. Remote port %d has been released. ɹ=Revoked Successfully +Ч=Invalid argument +ֵ֧λȣҪ24λ32λ=Bitmap depth is unsupported +δװx264 \nصַhttps://sourceforge.net/projects/x264vfw=x264 Encoder is required \nDownload viahttps://sourceforge.net/projects/x264vfw +AVIļʧ=Create AVI file failed diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index bdeae55..2e8ef97 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -1879,3 +1879,7 @@ FRPC Զ FRP =N FRP ѳȨ %s FRP ãԶ̶˿ %d ͷš=ѳNڙ %s FRP ãhBӲ %d ጷš ɹ=Nɹ +ЧЧ +ֵ֧λȣҪ24λ32λ=ֵ֧λȣҪ24λ32λ +δװx264 \nصַhttps://sourceforge.net/projects/x264vfw=δװx264 \nصַhttps://sourceforge.net/projects/x264vfw +AVIļʧ=AVIļʧ