在VB中基于VFW视频捕获技术的研究

2016-01-05 15:27王瑜
电脑知识与技术 2015年31期

王瑜

摘要:在VB中分析视频捕捉的工作流程,依托VFW软件开发包的体系结构,通过调用Windows API函数,来设计和实现局域网内视频捕捉程序,并给出部分源代码,重点讨论了VB对VFW视频捕捉的设计方法及关键性Windows API函数的用法。

关键词:VB;VFW;视频捕捉;Windows API

中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2015)31-0174-02

In the VB based on VFW Video Capture Technology

WANG Yu

(Yunyang Teacher's College, Shiyan 442000, China)

Abstract: In the VB analysis of video capture workflow, relying on VFW architecture of the software development kit by calling the Windows API functions, to design and implement LAN video capture program, and give part of the source code, focusing on the VB to the VFW video capture The design methods and critical use of Windows API functions.

Keywords: VB; VFW; Video Capture; Windows API

在各类的通讯手段与科学技术乃至多媒体的终端技术不断发展的当下,对于多媒体的应用尤其是视频方面的应用,在很大程度上取得了优越的进展,许多关于视频的软件开发,如视频会议、可视手机等都是基于视频捕获技术而发展壮大,这得益于Microsoft公司于1992年在Windows系统中提供的视频捕获标准接口Video for Windows(VFW)。VFW的核心是AVI文件标准,其SDK分VC和VB版。在客户对Windows的系统进行安装的过程当中,整个程序会根据事先设定的程序内容,自动地将整个系统当中所需要的相关视频方面的组件进行配置安装,VFW的开发工具提供了各类音视频服务的接口和函数,这些函数允许应用程序与各类音视频驱动程序之间相互通信,极大的简化视频捕获过程的编程。

1 Video for Windows(VFW)简介

1.1 VFW技术概述

VFW的基础是MCI(Media Control Interface,媒体控制接口)。MCI本身提供高、中、低三种层次接口。高层接口主要提供Avicap和Mciwnd这两个类型的系统窗口,主要是通过VFW当中的两个动态的相应的链接仓库进行的创建,分别命名为Avicap.dll以及Msvedeo.dll,分别用于采集捕捉视频剪辑和播放音视频文件。中层接口主要负责应用程序与各多媒体驱动程序相连接。其中的低层次的接口,是在对程序的基本要求全面熟知的情况下,将多媒体的信息设备进行全面的分析与应用,在对多媒体的相关信息进行全面的接管的过程当中所采用的技术手段。具有很强的实时性。

VFW这一技术,主要是由六大方面的模块进行组件而成:

1)AVICAP.DLL:这一模块,主要讲视频的捕获功能予以全面的实现,其中包含的一些函数,可以用作是视频的捕捉与获取,从而为相应的视频与音频提供接收的有效端口。

2)MSVIDEO.DLL:这个模块,主要功能作用是将相应的捕捉与获取视频的窗口,智能地域其相关联的驱动设备进行连接,从而在最大程度上对ICM的视频当中编码程序进行全方位的服务。

3)其模块含有MCI的命令,并且配备了命令相应的解释器具,可以在很大程度上将回放的功能实现。

4)MCIAVI.DRV:这个模块极为特殊,它可以对AVI的文件予以管理,针对其读写与操作的性能,进行文件的统一管理。

5)ICM:被称之为压缩的管理器具,它可以为存储在AVI的文件当中一系列的视频相关的图像与数据进行压缩,同时也提供了解压缩的这项服务。

6)ACM:是处理音频的主要模块,将音频进行压缩与管理的器具,提供实时音频压缩及解压缩功能。

2 在CFW整体技术的基础上,将VB当中视频的获取与捕捉的工作流程予以实现

2.1 视频捕捉工作流程

1)创建视频捕获窗口:Declare Function capCreateCaptureWindow Lib "avicap32.dll" _Alias "capCreateCaptureWindowA" _(Byval lpszWindowName As string,_Byval dwStyle As Long,_Byval x As Long,_Bycal 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表示窗口位置大小。

2)注册系统回调函数:在其中进行了多个函数的定义,当相应的事件发生的时候,会通过系统进行整体的操作与调试。

3)设置捕获窗口相关函数:根据实际情况来修改其返回值中各变量的相应信息,从而获取更多的视频捕获的方式方法。

4)枚举视频采集设备并进行连接:查找系统中可用的视频采集设备,用函数:Declare Function capGetDriverDescription Lib "avicap32.dll" _Alias "capGetDriverDescriptionA" _(Byval dwDriverIndex As Long,_Byval lpszName As string,_Byval cbName As Long,_Bycal lpszVer As string,_Byval cbVer As Long) As Long来得到已安装捕捉设备的名称和版本号,并用宏capDriverConnect将捕获窗口与采集设备连接起来。

5)获取视频并且将相关的设备所持有的能力以及信息内容进行全面的采集:通过宏调配capDriverGetCaps并且对设备所拥有的能力进行采收与集整的一种状态。

6)对设备的窗口进行捕捉与获取,从而进行显示的模式:通过fHasOverlay域判断视频设备能力,通过capOverlay启动叠加(Overlay)模式,或通过capPreview启动预览(Preview)模式。并可通过函数:Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long对系统进行通知,并且告知CFW所需要的工作内容。

7)捕捉视频到缓存或文件并进行处理:可用函数capSetCallBackOnFrame对视频进行逐帧处理,也可用宏capCaptureSequence将捕获视频以AVI格式进行保存。

8)完成视频的捕捉工作,并且将其终止,将于视频捕捉与获取的相关设备之间的有效连接进行中断处理:在结束了捕获的工作之后,将其他的后续工作完成,其中包括捕获工作的终止、回调的函数的取消、内存的释放以及设备连接的断开等。

2.2 视频捕捉的设计与实现

VB在支持VFW方面提供了强大的窗口类Avicap,可直接控制视频源,不仅支持实时的视频流和单帧捕获,还可以直接访问视频缓冲区,不需要生成中间文件。下面给出部分VB捕捉具体程序代码:

Private 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

……

Private Declare Function SendMessage Lib "user32" _Alias "SendMessageA" ( _ByVal hwnd As Long, _ByVal wMsg As Long, _ByVal wParam As Long, _lParam As Any) As Long

……

Private Sub Form_Load()

Preview_Handle = capCreateCaptureWindow("Video", WS_CHILD + WS_VISIBLE, 0, 0, 320, 240,Me.hWnd, 1) '将捕捉与获取的相应窗口进行建立

SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, 0, 0 '将捕捉与获取窗口与设备的连接链进行建立

SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0 '将帧频率为30毫秒一帧进行捕捉与设置

SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0 '通过全面预览的方式,在整体捕获的窗口进行图像的预览工作

End Sub

Private Sub Form_Unload(Cancel As Integer)

SendMessage Preview_Handle, WM_CAP_DRIVER_DISCONNECT, 0, 0 '将其从捕捉与获取的设备中的连接进行中断

End Sub

以上程序在Windows XP、VB6.0下编译通过,视频捕捉情况良好,同时也可将捕捉下来的视频用Avifile进行存盘操作,但由于文件占用空间一般较大,如果需要进行网络传输,则需编写相应的压缩代码进行压缩后才能执行。

3 结束语

VFW技术封装了有关视頻捕捉的API函数,在VB中可由这些接口编程通过视频捕捉硬件获取数据,将开发者从硬件的底层束缚中解放出来,极大地简化了视频捕获过程,代码简单易读,应用性广,将对进一步的处理工作以及播放工作予以大力的支持,从而能够将视频的应用程序不断推广,最终开辟出全新的道路。

参考文献:

[1] Jeff Prosise(美). MFC Windows程序设计[M]. 清华大学出版社, 2002.

[2] 王汝言. 多媒体通信技术[M]. 西安电子科技大学出版社, 2004.

[3] 曹衍龙. Visual Basic系统开发实例精粹[M]. 人民邮电出版社, 2005.