DirectShow视频捕捉奇怪的一个问题
我用ICaptureGraphBuilder2来编写视频捕捉的程序,我用的是一个数码摄像头,就是视频聊天用的那种,代码如下,程序运行几次能正常显示摄像画面,但在不确定的次数后视频图像却不能在窗口上显示了,我是在一个对话框上面Render的,而这个时候我去打开“我的电脑->Dual-Mode DSC(2770) #2”时候,白色的客户区中间是一个灰色320x240的实矩形,而正常情况下它应该是动态的实时视频图像。重启机器后有时能恢复正常,有时不能,这是怎么回事呢?
ICaptureGraphBuilder2 * pCGB2 = NULL;
IGraphBuilder * pGB = NULL;
HRESULT hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL,
CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pCGB2);
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(CLSID_FilterGraph, NULL,
CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGB);
if (SUCCEEDED(hr))
{
pCGB2->SetFiltergraph(pGB);
}
else
{
pCGB2->Release();
return E_FAIL;
}
}
ICreateDevEnum * pCreateEnum = NULL;
IEnumMoniker * pEnum = NULL;
hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
IID_ICreateDevEnum, (void**)(&pCreateEnum));
if (SUCCEEDED(hr))
{
hr = pCreateEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
&pEnum, 0);
}
IMoniker * pMoniker = NULL;
if (pEnum->Next(1, &pMoniker, NULL) != S_OK)
{
pEnum->Release();
pCreateEnum->Release();
pGB->Release();
pCGB2->Release();
return hr;
}
IBaseFilter * pCap;
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)(&pCap));
pMoniker->Release();
pEnum->Release();
pCreateEnum->Release();
pGB->AddFilter(pCap, L"Capture Filter");
pCGB2->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
pCap, NULL, NULL);
pCGB2->Release();
pCap->Release();
IVideoWindow * pVidWnd = NULL;
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVidWnd);
pVidWnd->put_Owner((OAHWND)m_hWnd);
pVidWnd->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
pVidWnd->put_Left(0);
pVidWnd->put_Top(0);
pVidWnd->put_Width(320);
pVidWnd->put_Height(240);
pVidWnd->put_Visible(OATRUE);
pVidWnd->Release();
IMediaControl * pMediaCtrl = NULL;
pGB->QueryInterface(IID_IMediaControl, (void **)&pMediaCtrl);
pMediaCtrl->Run();
pMediaCtrl->Release();
pGB->Release();
return hr;
问题点数:100、回复次数:4Top
1 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-03-12 17:55:39 得分 60
是不是刷新的问题?这个可能性应该不大!http://blog.csdn.net/rageliu/archive/2006/03/09/619991.aspx
确定接口都正确释放??采集filter等都是临界filter,不释放就不能再使用了.
还是要跟中调试
Top
2 楼cyblueboy83(爱情白痴—电脑迷)回复于 2006-03-12 17:58:47 得分 5
关注
Top
3 楼rageliu(天气好了就去长白山看水怪去了,嘿嘿...)回复于 2006-03-13 09:27:21 得分 35
IVideoWindow * pVidWnd = NULL;
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVidWnd);
pVidWnd->put_Owner((OAHWND)m_hWnd);
pVidWnd->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
pVidWnd->put_Left(0);
pVidWnd->put_Top(0);
pVidWnd->put_Width(320);
pVidWnd->put_Height(240);
pVidWnd->put_Visible(OATRUE);
pVidWnd->Release();
上面的操作会影响刷新的,我在1楼给了个Blog,你看看,建议调试的时候去掉上面那段对视频窗口的操作看看是否还有那个问题Top
4 楼fzfzfz()回复于 2006-03-13 13:13:10 得分 0
pGB->Release()应该没有的,Release()了就没有Graph了Top




