读书人

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

发布时间: 2012-08-14 10:39:57 作者: rapoo

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连接上,就能实现你的抓图了

读书人网 >多媒体

热点推荐