From bd7b9ed492dd5ef414a1bd4bebe526916441d463 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Tue, 22 Jan 2019 20:44:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=8F=E5=B0=91=E6=8D=95=E8=8E=B7=E9=9F=B3?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=97=B6=E7=94=B3=E8=AF=B7=E5=86=85=E5=AD=98?= =?UTF-8?q?=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 减少音频视频捕获过程中频繁申请内存。 --- ReadMe.txt | 4 +++ client/Audio.cpp | 5 +--- client/AudioManager.cpp | 9 ++++-- client/AudioManager.h | 1 + client/CaptureVideo.cpp | 13 ++++---- client/CaptureVideo.h | 7 ++++- client/VideoManager.cpp | 46 ++++++++++++++++++++--------- client/VideoManager.h | 3 +- server/2015Remote/2015RemoteDlg.cpp | 5 ---- server/2015Remote/Audio.cpp | 3 +- server/2015Remote/CpuUseage.cpp | 3 +- 11 files changed, 63 insertions(+), 36 deletions(-) diff --git a/ReadMe.txt b/ReadMe.txt index 993353b..58cac5d 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -133,3 +133,7 @@ 2019.1.21 减少远程桌面new缓冲区的频率,将部分从堆上new固定内存的操作改用从栈上分配内存。 + +2019.1.22 + +减少音频视频捕获过程中频繁申请内存。 diff --git a/client/Audio.cpp b/client/Audio.cpp index e657fcb..0d003b1 100644 --- a/client/Audio.cpp +++ b/client/Audio.cpp @@ -147,10 +147,7 @@ LPBYTE CAudio::GetRecordBuffer(LPDWORD dwBufferSize) { return NULL; } - if (dwBufferSize == NULL) - { - return NULL; - } + SetEvent(m_hStartRecord); WaitForSingleObject(m_hEventWaveIn, INFINITE); *dwBufferSize = m_ulBufferLength; diff --git a/client/AudioManager.cpp b/client/AudioManager.cpp index 342edc4..7e0656b 100644 --- a/client/AudioManager.cpp +++ b/client/AudioManager.cpp @@ -31,6 +31,7 @@ CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObj m_ClientObject->OnServerSending((char*)&bToken, 1); WaitForDialogOpen(); //ȴԻ + szPacket = NULL; m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, (LPVOID)this, 0, NULL); @@ -77,7 +78,7 @@ BOOL CAudioManager::SendRecordBuffer() if (szBuffer == NULL) return 0; //仺 - LPBYTE szPacket = new BYTE[dwBufferSize + 1]; + szPacket = szPacket ? szPacket : new BYTE[dwBufferSize + 1]; //ͷ szPacket[0] = TOKEN_AUDIO_DATA; //ض˷͸Ϣ //ƻ @@ -87,7 +88,6 @@ BOOL CAudioManager::SendRecordBuffer() { dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1); } - delete szPacket; return dwReturn; } @@ -103,6 +103,11 @@ CAudioManager::~CAudioManager() delete m_AudioObject; m_AudioObject = NULL; } + if (szPacket) + { + delete [] szPacket; + szPacket = NULL; + } printf("~CAudioManager %x\n", this); } diff --git a/client/AudioManager.h b/client/AudioManager.h index c6b402b..620e5a4 100644 --- a/client/AudioManager.h +++ b/client/AudioManager.h @@ -26,6 +26,7 @@ public: BOOL SendRecordBuffer(); CAudio* m_AudioObject; + LPBYTE szPacket; // Ƶ }; #endif // !defined(AFX_AUDIOMANAGER_H__B47ECAB3_9810_4031_9E2E_BC34825CAD74__INCLUDED_) diff --git a/client/CaptureVideo.cpp b/client/CaptureVideo.cpp index 3cc142e..799baca 100644 --- a/client/CaptureVideo.cpp +++ b/client/CaptureVideo.cpp @@ -12,18 +12,20 @@ CSampleGrabberCB mCB; CCaptureVideo::CCaptureVideo() { - if(FAILED(CoInitialize(NULL))) + if(FAILED(CoInitialize(NULL))) { return; } m_pCapture = NULL; m_pGB = NULL; m_pMC = NULL; - m_pVW = NULL; + m_pVW = NULL; + m_bExit = FALSE; } CCaptureVideo::~CCaptureVideo() { + m_bExit = TRUE; if(m_pMC)m_pMC->StopWhenReady(); if(m_pVW){ m_pVW->put_Visible(OAFALSE); @@ -55,7 +57,7 @@ HRESULT CCaptureVideo::Open(int iDeviceID,int iPress) hResult = m_pGB->AddFilter(m_pBF, L"Capture Filter"); hResult = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, - IID_ISampleGrabber, (void**)&m_pGrabber); //ڴ + IID_ISampleGrabber, (void**)&m_pGrabber); //ڴ if(FAILED(hResult)) break; @@ -258,10 +260,9 @@ LPBYTE CCaptureVideo::GetDIB(DWORD& dwSize) { if (mCB.bStact==CMD_CAN_SEND) //ıһ·͵״̬ { - szBuffer = mCB.GetNextScreen(dwSize);//ͨһijԱõƵݣǼ + szBuffer = mCB.GetNextScreen(dwSize); } - } while (szBuffer==NULL); - + } while (szBuffer==NULL && !m_bExit); return szBuffer; } diff --git a/client/CaptureVideo.h b/client/CaptureVideo.h index bd7a106..c683419 100644 --- a/client/CaptureVideo.h +++ b/client/CaptureVideo.h @@ -36,7 +36,7 @@ public: LPBITMAPINFO m_BitmapInfor_Full; BYTE* m_BitmapData_Full; BOOL bStact; - DWORD m_dwSize; + DWORD m_dwSize; // ƵͼݴС CSampleGrabberCB() { @@ -152,6 +152,7 @@ public: } }; +extern CSampleGrabberCB mCB; class CCaptureVideo { @@ -165,6 +166,10 @@ public: LPBYTE GetDIB(DWORD& dwSize); + int GetDIBBufSize() const { return mCB.m_dwSize; } + + BOOL m_bExit; + HWND m_hWnd; IGraphBuilder * m_pGB; //ֵͨԷ FCDO Filter Control Device Object diff --git a/client/VideoManager.cpp b/client/VideoManager.cpp index 32f672d..74d3844 100644 --- a/client/VideoManager.cpp +++ b/client/VideoManager.cpp @@ -20,6 +20,7 @@ CVideoManager::CVideoManager(IOCPClient* ClientObject, int n) : CManager(ClientO m_fccHandler = 1129730893; m_CapVideo.Open(0,0); // + lpBuffer = NULL; m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread, this, 0, NULL); @@ -39,17 +40,29 @@ DWORD CVideoManager::WorkThread(LPVOID lParam) This->SendBitMapInfor(); //bmpλͼṹ // ȿƶ˶Ի - This->WaitForDialogOpen(); + This->WaitForDialogOpen(); +#if USING_ZLIB + const int fps = 8;// ֡ +#elif USING_LZ4 + const int fps = 8;// ֡ +#else + const int fps = 8;// ֡ +#endif + const int sleep = 1000 / fps;// ʱ䣨ms + timeBeginPeriod(1); while (This->m_bIsWorking) { // ٶ - if ((GetTickCount() - dwLastScreen) < 150) - Sleep(100); - + int span = sleep-(GetTickCount() - dwLastScreen); + Sleep(span > 0 ? span : 1); + if (span < 0) + printf("SendScreen Span = %d ms\n", span); dwLastScreen = GetTickCount(); - This->SendNextScreen(); //ûѹصĴˣǵsendNextScreen + if(FALSE == This->SendNextScreen()) + break; } + timeEndPeriod(1); This->Destroy(); std::cout<<"CVideoManager WorkThread end\n"; @@ -60,7 +73,7 @@ DWORD CVideoManager::WorkThread(LPVOID lParam) CVideoManager::~CVideoManager() { InterlockedExchange((LPLONG)&m_bIsWorking, FALSE); - + m_CapVideo.m_bExit = TRUE; WaitForSingleObject(m_hWorkThread, INFINITE); CloseHandle(m_hWorkThread); std::cout<<"CVideoManager ~CVideoManager \n"; @@ -69,10 +82,13 @@ CVideoManager::~CVideoManager() delete m_pVideoCodec; m_pVideoCodec = NULL; } + if (lpBuffer) + delete [] lpBuffer; } void CVideoManager::Destroy() { + m_bIsWorking = FALSE; std::cout<<"CVideoManager Destroy \n"; if (m_pVideoCodec) //ѹ { @@ -90,18 +106,21 @@ void CVideoManager::SendBitMapInfor() m_ClientObject->OnServerSending((char*)szBuffer, dwBytesLength); } -void CVideoManager::SendNextScreen() +BOOL CVideoManager::SendNextScreen() { DWORD dwBmpImageSize=0; LPVOID lpDIB =m_CapVideo.GetDIB(dwBmpImageSize); + if(lpDIB == NULL) + return FALSE; + // token + IsCompress + m_fccHandler + DIB - int nHeadLen = 1 + 1 + 4; + const int nHeadLen = 1 + 1 + 4; UINT nBufferLen = nHeadLen + dwBmpImageSize; - LPBYTE lpBuffer = new BYTE[nBufferLen]; + lpBuffer = lpBuffer ? lpBuffer : new BYTE[nBufferLen]; lpBuffer[0] = TOKEN_WEBCAM_DIB; - lpBuffer[1] = m_bIsCompress; //ѹ + lpBuffer[1] = m_bIsCompress; //ѹ memcpy(lpBuffer + 2, &m_fccHandler, sizeof(DWORD)); //ォƵѹдҪ͵Ļ @@ -109,15 +128,14 @@ void CVideoManager::SendNextScreen() if (m_bIsCompress && m_pVideoCodec) //жϣǷѹѹǷʼɹɹѹ { int nCompressLen = 0; - //ѹƵ + //ѹƵ bool bRet = m_pVideoCodec->EncodeVideoData((LPBYTE)lpDIB, m_CapVideo.GetBmpInfor()->bmiHeader.biSizeImage, lpBuffer + nHeadLen, &nCompressLen, NULL); if (!nCompressLen) { // some thing error - delete [] lpBuffer; - return; + return FALSE; } //¼㷢ݰĴС ʣ¾Ƿˣǵض˿һƵѹô //ض˵void CVideoDlg::OnReceiveComplete(void) @@ -133,7 +151,7 @@ void CVideoManager::SendNextScreen() m_ClientObject->OnServerSending((char*)lpBuffer, nPacketLen); - delete [] lpBuffer; + return TRUE; } diff --git a/client/VideoManager.h b/client/VideoManager.h index 573e108..3442354 100644 --- a/client/VideoManager.h +++ b/client/VideoManager.h @@ -23,7 +23,7 @@ public: HANDLE m_hWorkThread; void SendBitMapInfor(); - void SendNextScreen(); + BOOL SendNextScreen(); static DWORD WorkThread(LPVOID lParam); CCaptureVideo m_CapVideo; @@ -32,6 +32,7 @@ public: DWORD m_fccHandler; bool m_bIsCompress; + LPBYTE lpBuffer; // ץͼ CVideoCodec *m_pVideoCodec; //ѹ void Destroy(); diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index c7226a2..f8da1b3 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -815,11 +815,6 @@ VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection) { m_iocpServer = new IOCPServer; //̬ǵ - if (m_iocpServer==NULL) - { - return; - } - if (m_iocpServer->StartServer(NotifyProc, OfflineProc, nPort)==FALSE) { OutputDebugStringA("======> StartServer Failed \n"); diff --git a/server/2015Remote/Audio.cpp b/server/2015Remote/Audio.cpp index 6643cbc..d9fd567 100644 --- a/server/2015Remote/Audio.cpp +++ b/server/2015Remote/Audio.cpp @@ -33,8 +33,7 @@ CAudio::CAudio() m_ulBufferLength = 1000; - int i = 0; - for (i = 0; i < 2; ++i) + for (int i = 0; i < 2; ++i) { m_InAudioData[i] = new BYTE[m_ulBufferLength]; m_InAudioHeader[i] = new WAVEHDR; diff --git a/server/2015Remote/CpuUseage.cpp b/server/2015Remote/CpuUseage.cpp index 01b726a..0e97916 100644 --- a/server/2015Remote/CpuUseage.cpp +++ b/server/2015Remote/CpuUseage.cpp @@ -12,7 +12,8 @@ CCpuUsage::CCpuUsage() CCpuUsage::~CCpuUsage() { PdhCloseQuery(m_hQuery); //رռ - delete m_pCounterStruct; + if (m_pCounterStruct) + delete m_pCounterStruct; }