after calling GetCurrentBuffer(&lBufferSize,NULL), lBufferSize is minus value.
-
Hi, to capture video screen in DirectShow , I did as follwing... it's woring well in case of *.wmv file... but in case of *.avi didn't work... After calling ...GetCurrentBuffer(&lBufferSize,NULL); the value of lBufferSize is minus...(for example -2838382392 ) I don't know why lBufferSize is minus value... void CTest::play() { m_pGB = NULL; m_pMC = NULL; m_pVW = NULL; m_pBV = NULL; m_pME = NULL; m_pMS = NULL; m_pSampleGrabber = NULL; m_pSG = NULL; CoInitialize(NULL); CString m_file; WCHAR wFileName[MAX_PATH]; TCHAR m_szFileName[MAX_PATH]; m_file = m_,"C:\\cs\\mds\\movie\\a.avi"; #ifndef UNICODE MultiByteToWideChar(CP_ACP, 0, m_file , -1, wFileName, MAX_PATH) ; #else lstrcpy(wFileName, m_szFileName); #endif CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGB); CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC,IID_IBaseFilter,(void**)&m_pSampleGrabber); m_pGB->AddFilter(m_pSampleGrabber,L"Sample Grabber"); AM_MEDIA_TYPE m_pMedia; ZeroMemory(&m_pMedia,sizeof(m_pMedia)); m_pMedia.majortype = MEDIATYPE_Video; m_pMedia.subtype = MEDIASUBTYPE_RGB24; m_pSampleGrabber->QueryInterface(IID_ISampleGrabber,(void**)&m_pSG); if(m_pSG != NULL) { m_pSG->;SetMediaType(&m_pMedia); m_pSG->SetBufferSamples(TRUE); } m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC); m_pGB->QueryInterface(IID_IVideoWindow,(void**)&m_pVW); m_pGB->QueryInterface(IID_IBasicVideo,(void**)&m_pBV); m_pGB->QueryInterface(IID_IMediaEventEx,(void**)&m_pME); m_pGB->QueryInterface(IID_IMediaSeeking,(void**)&m_pMS); m_pGB->RenderFile(wFileName,NULL); m_pMC->Run(); } void CTest::ScreenShot() { m_pSampleGrabber->QueryInterface(IID_ISampleGrabber,(void**)&m_pSG); if(m_pSG == NULL) { return; } long lBufferSize; m_pSG->GetCurrentBuffer(&lBufferSize, NULL); BYTE* pBuffer = new BYTE[lBufferSize]; if (!pBuffer) return; m_pSG->GetCurrentBuffer(&lBufferSize, (long *)pBuffer); if (m_pSG != NULL)SaveImage(...); delete pBuffer; }
-
Hi, to capture video screen in DirectShow , I did as follwing... it's woring well in case of *.wmv file... but in case of *.avi didn't work... After calling ...GetCurrentBuffer(&lBufferSize,NULL); the value of lBufferSize is minus...(for example -2838382392 ) I don't know why lBufferSize is minus value... void CTest::play() { m_pGB = NULL; m_pMC = NULL; m_pVW = NULL; m_pBV = NULL; m_pME = NULL; m_pMS = NULL; m_pSampleGrabber = NULL; m_pSG = NULL; CoInitialize(NULL); CString m_file; WCHAR wFileName[MAX_PATH]; TCHAR m_szFileName[MAX_PATH]; m_file = m_,"C:\\cs\\mds\\movie\\a.avi"; #ifndef UNICODE MultiByteToWideChar(CP_ACP, 0, m_file , -1, wFileName, MAX_PATH) ; #else lstrcpy(wFileName, m_szFileName); #endif CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(void**)&m_pGB); CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC,IID_IBaseFilter,(void**)&m_pSampleGrabber); m_pGB->AddFilter(m_pSampleGrabber,L"Sample Grabber"); AM_MEDIA_TYPE m_pMedia; ZeroMemory(&m_pMedia,sizeof(m_pMedia)); m_pMedia.majortype = MEDIATYPE_Video; m_pMedia.subtype = MEDIASUBTYPE_RGB24; m_pSampleGrabber->QueryInterface(IID_ISampleGrabber,(void**)&m_pSG); if(m_pSG != NULL) { m_pSG->;SetMediaType(&m_pMedia); m_pSG->SetBufferSamples(TRUE); } m_pGB->QueryInterface(IID_IMediaControl,(void**)&m_pMC); m_pGB->QueryInterface(IID_IVideoWindow,(void**)&m_pVW); m_pGB->QueryInterface(IID_IBasicVideo,(void**)&m_pBV); m_pGB->QueryInterface(IID_IMediaEventEx,(void**)&m_pME); m_pGB->QueryInterface(IID_IMediaSeeking,(void**)&m_pMS); m_pGB->RenderFile(wFileName,NULL); m_pMC->Run(); } void CTest::ScreenShot() { m_pSampleGrabber->QueryInterface(IID_ISampleGrabber,(void**)&m_pSG); if(m_pSG == NULL) { return; } long lBufferSize; m_pSG->GetCurrentBuffer(&lBufferSize, NULL); BYTE* pBuffer = new BYTE[lBufferSize]; if (!pBuffer) return; m_pSG->GetCurrentBuffer(&lBufferSize, (long *)pBuffer); if (m_pSG != NULL)SaveImage(...); delete pBuffer; }
Please, read the posting guidelines before posting (use the code tags to format your code properly, to make it more readable). For your question, did you check the return value of GetCurrentBuffer ? See the documentation[^]
Cédric Moonen Software developer
Charting control [v2.0] OpenGL game tutorial in C++