一 视频采集及回放
我采用VFW实现视频采集。VFW以消息驱动方式对视频设备进行存取,可以很方便地控制设备数据流的工作过程。目前,大多数的视频采集卡驱动程序都支持VFW接口,它主要包括多个动态连接库,通过这些组件间的协调合作,来完成视频的捕获、视频压缩及播放功能。视频数据的实时采集,主要通过AVICAP模块中的消息、宏函数、结构以及回调函数来完成。下面我主要叙述通过宏函数来完成的采集过程,每一个宏函数实现的功能都可以用相应的消息机制来实现,具体msdn里讲得很清楚了。
(一)创建捕获窗口:
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)m_capwnd=
capCreateCaptureWindow("Capture",WS_POPUP,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0);
在视频捕获之前需要创建一个捕获窗,所有的捕获操作及其设置都以它为基础。 这里有8个参数。参数1是捕获窗口的名字,随便给一个什么都行,后面也没有引用到,不知道有什么用(问题1)?。参数2设置捕获窗口类型。参数3,4,5,6分别设置捕获窗左上角坐标和窗体宽度和高度。捕获窗口相当于MFC的一个捕获控件,这里设置的尺寸信息实际上就是这个控件的尺寸,跟采集的视频流数据参数没有关系。参数7是父窗口的句柄,应该指定某个窗口的句柄,为0是什么意思呢(问题2)?我猜想应该0是指当前的父窗口(创建捕获窗的窗口),但是没有在MSDN中找到相关的依据。参数8是捕获窗口标识,随便指定一个标识号即可。
(二)关联捕获窗口
capSetUserData(m_capwnd,this);
此函数的功能是将刚刚创建视频捕获窗口同创建它的视频捕获类通过类指针关联起来,如果编写WINDOWS API程序,就不需要此关联。这样做的好处是以后可以在任何地方(比如在回调函数中)通过capGetUserData函数恢复这个创建了捕获窗口的视频类指针,就可以引用这个类的成员变量和成员函数了。
(三)指定回调函数
capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo);
当实时捕获的视频流数据填满视频缓冲区时,AVICAP会自动调用这里指定的回调函数OnCaptureVideo。回调函数OnCaptureVideo定义时有两个接收参数,第一个参数是视频捕获窗句柄,第二个参数是一个VIDEOHDR结构,包含了捕获的视频帧信息,如总共的字节数,视频YUV数据的起始地址等,根据这些信息可以实时保存捕获的视频流。回调函数的原型为
LRESULT CALLBACK OnCaptureVideo(HWND mwnd,LPVIDEOHDR lphdr)
(四)获取捕获驱动程序的版本信息
这一步不是必要的。
capGetDriverDescription(index,devname,100,devversion,100);
第一个参数是捕获驱动设备的索引号,从0~9,一般连接好摄像头后,默认该摄像头设备索引号为0。MSDN里讲可以从注册表或SYSTEM.INI文件中去查当前安装的视频捕获设备的索引号,可是我都没有找到,有谁知道吗(问题3)?还有问题是,当我安装了两个摄像头以后,利用VFW的宏函数只能检测到一个摄像头(即索引号为0)的信息,另一个设备便找不到了,是不是VFW只支持一个视频捕获设备呢,但从MSDN里的描述来看,应该可以支持多个视频设备的,这到底是怎么回事呢(问题4)?后面几个参数很简单,就不赘述了。
(五)连接捕获设备
capDriverConnect(m_capwnd,index);
此函数将创建的视频捕获窗口和视频捕获设备连接起来。第一个参数是捕获窗口句柄,第二个参数就是捕获设备索引号。
(六)设置视频捕获参数
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)这一步非常重要。