完善录制被控端视频的功能

1、修复被控端消息提示对话框在消息换行时显示不完整的问题。
2、添加/完善录制远程被控端视频的功能。
This commit is contained in:
yuanyuanxiang
2019-01-26 10:35:10 +08:00
parent bd7b9ed492
commit be45b5bd89
6 changed files with 200 additions and 21 deletions

View File

@@ -137,3 +137,9 @@
2019.1.22 2019.1.22
减少音频视频捕获过程中频繁申请内存。 减少音频视频捕获过程中频繁申请内存。
2019.1.25
1、修复被控端消息提示对话框在消息换行时显示不完整的问题。
2、添加/完善录制远程被控端视频的功能。

View File

@@ -15,7 +15,7 @@ using namespace std;
#define ID_TIMER_DELAY_DISPLAY 2 #define ID_TIMER_DELAY_DISPLAY 2
#define ID_TIMER_CLOSE_WINDOW 3 #define ID_TIMER_CLOSE_WINDOW 3
#define WIN_WIDTH 250 #define WIN_WIDTH 360
#define WIN_HEIGHT 200 #define WIN_HEIGHT 200
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// Construction/Destruction // Construction/Destruction
@@ -54,7 +54,6 @@ VOID CTalkManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
{ {
memcpy(g_Buffer, szBuffer, ulLength); memcpy(g_Buffer, szBuffer, ulLength);
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>DLG //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>DLG
DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG), DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DIALOG),
NULL,DialogProc); //SDK C MFC C++ NULL,DialogProc); //SDK C MFC C++
break; break;
@@ -126,7 +125,7 @@ VOID CTalkManager::OnDlgTimer(HWND hDlg) //ʱ
{ {
KillTimer(hDlg,ID_TIMER_CLOSE_WINDOW); KillTimer(hDlg,ID_TIMER_CLOSE_WINDOW);
BYTE bToken = TOKEN_TALKCMPLT; // <20><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h BYTE bToken = TOKEN_TALKCMPLT; // <20><><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD> Common.h
g_IOCPClientObject->OnServerSending((char*)&bToken, 1); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>͵<EFBFBD>ָ<EFBFBD><D6B8> g_IOCPClientObject->OnServerSending((char*)&bToken, 1); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7>͵<EFBFBD>ָ<EFBFBD><D6B8>
EndDialog(hDlg,0); EndDialog(hDlg,0);
} }
break; break;

View File

@@ -35,11 +35,12 @@ DWORD CVideoManager::WorkThread(LPVOID lParam)
if (This->Initialize()) //ת<><D7AA>Initialize if (This->Initialize()) //ת<><D7AA>Initialize
{ {
This->m_bIsCompress=true; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ѹ<EFBFBD><D1B9> This->m_bIsCompress=true; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ѹ<EFBFBD><D1B9>
printf("ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
} }
This->SendBitMapInfor(); //<2F><><EFBFBD><EFBFBD>bmpλͼ<CEBB> This->SendBitMapInfor(); //<2F><><EFBFBD><EFBFBD>bmpλͼ<CEBB>
// <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20>ȿ<EFBFBD><C8BF>ƶ˶Ի<CBB6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
This->WaitForDialogOpen(); This->WaitForDialogOpen();
#if USING_ZLIB #if USING_ZLIB
const int fps = 8;// ֡<><D6A1> const int fps = 8;// ֡<><D6A1>
@@ -163,7 +164,21 @@ VOID CVideoManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
{ {
NotifyDialogIsOpen(); NotifyDialogIsOpen();
break; break;
} }
case COMMAND_WEBCAM_ENABLECOMPRESS: // Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (m_pVideoCodec)
InterlockedExchange((LPLONG)&m_bIsCompress, true);
printf("ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
break;
}
case COMMAND_WEBCAM_DISABLECOMPRESS: // ԭʼ<D4AD><CABC><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>
{
InterlockedExchange((LPLONG)&m_bIsCompress, false);
printf("<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>.\n");
break;
}
} }
} }

View File

@@ -43,7 +43,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, Client
sizeof(SHFILEINFO), sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES SHGFI_ICON | SHGFI_USEFILEATTRIBUTES
); );
m_hIcon = sfi.hIcon; m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_FATHER));
// <20><><EFBFBD><EFBFBD>ϵͳͼ<CDB3><CDBC><EFBFBD>б<EFBFBD> // <20><><EFBFBD><EFBFBD>ϵͳͼ<CDB3><CDBC><EFBFBD>б<EFBFBD>
static HIMAGELIST hImageList_Large = (HIMAGELIST)SHGetFileInfo static HIMAGELIST hImageList_Large = (HIMAGELIST)SHGetFileInfo
( (

View File

@@ -9,15 +9,110 @@
enum enum
{ {
IDM_ENABLECOMPRESS = 0x0010, // <20><>Ƶѹ<C6B5><D1B9>
IDM_SAVEAVI, // <20><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC> IDM_SAVEAVI, // <20><><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>
}; };
// CVideoDlg <20>Ի<EFBFBD><D4BB><EFBFBD> // CVideoDlg <20>Ի<EFBFBD><D4BB><EFBFBD>
IMPLEMENT_DYNAMIC(CVideoDlg, CDialog) IMPLEMENT_DYNAMIC(CVideoDlg, CDialog)
AVISTREAMINFO CBmpToAvi::m_si;
CBmpToAvi::CBmpToAvi()
{
m_pfile = NULL;
m_pavi = NULL;
AVIFileInit();
}
CBmpToAvi::~CBmpToAvi()
{
AVIFileExit();
}
bool CBmpToAvi::Open( LPCTSTR szFile, LPBITMAPINFO lpbmi )
{
if (szFile == NULL)
return false;
m_nFrames = 0;
if (AVIFileOpen(&m_pfile, szFile, OF_WRITE | OF_CREATE, NULL))
return false;
m_si.fccType = streamtypeVIDEO;
m_si.fccHandler = BI_RGB;
m_si.dwScale = 1;
m_si.dwRate = 8; // ֡<><D6A1>
SetRect(&m_si.rcFrame, 0, 0, lpbmi->bmiHeader.biWidth, lpbmi->bmiHeader.biHeight);
m_si.dwSuggestedBufferSize = lpbmi->bmiHeader.biSizeImage;
if (AVIFileCreateStream(m_pfile, &m_pavi, &m_si))
return false;
if (AVIStreamSetFormat(m_pavi, 0, lpbmi, sizeof(BITMAPINFO)) != AVIERR_OK)
return false;
return true;
}
bool CBmpToAvi::Write(LPVOID lpBuffer)
{
if (m_pfile == NULL || m_pavi == NULL)
return false;
return AVIStreamWrite(m_pavi, m_nFrames++, 1, lpBuffer, m_si.dwSuggestedBufferSize, AVIIF_KEYFRAME, NULL, NULL) == AVIERR_OK;
}
void CBmpToAvi::Close()
{
if (m_pavi)
{
AVIStreamRelease(m_pavi);
m_pavi = NULL;
}
if (m_pfile)
{
AVIFileRelease(m_pfile);
m_pfile = NULL;
}
}
void CVideoDlg::SaveAvi(void)
{
CMenu *pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu->GetMenuState(IDM_SAVEAVI, MF_BYCOMMAND) & MF_CHECKED)
{
pSysMenu->CheckMenuItem(IDM_SAVEAVI, MF_UNCHECKED);
m_aviFile.Empty();
m_aviStream.Close();
return;
}
CString strFileName = m_strIPAddress + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.avi");
CFileDialog dlg(FALSE, "avi", strFileName, OFN_OVERWRITEPROMPT, "<EFBFBD><EFBFBD>Ƶ<EFBFBD>ļ<EFBFBD>(*.avi)|*.avi|", this);
if(dlg.DoModal () != IDOK)
return;
m_aviFile = dlg.GetPathName();
if (!m_aviStream.Open(m_aviFile, m_BitmapInfor_Full))
{
m_aviFile.Empty();
MessageBox("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>ʧ<EFBFBD><EFBFBD>!");
}
else
{
pSysMenu->CheckMenuItem(IDM_SAVEAVI, MF_CHECKED);
}
}
CVideoDlg::CVideoDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject) CVideoDlg::CVideoDlg(CWnd* pParent, IOCPServer* IOCPServer, CONTEXT_OBJECT *ContextObject)
: CDialog(CVideoDlg::IDD, pParent) : CDialog(CVideoDlg::IDD, pParent)
{ {
m_nCount = 0;
m_aviFile.Empty();
m_ContextObject = ContextObject; m_ContextObject = ContextObject;
m_iocpServer = IOCPServer; m_iocpServer = IOCPServer;
m_BitmapInfor_Full = NULL; m_BitmapInfor_Full = NULL;
@@ -52,6 +147,12 @@ void CVideoDlg::ResetScreen(void)
CVideoDlg::~CVideoDlg() CVideoDlg::~CVideoDlg()
{ {
if (!m_aviFile.IsEmpty())
{
SaveAvi();
m_aviFile.Empty();
}
if (m_pVideoCodec) if (m_pVideoCodec)
{ {
delete m_pVideoCodec; delete m_pVideoCodec;
@@ -103,8 +204,9 @@ BOOL CVideoDlg::OnInitDialog()
m_hDD = DrawDibOpen(); m_hDD = DrawDibOpen();
m_hDC = ::GetDC(m_hWnd); m_hDC = ::GetDC(m_hWnd);
SysMenu->AppendMenu(MF_STRING, IDM_ENABLECOMPRESS, "<EFBFBD><EFBFBD>Ƶѹ<EFBFBD><EFBFBD>(&C)");
SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>(&V)"); SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD>(&V)");
SysMenu->AppendMenu(MF_SEPARATOR);
CString strString; CString strString;
@@ -123,6 +225,11 @@ BOOL CVideoDlg::OnInitDialog()
void CVideoDlg::OnClose() void CVideoDlg::OnClose()
{ {
if (!m_aviFile.IsEmpty())
{
SaveAvi();
m_aviFile.Empty();
}
#if CLOSE_DELETE_DLG #if CLOSE_DELETE_DLG
m_ContextObject->v1 = 0; m_ContextObject->v1 = 0;
#endif #endif
@@ -137,6 +244,8 @@ void CVideoDlg::OnClose()
void CVideoDlg::OnReceiveComplete(void) void CVideoDlg::OnReceiveComplete(void)
{ {
++m_nCount;
switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0]) switch (m_ContextObject->InDeCompressedBuffer.GetBuffer(0)[0])
{ {
case TOKEN_WEBCAM_DIB: case TOKEN_WEBCAM_DIB:
@@ -156,35 +265,31 @@ void CVideoDlg::DrawDIB(void)
if (SysMenu == NULL) if (SysMenu == NULL)
return; return;
int nHeadLen = 1 + 1 + 4; const int nHeadLen = 1 + 1 + 4;
LPBYTE szBuffer = m_ContextObject->InDeCompressedBuffer.GetBuffer(); LPBYTE szBuffer = m_ContextObject->InDeCompressedBuffer.GetBuffer();
UINT ulBufferLen = m_ContextObject->InDeCompressedBuffer.GetBufferLength(); UINT ulBufferLen = m_ContextObject->InDeCompressedBuffer.GetBufferLength();
if (szBuffer[1] == 0) // û<>о<EFBFBD><D0BE><EFBFBD>H263ѹ<33><D1B9><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD> if (szBuffer[1] == 0) // û<>о<EFBFBD><D0BE><EFBFBD>H263ѹ<33><D1B9><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
{ {
// <20><>һ<EFBFBD>Σ<EFBFBD>û<EFBFBD><C3BB>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>֧<EFBFBD><D6A7>ָ<EFBFBD><D6B8><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD> // <20><>һ<EFBFBD>Σ<EFBFBD>û<EFBFBD><C3BB>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD>֧<EFBFBD><D6A7>ָ<EFBFBD><D6B8><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD>
/* if (m_nCount == 1) if (m_nCount == 1)
{ {
pSysMenu->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED); SysMenu->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
} }
pSysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_UNCHECKED); SysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_UNCHECKED);
memcpy(m_lpScreenDIB, lpBuffer + nHeadLen, nBufferLen - nHeadLen);*/ memcpy(m_BitmapData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen);
} }
else // <20><><EFBFBD><EFBFBD> else // <20><><EFBFBD><EFBFBD>
{ {
////<2F><><EFBFBD><EFBFBD><EFBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD> ////<2F><><EFBFBD><EFBFBD><EFBBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵĵڶ<C4B5><DAB6><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>
InitCodec(*(LPDWORD)(szBuffer + 2)); //<2F>ж<EFBFBD> InitCodec(*(LPDWORD)(szBuffer + 2)); //<2F>ж<EFBFBD>
if (m_pVideoCodec != NULL) if (m_pVideoCodec != NULL)
{ {
//pSysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_CHECKED); SysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, MF_CHECKED);
memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //<2F><>Ƶû<C6B5>н<EFBFBD>ѹ memcpy(m_BitmapCompressedData_Full, szBuffer + nHeadLen, ulBufferLen - nHeadLen); //<2F><>Ƶû<C6B5>н<EFBFBD>ѹ
//<2F><><EFBFBD>ʼ<EFBFAA><CABC><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬδѹ<CEB4><D1B9><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD>ϡ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avi<76><69>ʽ //<2F><><EFBFBD>ʼ<EFBFAA><CABC><EFBFBD><EFBFBD><EBA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬδѹ<CEB4><D1B9><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> <20><>ʾ<EFBFBD><CABE><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD>ϡ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>avi<76><69>ʽ
m_pVideoCodec->DecodeVideoData(m_BitmapCompressedData_Full, ulBufferLen - nHeadLen, m_pVideoCodec->DecodeVideoData(m_BitmapCompressedData_Full, ulBufferLen - nHeadLen,
(LPBYTE)m_BitmapData_Full, NULL, NULL); //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݽ<EFBFBD>ѹ<EFBFBD><EFBFBD>m_lpScreenDIB (LPBYTE)m_BitmapData_Full, NULL, NULL); //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݽ<EFBFBD>ѹ
/* m_pVideoCodec->DecodeVideoData(m_lpCompressDIB, nBufferLen - nHeadLen,
(LPBYTE)m_lpScreenDIB, NULL, NULL); //<2F><><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ݽ<EFBFBD>ѹ<EFBFBD><D1B9>m_lpScreenDIB*/
} }
} }
@@ -198,9 +303,16 @@ void CVideoDlg::InitCodec(DWORD fccHandler)
return; return;
m_pVideoCodec = new CVideoCodec; m_pVideoCodec = new CVideoCodec;
if (!m_pVideoCodec->InitCompressor(m_BitmapInfor_Full, fccHandler)) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˸<EFBFBD>ʽ ƥ<><C6A5><EFBFBD><EFBFBD> if (!m_pVideoCodec->InitCompressor(m_BitmapInfor_Full, fccHandler))
{ {
OutputDebugStringA("======> InitCompressor failed \n"); OutputDebugStringA("======> InitCompressor failed \n");
delete m_pVideoCodec;
// <20><>NULL, <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ΪNULL<4C><4C><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9>
m_pVideoCodec = NULL;
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>
BYTE bToken = COMMAND_WEBCAM_DISABLECOMPRESS;
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE));
GetSystemMenu(FALSE)->EnableMenuItem(IDM_ENABLECOMPRESS, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);
} }
} }
@@ -212,6 +324,19 @@ void CVideoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{ {
case IDM_SAVEAVI: case IDM_SAVEAVI:
{ {
SaveAvi();
break;
}
case IDM_ENABLECOMPRESS:
{
CMenu *pSysMenu = GetSystemMenu(FALSE);
bool bIsChecked = pSysMenu->GetMenuState(IDM_ENABLECOMPRESS, MF_BYCOMMAND) & MF_CHECKED;
pSysMenu->CheckMenuItem(IDM_ENABLECOMPRESS, bIsChecked ? MF_UNCHECKED : MF_CHECKED);
bIsChecked = !bIsChecked;
BYTE bToken = COMMAND_WEBCAM_ENABLECOMPRESS;
if (!bIsChecked)
bToken = COMMAND_WEBCAM_DISABLECOMPRESS;
m_iocpServer->OnClientPreSending(m_ContextObject, &bToken, sizeof(BYTE));
break; break;
} }
} }
@@ -243,4 +368,14 @@ void CVideoDlg::OnPaint()
m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight,
DDF_SAME_HDC DDF_SAME_HDC
); );
if (!m_aviFile.IsEmpty())
{
m_aviStream.Write(m_BitmapData_Full);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>¼<EFBFBD><C2BC>
SetBkMode(m_hDC, TRANSPARENT);
SetTextColor(m_hDC, RGB(0xff,0x00,0x00));
const LPCTSTR lpTipsString = "Recording";
TextOut(m_hDC, 0, 0, lpTipsString, lstrlen(lpTipsString));
}
} }

View File

@@ -7,6 +7,25 @@
#pragma comment(lib,"Vfw32.lib") #pragma comment(lib,"Vfw32.lib")
/************************************************************************
* @class CBmpToAvi
* @brief λͼתAVI֡
************************************************************************/
class CBmpToAvi
{
public:
CBmpToAvi();
virtual ~CBmpToAvi();
bool Open(LPCTSTR szFile, LPBITMAPINFO lpbmi);
bool Write(LPVOID lpBuffer);
void Close();
private:
PAVIFILE m_pfile;
PAVISTREAM m_pavi;
int m_nFrames;
static AVISTREAMINFO m_si; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ǿ<EFBFBD>̬<EFBFBD><CCAC>
};
class CVideoCodec class CVideoCodec
{ {
COMPVARS m_cv; COMPVARS m_cv;
@@ -156,8 +175,13 @@ public:
void OnReceiveComplete(void); void OnReceiveComplete(void);
void DrawDIB(void); void DrawDIB(void);
void SaveAvi(void);
void InitCodec(DWORD fccHandler); void InitCodec(DWORD fccHandler);
CString m_aviFile; // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>վ<EFBFBD>д<EFBFBD><D0B4>
CBmpToAvi m_aviStream;
int m_nCount;
HDC m_hDC; HDC m_hDC;
HDRAWDIB m_hDD; HDRAWDIB m_hDD;