VC 读取usb相机

使用vfw
# include <vfw.h>//加入视频采集所需头文件 需要用到Vfw32.lib库,在project->setting->link->object/library modules中添加
          char achDeviceVersion[80] ; // 设备版本信息
          char achDeviceAndVersion[160]; //设备名及版本信息
          int uIndex;
  DriverCount=0;//支持的设备驱动程序个数
       for(uIndex=0;uIndex<5;uIndex++)
   {
   if(capGetDriverDescription(uIndex,(LPSTR)achDeviceAndVersion,sizeof(achDeviceAndVersion),(LPSTR)achDeviceVersion,sizeof(achDeviceVersion)))
   {
   strcat(achDeviceAndVersion,",");
           strcat(achDeviceAndVersion,achDeviceVersion);
           DriverCount++;

   }
   else
   break;
   }

   if(DriverCount==0)
   MessageBox("找不到视频设备,请确认已正确连接","错误信息",MB_ICONSTOP|MB_OK);
       else
   {
         
   CMainFrame *pFrame=(CMainFrame *)AfxGetApp()->m_pMainWnd;
       CTest11View *pView=(CTest11View *)pFrame->GetActiveView();
   HWND hWnd;
   hWnd=pView->GetSafeHwnd();
 
RECT rc;
GetClientRect(&rc);
        hWndCap=capCreateCaptureWindow(NULL,
WS_CHILD|WS_VISIBLE,30,70,
(rc.right-rc.left)/4,(rc.bottom-rc.top)/4,
hWnd,//parent window
0          //chile window id
);//建立视频采集窗口
ASSERT(hWndCap);
if(capDriverConnect(hWndCap,--uIndex))//判断采集窗口是否与0号采集卡驱动相连接

{
//获取视频设备采集能力
capDriverGetCaps(hWnd,&CapDriverCaps,sizeof(CAPDRIVERCAPS));
        if(CapDriverCaps.fCaptureInitialized)//初始化成功

{  // 设置Preview模式的频帧
            capPreviewRate(hWndCap, 20); 
            //启动Preview模式
            capPreview(hWndCap, TRUE);
    //设置每帧结束后所调用的回调函数
//capSetCallbackOnFrame(hWndCap,FrameCallbackProc);
 
 //如果支持视频源选择,则弹出视频源选择对话框
if(CapDriverCaps.fHasDlgVideoSource)
 capDlgVideoSource(hWnd);
//如果支持视频格式选择,则弹出视频格式选择对话框
        if(CapDriverCaps.fHasDlgVideoFormat)
capDlgVideoFormat(hWnd);
//如果支持视频显示格式选择,则弹出视频显示格式选择对话框
        if(CapDriverCaps.fHasDlgVideoDisplay)
capDlgVideoDisplay(hWnd);
}
else//初始化不成功
   MessageBox("捕获卡初始化失败","错误信息",MB_ICONSTOP|MB_OK);
   }
else
           MessageBox("捕获卡连接失败","错误信息",MB_ICONSTOP|MB_OK);

   }


//

 在桌面视频会议、可视电话等多媒体应用中,获得数字视频是一个关键的前提
。在Video for Windows(VFW) 出现之前,捕获数字视频是一项极其复杂的工作
。Microsoft 的Visual C++自从4.0版就开始支持Video for Windows(简称VFW)
,这给视频捕获编程带来了很大的方便。关于多媒体应用开发,市面流行资料中介
绍较多的是MCI(媒体控制接口),而本文着重介绍的是如何使用Visual C++提供的
AVICap窗口类进行视频捕获以及其中涉及到的概念和关键问题。 

  一、Video for Windows简介 

  VFW是Microsoft 1992年推出的关于数字视频的一个软件包,它能使应用程序
数字化并播放从传统模拟视频源得到的视频剪辑。VFW的一个关键思想是播放时不
需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。它引进
了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规
定视频和音频该如何存储在硬盘上,在AVI文件中交替存储视频帧和与之相匹配的
音频数据。VFW给程序员提供.VBX和AVICap窗口类的高级编程工具,使程序员能通
过发送消息或设置属性来捕获、播放和编辑视频剪辑。现在用户不必专门安装VFW
了,Windows95本身包括了Video for Windows1.1,当用户在安装Windows时,安装
程序会自动地安装配置视频所需的组件,如设备驱动程序、视频压缩程序等。 

  VFW主要由以下六个模块组成: 

  (1)AVICAP.DLL:包含了执行视频捕获的函数,它给AVI文件I/O和视频、音
频设备驱动程序提供一个高级接口; 

  (2)MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作; 

  (3)MCIAVI.DRV:此驱动程序包括对VFW的MCI命令的解释器; 

  (4)AVIFILE.DLL:支持由标准多媒体I/O(mmio)函数提供的更高的命令来
访问.AVI文件; 

  (5)压缩管理器(ICM):管理用于视频压缩-解压缩的编解码器(CODEC)
; 

  (6)音频压缩管理器ACM:提供与ICM相似的服务,不同的是它适于波形音频
。 

  Visual C++在支持VFW方面提供有vfw32.lib、 msacm32.lib 、winmm.lib等类
似的库。特别是它提供了功能强大、简单易行、类似于MCIWnd的窗口类AVICap。
AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音
频硬件,并能在将视频流捕获到硬盘上的过程中进行控制。 

  二、AVICap编程简介 

  AVICap支持实时的视频流捕获和单帧捕获并提供对视频源的控制。虽然MCI也
提供数字视频服务,比如它为显示.AVI文件的视频提供了avivideo命令集,为视频
叠加提供了overlay命令集,但这些命令主要是基于文件的操作,它不能满足实时
地直接从视频缓存中取数据的要求,对于使用没有视频叠加能力的捕获卡的PC机来
说,用MCI提供的命令集是无法捕获视频流的。而AVICap在捕获视频方面具有一定
的优势,它能直接访问视频缓冲区,不需要生成中间文件,实时性很强,效率很高
。同时,它也可将数字视频捕获到文件。 

  在视频捕获之前需要创建一个捕获窗,所有的捕获操作及其设置都以它为基础
。用AVICap窗口类创建的窗口(通过capCreateCaptureWindow函数创建)被称为“
捕获窗”,其窗口风格一般为WS_CHILD和WS_VISIBLE。在概念上,捕获窗类似于标
准控制(如按钮、列表框等)。捕获窗具有下列功能: 

  (1)将一视频流和音频流捕获到一个AVI文件中; 

  (2)动态地同视频和音频输入器件连接或断开; 

  (3)以Overlay或Preview模式对输入的视频流进行实时显示; 

  (4)在捕获时可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件
; 

  (5)设置捕获速率; 

  (6)显示控制视频源、视频格式、视频压缩的对话框; 

  (7)创建、保存或载入调色板; 

  (8)将图像和相关的调色板拷贝到剪贴板; 

  (9)将捕获的一个单帧图像保存为DIB格式的文件。 

  这里需要解释一下AVICap在显示视频时提供的两种模式: 

  (A)预览(Preview)模式:该模式使用CPU资源,视频帧先从捕获硬件传到
系统内存,接着采用GDI函数在捕获窗中显示。在物理上,这种模式需要通过VGA卡
在监视器上显示。 

  (B)叠加(Overlay)模式:该模式使用硬件叠加进行视频显示,叠加视频的
显示不经过VGA卡,叠加视频的硬件将VGA的输出信号与其自身的输出信号合并,形
成组合信号显示在计算机的监视器上。只有部分视频捕获卡才具有视频叠加能力。
 

  除了利用捕获窗的九个功能外,灵活编写AVICap提供的回调函数还可满足一些
特殊需求,比如将宏capCaptureSequenceNoFile同用
capSetCallbackOnVideoStream登记的回调函数一起使用可使应用程序直接使用视
频和音频数据,在视频会议的应用程序中可利用这一点来获得视频帧,回调函数将
捕获的图像传到远端的计算机。应用程序可用捕获窗来登记回调函数(由用户编写
,而由系统调用),以便在发生下列情况时它能通知应用程序作出相应的反应: 


  (1)捕获窗状态改变; 

  (2)出错; 

  (3)视频帧和音频缓存可以使用 ; 

  (4)在捕获过程中,其它应用程序处于让步(Yield)地位。 

  与普通SDK编程一样,视频捕获编程也要用到涉及视频捕获的结构、宏、消息
和函数。让编程人员感到轻松的是,发送AVICap窗口消息所能完成的功能都能调用
相应的宏来完成。例如,SendMessage(hWndCap,WM_CAP_DRIVER_CONNECT,0,0L)
 与capDriverConnect(hWndCap,0)的作用相同,都是将创建的捕获窗同视频输入
器件连接起来。 

  在利用AVICap编程时,应该熟悉与视频捕获相关的结构,下面对常用的四个结
构作一简要介绍,对于前三个结构都有对应的函数来设置和获得结构包含的信息:
 

  (1)CAPSTATUS:定义了捕获窗口的当前状态,如图像的宽、高等; 

  (2)CAPDRIVERCAPS:定义了捕获驱动器的能力,如有无视频叠加能力、有无
控制视频源、视频格式的对话框等; 

  (3)CAPTUREPARMS:包含控制视频流捕获过程的参数,如捕获帧频、指定键
盘或鼠标键以终止捕获、捕获时间限制等; 

  (4)VIDEOHDR:定义了视频数据块的头信息,在编写回调函数时常用到其数
据成员lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)。 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值