您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VC > 正文
使用DirectShow驱动摄像头
[文章信息]
作者:lu_zi  
时间:2003-03-21
出处:天极论坛
责任编辑:  
[文章导读]
对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好
advertisement
热点推荐
· 11.15软件精选 制作MSI文件
· 闪客五周年之闪客光荣榜
· 用Winamp“品尝”无限音乐
· 网络加、解密的技术应用
· 闪客五周年之闪客光荣榜:zoron
[正文]
  对于小摄像头的驱动有几种方法,通过使用DirectShow来驱动摄像头灵活性比较好,有简单的方法也有比较复杂但更有效的方法,本文只介绍简单方法,希望与大家交流!

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

  DirectShow通过几个COM接口来对视频捕获的全过程进行控制,其中IGraphBuilder 用于建立过滤器,ICaptureGraphBuilder2用于与下层的驱动程序建立联系,IVideoWindow,IMediaControl,IMediaEventEx分别对整个过程的视频窗口,播放过程和事件响应进行控制,

  下面是例程:

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;

 }

 


·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 11.15软件精选 制作MSI文件
  • 闪客五周年之闪客光荣榜
  • 兰欣推出我国第一款网络游戏专用音箱
  • 玩家发现117亡灵种族Bug
  • [配置推荐]极品HIFI配置
  • 东瀛美少女COSPLAY(55)
  • 用Winamp“品尝”无限音乐
  • 迷你型PStwo全面透析专题
  • Advertisement

    天极无线
    待机彩图    >>更多
    多彩动画    >>更多
    美妙和弦    >>更多
    天使在唱歌
    壁虎漫步
    PrettyBoy
    LoveLoveLove
    我是你的小小狗
    单身情歌
    十面埋伏
    祝酒歌
    回心转意
    波斯猫
    太委屈
    S.H.E
    潘玮柏
    M2M
    蔡依林
    阿牛
    林志炫
    陈弈迅
    刀郎
    黑龙
    S.H.E
    陶晶莹
    情人玫瑰坊
    音乐风云
    新片速递
    神秘测试
    都市约会
    ·天极彩信天天精彩
    ·图铃梦工厂下载无限!
    ·找寻童真,卡通专题
    ·夏日激情交友社区!
    ·星座运程,预测人生

    CSEEK搜索