首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > 多媒体 >

DirectShow中怎么在回放文件中抓图

2012-08-14 
DirectShow中如何在回放文件中抓图各位大侠,DirectShow中如何在回放文件中抓图?我的代码如下:HRESULT hrI

DirectShow中如何在回放文件中抓图
各位大侠,DirectShow中如何在回放文件中抓图?我的代码如下:

  HRESULT hr;
  IBaseFilter *pSrcFilter=NULL;
  hr = GetInterfaces();
  if (FAILED(hr))
  {
  Msg(TEXT("Failed to get video interfaces! hr=0x%x"), hr);
  }

  hr = g_pCapture->SetFiltergraph(g_pGraph);
  if (FAILED(hr))
  {
  Msg(TEXT("Failed to set capture filter graph! hr=0x%x"), hr);
  }

  hr =g_pGraph->AddSourceFilter(L"d:\\123.avi",L"Video Capture",&pSrcFilter);
  hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC,
  IID_ISampleGrabber, (void **) &g_pGrabber);
  if( !g_pGrabber )
  {
  Msg( TEXT("Could not create SampleGrabber (is qedit.dll registered?)"));
  }
  CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( g_pGrabber );

  // add the grabber to the graph
  hr = g_pGraph->AddFilter( pGrabBase, L"Grabber" );
  if( FAILED( hr ) )
  {
  Msg( TEXT("Could not put sample grabber in graph"));
  }

  CMediaType VideoType;
  VideoType.SetType( &MEDIATYPE_Video );
  VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 );
  hr = g_pGrabber->SetMediaType( &VideoType ); // shouldn't fail
  if( FAILED( hr ) )
  {
  Msg( TEXT("Could not set media type"));
  }
  CComPtr<IPin> pVPPin;
  hr = g_pCapture->FindPin( pSrcFilter, PINDIR_OUTPUT,&PIN_CATEGORY_VIDEOPORT, NULL, FALSE,0,&pVPPin);
  CComPtr<IBaseFilter> pRenderer;
  if (S_OK == hr)
  {
  hr = pRenderer.CoCreateInstance(CLSID_NullRenderer);  
  if (S_OK != hr)
  {
  Msg(TEXT("Unable to make a NULL renderer"));
  }
  hr = g_pGraph->AddFilter(pRenderer, L"NULL renderer");
  if (FAILED (hr))
  {
  Msg(TEXT("Can't add the filter to graph"));
  }
  }

  hr = g_pCapture->RenderStream( &PIN_CATEGORY_PREVIEW,&MEDIATYPE_Interleaved,pSrcFilter,pGrabBase,pRenderer);
  if (FAILED (hr))
  {
  // try to render preview pin
  hr = g_pCapture->RenderStream( &PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pSrcFilter,pGrabBase, pRenderer);
  // try to render capture pin
  if( FAILED( hr ) )
  {
  hr = g_pCapture->RenderStream( &PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pSrcFilter,pGrabBase, pRenderer);
  }
  }



就是在最后一行出错g_pCapture->RenderStream( &PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video, pSrcFilter,pGrabBase, pRenderer);

请问是什么原因呢?请大侠们指教一下,十分感谢你们的回复!

[解决办法]
你这样用RenderStream错了吧,可能是filter没有连上
看看返回值是多少
[解决办法]
你把你需要的filter连接上,再把sdk里的一个例子Grabber的filter连接上,就能实现你的抓图了

热点排行