论文部分内容阅读
摘要:随着通信技术与多媒体技术的飞速发展,以多媒体视频为主的应用得到了广阔的发展,在这些视频应用领域中,若想进行图像处理就要先进行视频捕获。鉴于此,文章对Windows系统下的VFW体系结构进行了论述、给出了视频开发的相关Windows API函数,分析了视频捕获的工作流程;并用VB来设计和实现视频捕捉程序,具体的给出了程序的代码,最后给出了测试结果,证明是可以捕捉的。
关键词: VFW;视频捕捉; Windows API;AVICap
中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-3854-02
Video Capture of Network-vidicon Based on VB6.0
WANG Hai-feng, ZHANG Yi
(Information and Educational Technique Center, Jiangsu Teachers University of Technology, Changzhou 213001,China)
Abstract:With the rapid development of communication and multimedia technique,the application of the multimedia video got a broad development,in the domain of video application,suppose to carry on image manipulation, must first implement the video capture. Consequently, the article has carried on the elaboration to VFW system structure under the Windows system, has produced Windows API function about video capture, has analyzed the working process of the video capture; video capture programme has been designed and implement with VB,programme code has been produced.Finally,the result of video capture is feasible.
Key words:VFW;video capture;Windows API function;AVICap
1 引言
1992年,Microsoft公司发布了Video for Windows(以下简称VFW),使得任何PC机都能在无特定硬件支持的条件下播放视频画面。它以纯软件的方式从模拟视频源采集数字视频信号并将其存储到文件中或直接对视频缓存进行处理。
VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩,它引进了AVI (Audio VideoInterleave)文件标准,规定了视频和音频数据以交织的方式进行存储。这种按交替方式组织视频和音频数据的方式可使得读取视频数据流时能更有效地从存储媒介得到连续的信息。
Windows本身包括了VFW,当用户在安装Windows时,安装程序会自动地安装配置视频所需的视频组件,如设备驱动程序、视频压缩程序等。
在VFW开发包中自带了一个视频捕捉的工具vidcap,它使用了VFW视频捕捉模块AVICap的大量API (Application Program Interface,应用程序接口)函数实现实时的视频捕捉。
2 VFW体系结构
VFW以消息驱动方式对视频设备进行存取,可以很方便地控制设备数据流的工作过程。它主要包括多个动态连接库,通过这些组件间的协调合作,来完成视频的捕捉、视频压缩及播放功能。VFW体系结构如图1所示。
VFW主要由六个模块组成:
(1)AVICAP.DLL:它主要实现视频捕捉功能。它包含了用于视频捕捉的函数,为AVI文件输入输出和视频、音频设备驱动程序提供一个高级接口。
(2)MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作,能够将视频捕捉窗口与捕捉驱动设备连接起来,支持ICM视频编码服务。
(3)MCIAVI.DRV:它包含了对VFW的MCI命令解释器,实现回放功能。
(4)AVIFILE.DLL:支持由标准多媒体I/0函数提供的更高的命令来访问AVI文件。
(5)ICM( Installable compression manager):即压缩管理器,提供对存储在AVI文件中视频图像数据的压缩、解压缩服务。
(6)ACM( Audio Compression Manager):即音频压缩管理器,提供与ICM相似的服务,不同之处是它适用于波形音频。
Microsoft的Visual Basic支持VFW,在此开发平台上,可通过多媒体控制接口实现与声音、视频等多媒体信息打交道,开发出多媒体应用程序。
图1 VFW体系结构图
3 基于VFW下VB视频捕捉
3.1VFW视频捕捉模块AVICap窗口类常用的数据结构
在利用AVICap编程时,常常要用到与视频捕捉相关的结构。下面对常用的4个结构作以简要介绍,对于前3个结构都有对应的函数来设置和获得结构包含的信息。
(1)CAPSTATUS:定义捕捉窗口的当前状态;
(2)CAPDRIVERCAPS:定义捕捉设备的能力,如:有无预览能力,有无控制视频源,视频格式的对话框等;
(3)CAPTUREPARMS:包含控制视频流捕捉过程的参数,如捕捉帧频,指定键盘或鼠标键以终止捕捉,捕捉时间限制等;
(4)VIDEOHDR:定义视频数据块的头信息。在编写回调函数时常用到其数据成员1pData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)。
3.2VFW视频捕捉的工作流程
利用VB进行视频捕捉的设计需要遵循如图2程序流程:
3.3 Windows API视频相关函数
在用VB6.0进行视频捕捉的时候需要用到Windows API 视频相关函数,第一个是建立视频窗口的函数
Declare Function capCreateCaptureWindow Lib "avicap32.dll" _Alias "capCreateCaptureWindowA" _(ByVal lpszWindowName As String, _ByVal dwStyle As Long, _ByVal x As Long, _ByVal y As Long, _ByVal nWidth As Long, _ByVal nHeight As Long, _ ByVal hwndParent As Long, _ ByVal nID As Long) As Long其中第一个参数lpszWindowName表示窗口名,参数x、y、nWidth、nHeight分别描述窗口的位置和大小信息,hwndParent表示其父窗口的句柄,最后一个参数nID为窗口ID。函数返回值为新创建的捕捉窗口句柄。
图2 视频捕捉工作流程
第二个为摄像头信息的提取,用于查找系统中有几个可用的摄像头:
Declare Function capGetDriverDescription Lib "avicap32.dll" _Alias "capGetDriverDescriptionA" _ (ByVal dwDriverIndex As Long, _ByVal lpszName As String, _ByVal cbName As Long, _ByVal lpszVer As String, _ ByVal cbVer As Long) As Long参数dwDriverIndex表示需要返回的摄像头索引号,lpszName 为摄像头名称lpszVer 为版本信息。
第三个是消息发送函数,用于软件和系统摄像头之间的消息发送,本此设计捕捉中用的是下面这个消息来发送数据:
Declare Function SendMessageAsLong Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, _ByVal wMsg As Long, _ ByVal wParam As Long, _ByVal lParam As Long) As Long
其中hWnd为创建的捕捉窗口句柄,wMsg为消息,也就是说告诉系统中VFW需要做什么。
4 视频捕捉的设计与实现
利用VFW技术实现视频的捕捉主要是通过调用其视频捕捉模块AVICap. dll创建AVICap窗口类,并借助窗口类中的结构、回调函数以及宏函数来完成。而本次的视频捕捉是运用系统消息函数向捕捉窗口发送消息来建立捕捉窗口与捕捉设备的联系的。捕捉之前我们首先要安装上网络摄像头,下面将给出VB捕捉的具体程序代码,并配上注解。
VB视频捕捉的程序代码如下:
Option Explicit
Dim hCapWnd As Long‘设置捕捉窗口句柄
Private Sub Form_Load()
Dim Messagepram As Long‘设置发送消息参数
Dim x As Long
Dim y As Long
x = Form1.Height
y = Form1.Width
hCapWnd = capCreateCaptureWindow("视频捕捉", WS_CHILD Or WS_VISIBLE, 0, 0, x, y, Me.hWnd, 0),创建的窗口能足够显示摄像头的内容 If 0 = hCapWnd Then '当无法创建窗口时,出现提示
MsgBox "不能建立视频捕捉窗口", vbCritical, "视频捕捉"
Exit Sub
End If
‘发送与摄像头设备连接的消息
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_DRIVER_CONNECT, 0, 0)
‘通过消息设置帧频,默认为15帧/秒
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
‘通过消息发送“开始向捕捉窗口发送画面”
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_SET_PREVIEW, 1, 0)
End Sub
Private Sub Form_Unload(Cancel As Integer)‘退出程序时关闭捕捉
Dim CAPstop As Long
CAPstop = SendMessageAsLong(hCapWnd, WM_CAP_STOP, 0, 0)
End Sub
上述程序只是反映了视频如何捕捉的过程,对捕捉下来的视频运用AVIFILE 来对视频进行存盘操作,下面是视频捕捉的截图。
图3 VB视频捕捉
5 结束语
运用Windows系统下的VFW来开发一些视频应用软件,可以开发出适合自己软件要求的产品,但是它所捕捉的视频是AVI文件的,是占用空间比较大,如果要在网络上将捕捉下的视频进行远程传输,需要编写压缩代码进行压缩后才能。
参考文献:
[1]申华.基于Windows环境下视频捕捉技术的研究及应用[D].辽宁:大连海事大学,2005.
[2]曹衍龙.Visual Basic系统开发实例精粹[M].北京:人民邮电出版社,2005:183-198.
[3]贝雷,王敏.用VideoforWindows实现视频捕捉[J].系统工程,2000,18(6):63-65.
[4]琚章锋,刘娟.利用VFW进行视频开发[J].电脑开发与应用,2004,17(7):20-22.
[5]陈珲,张会汀,周杰华.利用VFW实现实时视频捕捉及其应用[J].计算机应用,2003,23(8):141-143.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词: VFW;视频捕捉; Windows API;AVICap
中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-3854-02
Video Capture of Network-vidicon Based on VB6.0
WANG Hai-feng, ZHANG Yi
(Information and Educational Technique Center, Jiangsu Teachers University of Technology, Changzhou 213001,China)
Abstract:With the rapid development of communication and multimedia technique,the application of the multimedia video got a broad development,in the domain of video application,suppose to carry on image manipulation, must first implement the video capture. Consequently, the article has carried on the elaboration to VFW system structure under the Windows system, has produced Windows API function about video capture, has analyzed the working process of the video capture; video capture programme has been designed and implement with VB,programme code has been produced.Finally,the result of video capture is feasible.
Key words:VFW;video capture;Windows API function;AVICap
1 引言
1992年,Microsoft公司发布了Video for Windows(以下简称VFW),使得任何PC机都能在无特定硬件支持的条件下播放视频画面。它以纯软件的方式从模拟视频源采集数字视频信号并将其存储到文件中或直接对视频缓存进行处理。
VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩,它引进了AVI (Audio VideoInterleave)文件标准,规定了视频和音频数据以交织的方式进行存储。这种按交替方式组织视频和音频数据的方式可使得读取视频数据流时能更有效地从存储媒介得到连续的信息。
Windows本身包括了VFW,当用户在安装Windows时,安装程序会自动地安装配置视频所需的视频组件,如设备驱动程序、视频压缩程序等。
在VFW开发包中自带了一个视频捕捉的工具vidcap,它使用了VFW视频捕捉模块AVICap的大量API (Application Program Interface,应用程序接口)函数实现实时的视频捕捉。
2 VFW体系结构
VFW以消息驱动方式对视频设备进行存取,可以很方便地控制设备数据流的工作过程。它主要包括多个动态连接库,通过这些组件间的协调合作,来完成视频的捕捉、视频压缩及播放功能。VFW体系结构如图1所示。
VFW主要由六个模块组成:
(1)AVICAP.DLL:它主要实现视频捕捉功能。它包含了用于视频捕捉的函数,为AVI文件输入输出和视频、音频设备驱动程序提供一个高级接口。
(2)MSVIDEO.DLL:用一套特殊的DrawDib函数来处理屏幕上的视频操作,能够将视频捕捉窗口与捕捉驱动设备连接起来,支持ICM视频编码服务。
(3)MCIAVI.DRV:它包含了对VFW的MCI命令解释器,实现回放功能。
(4)AVIFILE.DLL:支持由标准多媒体I/0函数提供的更高的命令来访问AVI文件。
(5)ICM( Installable compression manager):即压缩管理器,提供对存储在AVI文件中视频图像数据的压缩、解压缩服务。
(6)ACM( Audio Compression Manager):即音频压缩管理器,提供与ICM相似的服务,不同之处是它适用于波形音频。
Microsoft的Visual Basic支持VFW,在此开发平台上,可通过多媒体控制接口实现与声音、视频等多媒体信息打交道,开发出多媒体应用程序。
图1 VFW体系结构图
3 基于VFW下VB视频捕捉
3.1VFW视频捕捉模块AVICap窗口类常用的数据结构
在利用AVICap编程时,常常要用到与视频捕捉相关的结构。下面对常用的4个结构作以简要介绍,对于前3个结构都有对应的函数来设置和获得结构包含的信息。
(1)CAPSTATUS:定义捕捉窗口的当前状态;
(2)CAPDRIVERCAPS:定义捕捉设备的能力,如:有无预览能力,有无控制视频源,视频格式的对话框等;
(3)CAPTUREPARMS:包含控制视频流捕捉过程的参数,如捕捉帧频,指定键盘或鼠标键以终止捕捉,捕捉时间限制等;
(4)VIDEOHDR:定义视频数据块的头信息。在编写回调函数时常用到其数据成员1pData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)。
3.2VFW视频捕捉的工作流程
利用VB进行视频捕捉的设计需要遵循如图2程序流程:
3.3 Windows API视频相关函数
在用VB6.0进行视频捕捉的时候需要用到Windows API 视频相关函数,第一个是建立视频窗口的函数
Declare Function capCreateCaptureWindow Lib "avicap32.dll" _Alias "capCreateCaptureWindowA" _(ByVal lpszWindowName As String, _ByVal dwStyle As Long, _ByVal x As Long, _ByVal y As Long, _ByVal nWidth As Long, _ByVal nHeight As Long, _ ByVal hwndParent As Long, _ ByVal nID As Long) As Long其中第一个参数lpszWindowName表示窗口名,参数x、y、nWidth、nHeight分别描述窗口的位置和大小信息,hwndParent表示其父窗口的句柄,最后一个参数nID为窗口ID。函数返回值为新创建的捕捉窗口句柄。
图2 视频捕捉工作流程
第二个为摄像头信息的提取,用于查找系统中有几个可用的摄像头:
Declare Function capGetDriverDescription Lib "avicap32.dll" _Alias "capGetDriverDescriptionA" _ (ByVal dwDriverIndex As Long, _ByVal lpszName As String, _ByVal cbName As Long, _ByVal lpszVer As String, _ ByVal cbVer As Long) As Long参数dwDriverIndex表示需要返回的摄像头索引号,lpszName 为摄像头名称lpszVer 为版本信息。
第三个是消息发送函数,用于软件和系统摄像头之间的消息发送,本此设计捕捉中用的是下面这个消息来发送数据:
Declare Function SendMessageAsLong Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, _ByVal wMsg As Long, _ ByVal wParam As Long, _ByVal lParam As Long) As Long
其中hWnd为创建的捕捉窗口句柄,wMsg为消息,也就是说告诉系统中VFW需要做什么。
4 视频捕捉的设计与实现
利用VFW技术实现视频的捕捉主要是通过调用其视频捕捉模块AVICap. dll创建AVICap窗口类,并借助窗口类中的结构、回调函数以及宏函数来完成。而本次的视频捕捉是运用系统消息函数向捕捉窗口发送消息来建立捕捉窗口与捕捉设备的联系的。捕捉之前我们首先要安装上网络摄像头,下面将给出VB捕捉的具体程序代码,并配上注解。
VB视频捕捉的程序代码如下:
Option Explicit
Dim hCapWnd As Long‘设置捕捉窗口句柄
Private Sub Form_Load()
Dim Messagepram As Long‘设置发送消息参数
Dim x As Long
Dim y As Long
x = Form1.Height
y = Form1.Width
hCapWnd = capCreateCaptureWindow("视频捕捉", WS_CHILD Or WS_VISIBLE, 0, 0, x, y, Me.hWnd, 0),创建的窗口能足够显示摄像头的内容 If 0 = hCapWnd Then '当无法创建窗口时,出现提示
MsgBox "不能建立视频捕捉窗口", vbCritical, "视频捕捉"
Exit Sub
End If
‘发送与摄像头设备连接的消息
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_DRIVER_CONNECT, 0, 0)
‘通过消息设置帧频,默认为15帧/秒
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_SET_PREVIEWRATE, 66, 0)
‘通过消息发送“开始向捕捉窗口发送画面”
Messagepram = SendMessageAsLong(hCapWnd, WM_CAP_SET_PREVIEW, 1, 0)
End Sub
Private Sub Form_Unload(Cancel As Integer)‘退出程序时关闭捕捉
Dim CAPstop As Long
CAPstop = SendMessageAsLong(hCapWnd, WM_CAP_STOP, 0, 0)
End Sub
上述程序只是反映了视频如何捕捉的过程,对捕捉下来的视频运用AVIFILE 来对视频进行存盘操作,下面是视频捕捉的截图。
图3 VB视频捕捉
5 结束语
运用Windows系统下的VFW来开发一些视频应用软件,可以开发出适合自己软件要求的产品,但是它所捕捉的视频是AVI文件的,是占用空间比较大,如果要在网络上将捕捉下的视频进行远程传输,需要编写压缩代码进行压缩后才能。
参考文献:
[1]申华.基于Windows环境下视频捕捉技术的研究及应用[D].辽宁:大连海事大学,2005.
[2]曹衍龙.Visual Basic系统开发实例精粹[M].北京:人民邮电出版社,2005:183-198.
[3]贝雷,王敏.用VideoforWindows实现视频捕捉[J].系统工程,2000,18(6):63-65.
[4]琚章锋,刘娟.利用VFW进行视频开发[J].电脑开发与应用,2004,17(7):20-22.
[5]陈珲,张会汀,周杰华.利用VFW实现实时视频捕捉及其应用[J].计算机应用,2003,23(8):141-143.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。