CCaptureVideo::CCaptureVideo()
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("CoInitialize Failed!\r\n");
return;
}
pSendGraph = NULL;
pCaputerFilter = NULL;
pCaputerBuilder = NULL;
pSendWindow = NULL;
pSendControl = NULL;
pSendEvent = NULL;
pGrabberSample= NULL; }CCaptureVideo::~CCaptureVideo()
{
}HRESULT CCaptureVideo::StartDisplay(HWND hwnd)
{
HRESULT hr=S_OK;
hr=BuilderGraph();
if(hr==S_FALSE)
{
AfxMessageBox("fail to get interfaces!");
return S_FALSE ;
}
//Create Display Windows
pSendWindow->put_Owner((OAHWND)hwnd); pSendWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
if (pSendWindow)
{
CRect rc;
// Make the preview video fill our window
::GetClientRect(hwnd,&rc);
pSendWindow->SetWindowPosition(0, 0, rc.right, rc.bottom);
} //pSendWindow->SetWindowPosition(0,0,250,250);
pSendWindow->put_Visible(OATRUE);
hr = pGrabberSample->SetOneShot(FALSE);
hr = pGrabberSample->SetBufferSamples(TRUE);
//Begin display
hr=pSendControl->Run();
//Sleep(500);
//SnapStill();
return S_OK;
} void CCaptureVideo::GrabOneFrame(BOOL OneFrame)
{
OneShot=OneFrame;
}HRESULT CCaptureVideo::BuilderGraph()
{
HRESULT hr=S_OK;
IMoniker *pMoniker =NULL;
//1.Builder Filter Graph
hr=CoCreateInstance((REFCLSID)CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,(REFIID)IID_IGraphBuilder,(void**)&pSendGraph); if(FAILED(hr))
{
AfxMessageBox("fail to create FilerGraph!");
return S_FALSE;
}
//2.Builder Caputer Filter
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void**)&pCaputerBuilder);
if(FAILED(hr))
{
AfxMessageBox("fail to create CaptureGraphBuilder!");
return S_FALSE;
}
//3.Builder SampleGrabber Filter
hr=CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pGrabberSample);
if(FAILED(hr))
{
AfxMessageBox("fail to create samplegrabber!");
return S_FALSE;
}
hr=pCaputerBuilder->SetFiltergraph(pSendGraph);
if(FAILED(hr))
return S_FALSE;
//Find Caputer Filter
hr=FindCaptureDevice(&pMoniker);
if(FAILED(hr))
{
SAFE_RELEASE(pCaputerBuilder);
SAFE_RELEASE(pSendGraph);
return S_FALSE;
} pMoniker->Release();
CComQIPtr <IBaseFilter, &IID_IBaseFilter> pGrabBase(pGrabberSample);
hr=pSendGraph->AddFilter(pCaputerFilter,L"Caputer Filter");
hr=pSendGraph->AddFilter(pGrabBase,L"Sample Grabber");
hr=pSendGraph->QueryInterface(IID_IMediaControl,(void**)&pSendControl);
if(FAILED(hr))
return S_FALSE;
hr=pSendGraph->QueryInterface(IID_IVideoWindow,(void**)&pSendWindow);
if(FAILED(hr))
return S_FALSE;
hr=pSendGraph->QueryInterface(IID_IMediaEvent,(void**)&pSendEvent);
if(FAILED(hr))
return S_FALSE;
hr=pGrabberSample->QueryInterface(IID_ISampleGrabber,(void**)&pGrabberSample);
if(FAILED(hr))
return S_FALSE;
Width=640;
Height=480;
Rate=25;
// 修改分辨率
SetFormat(pCaputerBuilder, pCaputerFilter,Width, Height, 24, Rate);
//Display local video
hr=pCaputerBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,NULL,pCaputerFilter,pGrabBase,NULL);
if(FAILED(hr))
return S_FALSE;
return S_OK;
} 这是实现图像采集的部分程序,程序运行没问题,但是工作时就出问题了,第一次点击采集按钮能正常工作,但是第二次点击就会弹出:fail to create FilerGraph!
看了很久都不知道问题出在哪。。请高手们帮帮忙啊。。毕业设计。。等着交。。
{
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox("CoInitialize Failed!\r\n");
return;
}
pSendGraph = NULL;
pCaputerFilter = NULL;
pCaputerBuilder = NULL;
pSendWindow = NULL;
pSendControl = NULL;
pSendEvent = NULL;
pGrabberSample= NULL; }CCaptureVideo::~CCaptureVideo()
{
}HRESULT CCaptureVideo::StartDisplay(HWND hwnd)
{
HRESULT hr=S_OK;
hr=BuilderGraph();
if(hr==S_FALSE)
{
AfxMessageBox("fail to get interfaces!");
return S_FALSE ;
}
//Create Display Windows
pSendWindow->put_Owner((OAHWND)hwnd); pSendWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);
if (pSendWindow)
{
CRect rc;
// Make the preview video fill our window
::GetClientRect(hwnd,&rc);
pSendWindow->SetWindowPosition(0, 0, rc.right, rc.bottom);
} //pSendWindow->SetWindowPosition(0,0,250,250);
pSendWindow->put_Visible(OATRUE);
hr = pGrabberSample->SetOneShot(FALSE);
hr = pGrabberSample->SetBufferSamples(TRUE);
//Begin display
hr=pSendControl->Run();
//Sleep(500);
//SnapStill();
return S_OK;
} void CCaptureVideo::GrabOneFrame(BOOL OneFrame)
{
OneShot=OneFrame;
}HRESULT CCaptureVideo::BuilderGraph()
{
HRESULT hr=S_OK;
IMoniker *pMoniker =NULL;
//1.Builder Filter Graph
hr=CoCreateInstance((REFCLSID)CLSID_FilterGraph,NULL,CLSCTX_INPROC_SERVER,(REFIID)IID_IGraphBuilder,(void**)&pSendGraph); if(FAILED(hr))
{
AfxMessageBox("fail to create FilerGraph!");
return S_FALSE;
}
//2.Builder Caputer Filter
hr=CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(void**)&pCaputerBuilder);
if(FAILED(hr))
{
AfxMessageBox("fail to create CaptureGraphBuilder!");
return S_FALSE;
}
//3.Builder SampleGrabber Filter
hr=CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(void**)&pGrabberSample);
if(FAILED(hr))
{
AfxMessageBox("fail to create samplegrabber!");
return S_FALSE;
}
hr=pCaputerBuilder->SetFiltergraph(pSendGraph);
if(FAILED(hr))
return S_FALSE;
//Find Caputer Filter
hr=FindCaptureDevice(&pMoniker);
if(FAILED(hr))
{
SAFE_RELEASE(pCaputerBuilder);
SAFE_RELEASE(pSendGraph);
return S_FALSE;
} pMoniker->Release();
CComQIPtr <IBaseFilter, &IID_IBaseFilter> pGrabBase(pGrabberSample);
hr=pSendGraph->AddFilter(pCaputerFilter,L"Caputer Filter");
hr=pSendGraph->AddFilter(pGrabBase,L"Sample Grabber");
hr=pSendGraph->QueryInterface(IID_IMediaControl,(void**)&pSendControl);
if(FAILED(hr))
return S_FALSE;
hr=pSendGraph->QueryInterface(IID_IVideoWindow,(void**)&pSendWindow);
if(FAILED(hr))
return S_FALSE;
hr=pSendGraph->QueryInterface(IID_IMediaEvent,(void**)&pSendEvent);
if(FAILED(hr))
return S_FALSE;
hr=pGrabberSample->QueryInterface(IID_ISampleGrabber,(void**)&pGrabberSample);
if(FAILED(hr))
return S_FALSE;
Width=640;
Height=480;
Rate=25;
// 修改分辨率
SetFormat(pCaputerBuilder, pCaputerFilter,Width, Height, 24, Rate);
//Display local video
hr=pCaputerBuilder->RenderStream(&PIN_CATEGORY_PREVIEW,NULL,pCaputerFilter,pGrabBase,NULL);
if(FAILED(hr))
return S_FALSE;
return S_OK;
} 这是实现图像采集的部分程序,程序运行没问题,但是工作时就出问题了,第一次点击采集按钮能正常工作,但是第二次点击就会弹出:fail to create FilerGraph!
看了很久都不知道问题出在哪。。请高手们帮帮忙啊。。毕业设计。。等着交。。
解决方案 »
- 求助:如何调用WINDOWS操作系统中的G723 ACM API函数,在线等。谢谢!!!
- 怎么知道vc单文档打开界面的宽度?
- 请问“金山毒霸”的安装文件夹上显示的图标是怎么怎样做上去的
- 如何实现windows2000里的这种简单的效果
- 急!急! 怎样在父窗口中得到子窗口的客户区的大小?
- 在c中有biosprint,vc中有没有相关的函数
- 在98下使用SCrollView时发现以下问题
- 请问如何在一个view中引用另外一个view。
- arx cad com "命令不允许在模型选项卡中使用"
- 使用DAO访问ACCESS数据库 listcontrol控件问题
- 关于转换参数类型的问题
- SNMP 代理端发送数据的问题
CloseVideo()函数如下:
void CCaptureVideo::CloseVideo()
{
if (pSendControl)
pSendControl->Stop();
if (pSendWindow)
{
pSendWindow->put_Visible(OAFALSE);
pSendWindow->put_Owner(NULL);
}
SAFE_RELEASE(pCaputerBuilder);
SAFE_RELEASE(pSendControl);
SAFE_RELEASE(pSendGraph);
SAFE_RELEASE(pCaputerFilter);
SAFE_RELEASE(pSendWindow);
SAFE_RELEASE(pSendEvent);
SAFE_RELEASE(pGrabberSample);
CoUninitialize();
}
to:Mackz我能把程序发给你帮我看看吗??