摄像头

来源:互联网 发布:微信猪淘客软件从哪买 编辑:程序博客网 时间:2024/04/27 20:18

对于小摄像头的驱动有几种方法,通过使用directshow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!

用directshow来使用摄像头,一般要求摄像头的驱动是wdm格式的,当然,一些比较老的驱动格式directshow也可支持。directshow通过图形过滤管理器(filter graph manager)来与上层应用程序和下层的驱动进行联系。directshow通过一种叫作捕获过滤器(capture filter)的东东来支持对摄像头的捕获,一个捕获过滤器有多个插口(pin),其中的预览(preview)插口可用来进行显示祯图象。

directshow通过几个com接口来对视频捕获的全过程进行控制,其中igraphbuilder 用于建立过滤器,icapturegraphbuilder2用于与下层的驱动程序建立联系,ivideowindow,imediacontrol,imediaeventex分别对整个过程的视频窗口,播放过程和事件响应进行控制,

下面是例程:

ccomqiptr<ivideowindow>   m_pvw;

ccomqiptr<imediacontrol>  m_pmc;

ccomqiptr<imediaeventex>  m_pme;

ccomptr<igraphbuilder>  m_pgraph;

ccomptr<icapturegraphbuilder2>  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 <icreatedevenum> pcde=null;

    ccomptr <ienummoniker> 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 <imoniker> pm=null;

ulong cfetched;

ccomptr<ibasefilter> 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<irunningobjecttable> 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;


原创粉丝点击