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!
看了很久都不知道问题出在哪。。请高手们帮帮忙啊。。毕业设计。。等着交。。

解决方案 »

  1.   

    有没有什么和StartDisplay对应的StopDisplay之类的,在StartDisplay之前调用以下,以释放资源。
      

  2.   

    有一个叫CloseVideo()的函数,试过调用了。。但是调用之后点击第一次就不行了。。同样弹出“fail to create FilerGraph!”
    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();
    }
      

  3.   

    你可以把CloseVideo()的代码注释起来,看看结果怎样?如何还是说明不是CloseVideo()的原因,楼主可以试试
      

  4.   


    to:Mackz我能把程序发给你帮我看看吗??
      

  5.   

    怎么没有办法呢 你把你程序所需要的功能告诉大家 让高手给你发过去 发到你email里面去 反正都是实现功能 ok了你就给高手分就是