對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!
用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。directshow通過圖形過濾管理器(filter graph manager)來與上層應用程式和下層的驅動進行聯絡。directshow通過一種叫作捕獲過濾器(capture filter)的東東來支援對攝像頭的捕獲,乙個捕獲過濾器有多個插口(pin),其中的預覽(preview)插口可用來進行顯示禎圖象。
下面是例程:
ccomqiptr
m_pvw;
ccomqiptr
m_pmc;
ccomqiptr
m_pme;
ccomptr
m_pgraph;
ccomptr
m_pcapture;
dword m_dwgraphregister;
bool binit(hwnd hwnd)
hresult hr;
//獲得介面
hr=cocreateinstance (clsid_filtergraph, null, clsctx_inproc,iid_igraphbuilder, (void **) &m_pgraph);
if (failed(hr))
return false;
hr=cocreateinstance (clsid_capturegraphbuilder2 , null, clsctx_inproc,
iid_icapturegraphbuilder2, (void **) &m_pcapture);
if (failed(hr))
return false;
m_pmc=m_pgraph;
m_pvw=m_pgraph;
m_pme=m_pgraph;
//取得訊息
m_pme->setnotifywindow((oahwnd)(m_hwnd=hwnd), wm_graphnotify, 0);
//將過濾和捕獲進行連線
m_pcapture->setfiltergraph(m_pgraph);
//裝置聯接
//列舉裝置
ccomptr
pcde=null;
ccomptr
pem=null;
hr=cocreateinstance (clsid_systemdeviceenum, null, clsctx_inproc,
iid_icreatedevenum, (void **) &pcde);
if (failed(hr))
return false;
pcde->createclassenumerator(clsid_videoinputdevicecategory, &pem, 0);
if(pem==null)
return false;
ccomptr
pm=null;
ulong cfetched;
ccomptr
pbf=null;
if(pem->next(1,&pm,&cfetched)==s_ok)
pm->bindtoobject(0,0,iid_ibasefilter, (void**)&pbf);
pm.release();
else
return false;
//將裝置新增到graph
hr = m_pgraph->addfilter(pbf, l"video capture");
if (failed(hr))
return false;
//連線乙個源插口
hr=m_pcapture->renderstream(&pin_category_preview,&mediatype_video,pbf,null,null);
if (failed(hr))
return false;
pbf.release();
hr=m_pvw->put_owner((oahwnd)hwnd);
if (failed(hr))
return false;
//設定視窗樣式
m_pvw->put_windowstyle(ws_child | ws_clipchildren);
if (failed(hr))
return false;
//設定視窗大小
crect rectclient;
getclientrect(hwnd,rectclient);
m_pvw->setwindowposition(0, 0, 320, 240);
//設定可視
hr=m_pvw->put_visible(oatrue);
if (failed(hr))
return false;
//將物件加入到執行物件列表中
ccomptr
prot;
getrunningobjecttable(0,&prot);
wchar c[128];
wsprintfw(c, l"filtergraph %08x pid %08x/0", (dword_ptr)m_pgraph.p, getcurrentprocessid());
hr = createitemmoniker(l"!",c,&pm);
if (failed(hr))
return false;
hr = prot->register(rotflags_registrationkeepsalive,m_pgraph,pm,&m_dwgraphregister);
pm.release();
return false;
使用DirectShow驅動攝像頭
對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...
使用DirectShow驅動攝像頭
對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...
使用DirectShow驅動攝像頭
對於小攝像頭的驅動有幾種方法,通過使用directshow來驅動攝像頭靈活性比較好,有簡單的方法也有比較複雜但更有效的方法,本文只介紹簡單方法,希望與大家交流!用directshow來使用攝像頭,一般要求攝像頭的驅動是wdm格式的,當然,一些比較老的驅動格式directshow也可支援。direct...