基于VFW的USB摄像头视频捕获的研究(资料收集)(一)

    1、视频捕获

    Windows的AVICap类可以轻松地完成视频捕获,AVICap提供给应用程序一个简单的,基于消息的接口去访问视频设备和录音设备,并且可以控制处理视频流捕获。

   1.1 关于视频捕获

    AVICap支持实时视频流捕获和单帧图像捕获,另外,AVICap提供了对视频源的控制(MCI媒体控制接口设备),因此使用者可以通过应用程序控制一个视频源开始和结束的位置,并且可以加大对帧捕获的控制。使用AVICap类可以完成如下任务:

    1)捕获声音和视频,并将他们写入到一个AVI文件中。

    2)指定一个文件用于捕获,并且把这个捕获文件的内容拷贝给另一个文件。

    3)设定捕获图像速度。

    4)显示对话框用于控制视频源和格式。

    5)创建、保存、加载调色板。

    6)拷贝图像和调色板到剪切板中。

    7)捕获并把图像作为一个DIB位图保存。、

视频捕获将数字化一个视频流和音频数据,并且将他们保存在硬盘和其他存储设备上。

下面例子介绍一个简单的视频捕获案例:

AVICap捕获窗口可以把捕获的音频视频信息写入到一个AVI文件中,你的应用程序可以自由地处理这个AVI文件,管理缓存区的音视频数据,还可以在底层访问音视频设备的驱动器,AVICap为应用程序提供一个灵活的接口:

HWndC = capCreateCaptureWindow("My Own Capture Window",WS_CHILD|WS_VISIBLE,0,0,160,120,hwndParent,nID);

SendMessage(hWndC,WM_CAP_DRIVER_CONNECT,0,0L);

SendMessage(hWndC,WM_CAP_SEQUENCE,0,0L);

 

宏接口同样有用,你可以选择是使用宏接口还是SendMessage函数来实现上述功能,不过宏接口可以让你的代码更加容易理解,下面就是使用了宏接口。

HWndC = capCreateCaptureWindow("My Window Name",WS_CHILD|WS_VISIBLE,0,0,160,120,hWndParent,nID);

capDriverConnect(hWndC,0);

capCaptureSequence(hWndC);

你的应用程序创建AVICap捕获窗口,并和视频设备建立连接后,你创建的这个捕获窗口就准备捕获数据了,这个,你可以通过发送WM_CAP_SEQUENCE消息(CapCaptureSequence宏)开始对数据进行捕获。

WM_CAP_SEQUENCE将使用默认设置,开始对视频和音频进行捕获,并把数据放在一个CAPTURE.AVI的文件中,捕获动作将一直持续,除非有下面的事件发生:

1)用户按里ESC键或者鼠标的按钮;

2)你的应用程序停止或者退出了捕获操作;

3)磁盘写满了。

在应用程序中,你可以通过发送WM_CAP_STOP命令(capCaptureStop)给捕获窗口,让它停止向文件写数据,你可以通过发送WM_CAP_ABORT命令(capCaptureAbort)给捕获窗口,让它中段捕获操作。

1.1.2捕获的基本设置

通过对定义在CAPTUREPARMS结构中的捕获参数进行修改,可以:

1)改变捕获的帧频率(帧/秒);

2)指定用键盘或鼠标去结束一个捕获会话;

3)为一个捕获会话指定时间周期。

 

捕获的帧频率表示在一个捕获会话中,每秒要捕获多少帧,可以通过WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)可以得到当前捕获的帧频率,当前的帧频率被保存在CAPTUREPARMS结构的dwRequestMicroSecPerFrame成员中,你尅对其进行修改,从而改变帧频率。该值为捕获一帧需要的时间(单位为1/1000000秒)修改后,可以发送WM_CAP_SEQUENCE_SETIP消息(capCaptureSetup宏)给你的捕获窗体,来刷新CAPTUREPARMS结构。dwRequestMicroSecPerFrame默认值是66667微秒,表示每秒15帧。

退出数据捕获的方法有:按键盘上的一个键或几个组合键,或这按鼠标的左键或者右键,如果用户退出一个实体的捕获会话,那么捕获文件中的内容将被系统丢弃掉。如果用户退出一个步帧(step-Frame)捕获的会话,捕获文件将保存到退出时刻前的所有数据。

你可以通过发WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup)给捕获窗口,来获得捕获退出的设置信息,当前的拖出按钮设置保存在CAPTUREPARMS结构的vKeyAbort成员中,当前的退出鼠标设置保存在fAbortLeftMouse和fAbortRightMouse成员中,你可以改变这个成员,实现对当前值的修改,当你修改完成后,你可以发送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)给你的捕获窗体,来刷新CAPTUREPARMS结构。

vKeyAbort默认值是VK_ESCAPE。在重新指定其他按键前,你必须调用RegisterHotKey函数。fAbortLeftMouse和fAbortRightMouse是TRUE。

时间限定:

通过使用CAPTUREPARMS结构的fLimitEnabled和wTimeLimit成员,你可以去限定一个捕获操作的时间周期,fLimitEnabled表示是否要对捕获操作限定时间,wTimeLimit用于限定时间的最大值。

你发WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup)给捕获窗口,就可以得到fLimitEnabled和wTimeLimit的值。fLimitEnabled为TRUE表示要指定时间周期。wTimeLimit单位为秒,修改完成后,你可以发送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)给你的捕获窗体,来刷新CAPTUREPARMS结构。fLimitEnabled默认值为FALSE

1.1.3捕获窗口

捕获窗口一般使用WS_CHILD和WS_VISIBLE窗口类型,类似于一个标准控件。

创建一个捕获窗口:

使用capCreateCaptureWindow函数可以创建一个AVICap的捕获窗口,这个函数返回一个窗口句柄,这个句柄就是捕获窗口的句柄,后面其他操作就是通过发送消息给该句柄来实现,可在一个程序中创建多个捕获窗口,并且每个窗口连接到不同的捕获设备上。

建立捕获窗口到捕获设备的连接:

你可以动态滴连接或断开捕获窗口与设备间的连接,可以使用WM_CAP_DRIVER_CONNECT消息(capDriverConnect),可以实现捕获窗体与设备驱动间的连接,当捕获窗体与捕获设备驱动连接后,你就可以发送针对设备的消息给该窗体了。

如果你的系统安装了多个捕获设备,你可以通过在发送WM_CAP_DRIVER_CONNECT消息时,设置wPrarm参数(integer)。来指定捕获窗口与哪个具体的视频捕获设备相连接。wPrarm参数是一个证书,表示一个系统已经安装的视频捕获设备列表的索引(注册表中或System.ini[drivers]中的信息),该列表的索引从0开始。

通过capGetDriverDescription函数可以获得安装的捕获驱动程序的名称和版本,你的应用程序可以使用这个函数列举除安装的所有捕获设备,让用户可以选择其中一个去与捕获窗口相连。

通过发送WM_CAP_DRIVER_DISCONNECT消息(capDriverGetDisconnect宏),你可以断开连接,当捕获窗口销毁后,任何连接的视频捕获设备都将自动断开。

父子窗体交互:

一些系统级的消息,比如WM_PALETTECHANGED、WM_QUERYNEWPALETTE,只被发送到顶层和overlapped窗口,如果一个捕获窗体是一个子窗体,那他的父窗口应该来转寄这些消息。

捕获窗体状态:

通过发送WM_CAP_GET_STATUS消息(capGetStatus),可以获得当前捕获窗口的状态,这个消息得到一个CAPSTATUS结构体的拷贝,状态信息就在这个结构体的成员中。CAPSTATUS结构体包含了图形尺寸大小,滚动位置,是否覆盖或者预览等信息,因为在CAPSTATUS中的信息是动态的,你的应用程序应该随时去刷新这个结构体中的内容。

1.1.4捕获和音频驱动器

视频捕获可以做这几个方面的工作:访问视频源,显示选项,格式和压缩选项,音频捕获包括指定音频格式个选择压缩方式。

捕获驱动性能:

通过发送WM_CAO_DRIVER_GET_CAPS消息(capDriverGetCaps)可以得到当前连接的捕获设备的性能,发送该消息后,会返回一个CAPDRIVERCAPS结构的对象,设备的性能信息就在这个对象中。

视频对话框:

每个捕获设备的驱动程序都可以为控制视频信号和捕获处理和视频压缩提供4个对话框,这些对话框中的内容都是视频捕获驱动程序定义的。

视频源对话框用于选择视频输入通道和视频图像的动态参数,它可以列举出当前连接视频设备的信号类型(SVHS和复合类型),并且可以通过该对话框去修改图像的色调、亮度、饱和度。你可以通过使用WM_CAP_DLG_VIDEOSOURCE消息(capDlgVideoSource)来显示和刷新这个窗口。

视频格式对话框用于选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式,你可以通过使用WM_CAP_DLG_VIDEOFORMAT消息或(capDlgVideoFormat)来显示和刷新这个窗口。

视频显示对话框用于控制视频外观,在该对话框上进行了修改只是对视频显示起作用,对于实际的视频数据是不会造成改变的,比如,可以改变显示的颜色,饱和度,你可以使用WM_CAP_DLG_VIDEODISPALY消息(capDlgVideoDispaly)来显示和刷新这个窗口。

视频压缩对话框(Video Compression Dialog box)用于设置视频压缩的格式,通过使用WM_CAP_DLG_VIDEOCOMPRESSION消息(capDlgVideoCompression)来显示和刷新这个窗口。

预览和覆盖模式(Preview and Overlay):

一般,一个捕获驱动提供两种方式来观看输入的视频流:预览模式和覆盖模式,如果捕获驱动可以提供上面两种模式,那么用户就可以选择其中的模式来使用。

预览模式从捕获设备硬件传输数据帧到系统的内存中,并且在捕获窗口中使用GDI函数来显示这些数据帧,当捕获窗口的父窗体失去焦点的时候,在应用程序的视频预览的数据将变慢,如果父窗体获得焦点后,将对预览显示进行加速,因为预览处理的这个处理方式将大大提高整个系统的效率。

1)WM_CAP_SET_PREVIEW消息(capPreview)可以打开或关闭预览模式;

2)WM_CAP_SET_PREVIEWRATE(capPreviewRate)可以设置预览模式下图像的帧速;

3)WM_CAP_SET_SCALE消息(capPreviewScale)打开或者关闭预览视频的缩放比例。

当预览和缩放比例属性都打开后,那么视频将被缩放到和捕获窗口尺寸一样大,打开预览模式后,系统将自动关闭覆盖模式。

覆盖模式:不占用CPU的处理资源,直接在显示器上显示视频内容,所用的处理是有捕获设备硬件来完成,发送WM_CAP_SET_OVERLAY消息(capOverlay)给捕获窗口,可以打开覆盖模式。无论是预览模式还是覆盖模式,都可以通过发送WM_CAP_SETSCROLL消息(capSetScrollPos)可以设置图像的在整个视频帧的滚动位置。

视频格式:

     通过发送WM_CAP_GET_VIDEOFORMAT消息(capGetVideoFormat)给视频捕获窗口可以得到一个结构,在这个结构中就包含了视频的格式、大小。通过发送WM_CAP_SET_VIDEOFORMAT消息(capSetVideoForma)t给视频捕获窗口可以对视频格式进行修改设置。

视频捕获设置:

CAPUREPARMS数据结构包含了视频流的控制参数,它允许完成如下任务:

1)指定帧速;

2)指定为视频分配的缓存大小;

3)关闭或打开视频捕获;

4)设定捕获的时间间隔;

5)指定捕获设备;

6)指定键盘或鼠标去控制结束捕获;

7)指定适用的视频类型。

1.1.5捕获文件和缓存区

捕获文件名,AVICap默认,把视频数据从捕获窗口保存到当前驱动的根目录下,文件名为CAPTURE.AVI,发送WM_CAP_FILE_SET_CAPTURE_FILE消息(capFileSetCaptureFile)给捕获窗体,可以改变保存的文件名,这个消息指定文件名:它不创建文件,分配空间,也不能打开文件,通过发送WM_CAP_FILE_GET_CAPTURE_FILE消息(capFileGetCaptureFile)给捕获窗口,得到当前文件名。

保存捕获数据到一个新文件:

如果用户想保存捕获数据,把数据存到另一个文件中,可以使用WM_CAP_FILE_SAVES消息(capFileSaveAs),这个消息不能改变捕获文件的名称和内容,你必须去指定新建的文件名,因为捕获文件将保留原来的文件名称。

为捕获文件预分配磁盘空间:

在捕获操作前,先在磁盘上为捕获文件建一个指定大小的文件,预分配空间将减少数据保存的处理时间,可以通过WM_CAP_FILE_ALLOCCATE消息(capFILEAlloc)来预分配一个捕获文件。

3.1.6捕获变化

除了对基于持续时间间隔的流捕获外,AVICap还支持如下的捕获:

1)手控制帧捕获

2)Still—image捕获

3)不使用磁盘存储的捕获

4)从一个MCI设备的流捕获。

如果你想指定捕获视频流中的个别帧,你可以通过WM_CAP_SINGLE_FRAME_OPEN消息、WM_CAP_SINGLE_FRAME消息、WM_CAP_SINGLE_FRAME_CLOSE消息来控制帧序列。

典型应用是,这些消息用于向捕获文件添加单独的帧来创建一个动画,WM_CAP_SINGLE_OPEN为手动捕获操作打开一个文件,WM_CAP_SINGLE_FRAME 用于捕获一个单独的帧放在文件中。WM_CAP_SINGLE_FRAME_CLOSE用于关闭这个捕获文件。

Still_Image捕获:

如果要捕获一个单独的帧作为一个静态图像,你可以使用WM_CAP_GRAB_FRAME_NOSTOP或WM_CAP_FRAB_FRAME(capGrabFrameNoStop或capGrabFrame)在一个帧缓存区中捕获一个图像,你可以通过使用下面的消息来抓获当前显示的图像WM_CAP_GRAB_FRAME,否则,使用WM_CAP_GRAB_FRAME_NOSTOP。

一旦开始捕获,你可以拷贝图像给其他应用程序,你可以从帧缓存区拷贝一个图像到剪切板(使用WM_CAP_EDIT_COPY capEditCopy)你还可以使用如下消息,将缓存区的一张图像拷贝到一个DIB位图中(WM_CAP_FILE_SAVEDIB capFileSaveDIB)

不使用磁盘存储的捕获:

使用WM_CAP_SEQUENCE_NOFILE(capCaptureSequenceNoFile)可以不向磁盘文件写入数据,该消息仅在配合回调函数时有用,它允许你的应用程序直接使用音视频数据。

 

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章