使用DirectShow驅動攝像頭

2021-04-07 08:42:00 字數 2912 閱讀 9595

對於小攝像頭的驅動有幾種方法,通過使用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...