المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : after calling GetCurrentBuffer(&lBufferSize,NULL), lBufferSize is minus value.



C++ Programming
08-07-2009, 07:56 AM
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;
}