vfw.docx
- 文档编号:5380570
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:26
- 大小:30.42KB
vfw.docx
《vfw.docx》由会员分享,可在线阅读,更多相关《vfw.docx(26页珍藏版)》请在冰点文库上搜索。
vfw
VFW技术资料基本解析。
VFW概念
VFW是微软公司1992年推出的关于数字视频的一个软件包,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。
VFW的一个关键思想是播放时不需要专用硬件,为了解决数字视频数据量大的问题,需要对数据进行压缩。
它引进了一种叫AVI的文件标准,该标准未规定如何对视频进行捕获、压缩及播放,仅规定视频和音频该如何存储在硬盘上,以及在AVI文件中交替存储视频帧和与之相匹配的音频数据。
VFW给程序员提供.VBX和AVICap窗口类的高级编程工具,使程序员能通过发送消息或设置属性来捕获、播放和编辑视频剪辑。
VFW提供了基于消息的接口,而这些接口,也可以利用它本省定义的宏来实现。
在Windows9x系统中,当用户在安装VFW时,安装程序会自动地安装配置视频所需要的组件,如设备驱动程序、视频压缩程序等。
VFW主要由以下6个模块组成:
●AVICAP.DLL:
包含执行视频捕获的函数,它给AVI文件的I/O处理和视频、音频设备驱动程序提供一个高级接口;
●MSVIDEO.DLL:
包含一套特殊的DrawDib函数,用来处理屏幕上的视频操作;
●MCIAVI.DRV:
包括对VFW的MCI命令解释器的驱动程序;
●AVIFILE.DLL:
包含由标准多媒体I/O(mmio)函数提供的更高的命令,用来访问.AVI文件;
●视频压缩管理器(ICM):
用于管理的视频压缩/解压缩的编译码器(Codec);
●音频压缩管理器ACM:
提供与ICM相似的服务,适用于波形音频。
AVICap在显示视频时提供的两种模式:
(A)预览(Preview)模式:
该模式使用CPU资源,视频帧先从捕获硬件传到系统内存,接着采用GDI函数在捕获窗中显示。
在物理上,这种模式需要通过VGA卡
在监视器上显示。
(B)叠加(Overlay)模式:
该模式使用硬件叠加进行视频显示,叠加视频的显示不经过VGA卡,叠加视频的硬件将VGA的输出信号与其自身的输出信号合并,形
成组合信号显示在计算机的监视器上。
只有部分视频捕获卡才具有视频叠加能力。
AVICap为应用程序提供了一个简单的、基于消息的接口,使之能访问视频和波形音频硬件,并能在将视频流捕获到硬盘上的过程中进行控制。
MicrosoftVideoforWindows(VFW)提供的函数可以让应用程序去处理视频数据。
VFW在16位Windows的时候就被引入了。
它的许多重要功能已经被DirectX取代了。
下面介绍VFW的视频捕获:
你可以使用windows的AVICap类轻松地完成视频捕获。
AVICap提供给应用程序一个简单的、基于消息的接口去访问视频设备和录音设备,并且可以控制处理视频流捕获。
AVICap支持实是视频流捕获和实时单帧图像捕获。
另外,AVICap提供了对视频源的控制(MCI媒体控制接口设备),因此使用者可以通过应用程序控制一个视频源开始和结束的位置,并且可以加大对帧捕获的控制。
VFW是Microsoft公司为开发Windows平台下的视频应用程序提供的软件工具包,
提供了一系列应用程序编程接口(API),
用户可以通过这些接口很方便地实现视频捕获、视频编辑及视频播放等通用功能,
还可利用回调函数开发比较复杂的视频应用程序。
该技术的特点是播放视频时不需要专用的硬件设备,而且应用灵活,可以满足视频应用程序开发的需要。
Windows操作系统自身就携带了VFW技术,系统安装时,会自动安装VFW的相关组件。
VFW处理视频原理
用AVICAP.DLL实现图像采集,首先要用函数capCreateCaptureWindowA创建一个视频采集窗口,然后向视频采集窗口发送相应的消息,实现视频设备的连接、回调函数设置、预览比例和速率设置、预览和叠加模式的设置、图像文件设置等操作。
如果以上操作成功,就可以通过视频设备采集图像了。
回调函数由程序员编写,用于特殊的视频采集中,例如,在视频会议中用回调函数将采集的视频和音频实时地传递到远程计算机中。
在VC++中,头文件VFW.H中不仅包含了AVICAP.DLL中函数的原型定义,还定义了与视频采集有关的数据结构、消息和发送消息的宏。
利用这些函数、数据结构、消息和发送消息的宏可以方便地编写图像采集程序,如果要对采集的图像实时处理,可以通过编写回调函数实现。
2.1 建立捕获窗口
利用AVICAP组件函数capCreateCaptureWindow()建立视频捕获窗口,它是所有捕获工作及设置的基础,其主要功能包括:
①动态地同视频和音频输入器连接或断开;②设置视频捕获速率;③提供视频源、视频格式以及是否采用视频压缩的对话框;④设置视频采集的显示模式为Overlay或为Preview;⑤实时获取每一帧视频数据;⑥将一视频流和音频流捕获并保存到一个AVI文件中;⑦捕获某一帧数字视频数据,并将单帧图像以DIB格式保存;⑧指定捕获数据的文件名,并能将捕获的内容拷贝到另一文件。
2.2 登记回调函数[2]
登记回调函数用来实现用户的一些特殊需要。
在以一些实时监控系统或视频会议系统中,需要将数据流在写入磁盘以前就必须加以处理,达到实时功效。
应用程序可用捕获窗来登记回调函数,以便及时处理以下情况:
捕获窗状态改变、出错、使用视频或音频缓存、放弃控制权等,相应的回调函数分别为capStatusCallback(),capErrorCallback(),capVideoStreamCallback(),capWaveStreamCallback(),capYieldCallback()。
2.3 获取捕获窗口的缺省设置
通过宏capCaptureGetSetup(hWndCap,&m_Parms,sizeof(m_Parms))来完成。
2.4 设置捕获窗口的相关参数
通过宏capCaptureSetSetup(hWndCap,&m_Parms,sizeof(m_Parms))来完成。
2.5 连接捕获窗口与视频捕获卡
通过宏capDriveConnect(hWndCap,0)来完成。
2.6 获取采集设备的功能和状态
通过宏capDriverGetCaps(hWndCap,&m_CapDrvCap,sizeof(CAPDRIVERCAPS))来获取
视频设备的能力,通过宏capGetStatus(hWndCap,&m_CapStatus,sizeof(m_CapStatus))
来获取视频设备的状态。
2.7 设置捕获窗口显示模式
视频显示有Overlay(叠加)和Preview(预览)两种模式。
在叠加模式下,捕获视频数据布展系统资源,显示速度快,视频采集格式为YUV格式,可通过capOverlay(hWndCap,TRUE)来设置;预览模式下要占用系统资源,视频由系统调用GDI函数在捕获窗显示,显示速度慢,它支持RGB视频格式。
2.8 捕获图像到缓存或文件并作相应处理
若要对采集数据进行实时处理,则应利用回调机制,由capSetCallbackOnFrame(hWndCap,FrameCall-
backProc)完成单帧视频采集;由capSetCallbackOnVideoStream(hWndCap,VideoCallbackProc)完成视频流采集。
如果要保存采集数据,则可调用capCaptureSequence(hWnd);要指定文件名,可调用capFileSetCap-
ture(hwnd,Filename)。
2.9 终止视频捕获 断开与视频采集设备的连接
调用capCatureStop(hWndCap)停止采集,调用capDriverDisconnect(hWndCap),断开视频窗口与捕获驱动程序的连接。
3视频编辑和播放
利用VFW,不仅可以实现视频流的实时采集,还提供了编辑和播放功能,主要通过AVIFILE、ICM、ACM、MCIWnd等组件之间的协作来完成。
3.1编辑处理AVI[3]视频文件的一般流程(图2)
图2 编辑视频文件的一般流程图
Fig.2 Generalflowchartofeditingvideofiles
1)AVIFileInit();//初始化;
2)AVIFileOpen();//打开一个AVI文件并获文件的句柄;
3)AVIFileInfo();//获取文件的相关信息,如图像的Width和Height等;
4)AVIFileGetStream();//建立一个指向需要访问的数据流的指针;
5)AVIStreamInfo();//获取存储数据流信息的AVISTREAMINFO结构;
6)AVIStreamRead();//读取数据流中的原始数据,对AVI文件进行所需的编辑处理;
7)AVIStreamRelease();//释放指向视频流的指针;
8)AVIFileRelease();AVIFileExit();//释放AVI文件。
若数据是压缩过的,则用AVIStreamGetFrameOpen(),AVIStreamGetFrame()和AVIStreamGetFrameClose()来操作,可以完成对视频流的逐帧分解。
3.2视频播放
对于实现视频流的播放,VFW提供了MCIWnd窗口类[4],主要用于创建视频播放区,控制并修改MCI窗口当前加载媒体的属性。
一个由函数、消息和宏组成的库与MCIWnd相关联,通过它们可以进行AVI文件操作,很方便地使应用程序完成视频播放功能。
1)MCIWndCreate();//注册MCIWnd窗口类,创建MCIWnd窗口,并指定窗口风格;
2)AVIFileInit();//初始化;
3)AVIFileOpen();//打开AVI文件;
4)AVIFileGetStream();//获得视频流;
5)运用相关函数进行各种播放任务:
MCIWndPlay()正向播放AVI文件内容,MCIWndPlayReverse()反向播放,MCIWndResume()恢复播放,MCIWndPlayPause()暂停播放,MCIWndStop()停止播放等等。
6)AVIStreamRelease();//释放视频流;
7)AVIFileRease();AVIFileExit();//断开与AVI文件的连接,释放视频源。
由以上步骤可以看出,视频播放是视频编辑其中的一种操作。
——————————————————————————————————————————
●CapCreateCaptureWindow:
在进行视频捕获之前必需要先创建一个“捕获窗”,并以它为基础进行所有的捕获及设置操作。
捕获窗类似于标准控件(如按钮、列表框等),并具有下列功能:
将视频流和音频流捕获到一个AVI文件中;
动态地同视频和音频输入器件连接或断开;
以Overlay或Preview模式对输入的视频流进行实时显示;
在捕获时,可指定所用的文件名并能将捕获文件的内容拷贝到另一个文件;
设置捕获速率;
显示控制视频源、视频格式、视频压缩的对话框;
创建、保存或载入调色板;
将图像和相关的调色板拷贝到剪贴板;
将捕获的单帧图像保存为DIB格式的文件。
●CapDriverConnect:
使一个捕获窗与一个设备驱动程序相关联。
单独定义的一个捕获窗是不能工作的,它必需与一个设备相关联,这样才能取得视频信号。
●CapCaptureSetSetup,CapPreviewScale,CapPreviewRate:
设置视频设备的属性。
通过设置TcaptureParms结构变量的各个成员变量,可以控制设备的采样频率、中断采样按键、状态行为等等。
设置好TCaptureParms结构变量后,可以用函数CapCaptureSetSetup使设置生效。
之后还可以用CapPreviewScale、CapPreviewRate来设置预览的比例与速度,也可以直接使用设备的默认值。
●CapOverlay,CapPreview:
打开预览。
利用函数CapOverlay选择是否采用叠加模式预览,这样占用系统资源小,并且视频显示速度快。
然后用CapPreview启动预览功能,这时就可以在屏幕上看到来自摄像机的图像了。
VFW函数API总结
所有的实例主要使用AVICAP32.DLL中的函数和USER32.DLL中的函数,函数语法及结构如下。
(1)capCreateCaptureWindow函数
该函数用于创建一个视频捕捉窗口。
语法如下:
[DllImport("avicap32.dll")]
publicstaticexternIntPtrcapCreateCaptureWindowA
(byte[]lpszWindowName,intdwStyle,intx,inty,intnWidth,intnHeight,IntPtrhWndParent,intnID);
参数说明如下。
l lpszWindowName:
标识窗口的名称。
l dwStyle:
标识窗口风格。
l x、y:
标识窗口的左上角坐标。
l nWidth、nHeight:
标识窗口的宽度和高度。
l hWnd:
标识父窗口句柄。
l nID:
标识窗口ID。
l 返回值:
视频捕捉窗口句柄。
capCreateCaptureWindowA
DeclarecapCreateCaptureWindowin"avicap32.dll"as"capCreateCaptureWindowA";
StringlpszWindowName,;
LongdwStyle,;
Longx,;
Longy,;
LongnWidth,;
LongnHeight,;
LonghwndParent,;
LongnID
函数返回打开的句柄值。
lpszWindowName:
视频窗口的名字
dwStyle:
样式
x:
左边距(相对于父窗口,一般为0)
y:
上边距(相对于父窗口,一般为0)
nWidth:
视频窗口的宽度(注:
此项并不会改变摄像头的分辨率,超出部分不会被刷新)
nHeight:
视频窗口的高度
hWndParent:
父窗口句柄
nID:
标识符(一般为0)
这是VFW编程最基本的函数了,例如:
lwndC=capCreateCaptureWindowA("我的视频监视窗口",WS_CHILD,0,0,160,120,hwnd,0)
AVICAP.DLL是微软公司提供的用于视频采集的动态链接库文件,其中定义了视频采集的函数。
AVICAP.DLL支持实时的视频流采集和单帧采集并提供对视频源的控制。
利用AVICAP.DLL可以方便地编写视频和图像采集程序。
在AVICAP.DLL中定义了如下的接口函数:
(1)创建视频采集窗口函数
HWNDWINAPIcapCreateCaptureWindowA(
LPCSTRlpszWindowName,
DWORDdwStyle,
intx,inty,intnWidth,
intnHeight,
HWNDhwndParent,intnID);
其中,参数lpszWindowName指明窗口的名称,参数dwStyle指明窗口的风格,参数x、y、nWidth和nHeight指明窗口的位置和大小,参数hwndParent指明父窗口的句柄,参数nID指明窗口标识。
在AVICAP.DLL中还定义了一个创建视频采集窗口函数,是capCreateCaptureWindowW,其函数原型与capCreateCaptureWindowA相同,它们的区别是前一个函数用于ANSI字符编码方式下,而后一个函数用于UNICODE字符编码方式下。
在头文件VFW.H中用条件编译和宏定义统一为capCreateCaptureWindow。
capGetDriverDescriptionA
(2)取得视频采集设备描述信息函数
BOOLWINAPIcapGetDriverDescriptionA(UINTwDriverIndex,LPSTRlpszName,
intcbName,LPSTRlpszVer,intcbVer);
其中,参数wDriverIndex指明设备的索引号,参数lpszName指明设备的名称缓冲区的地址,参数cbName指明设备的名称缓冲区的大小,参数lpszVer指明设备的描述缓冲区的地址,参数cbVer指明设备的描述缓冲区的大小。
同样,在AVICAP.DLL中还定义了一个取得视频采集设备描述信息函数,是capGetDriverDescriptionW,它们的区别也是使用于不同的编码方式下。
在头文件VFW.H中统一为capGetDriverDescription。
(2)SendMessage函数
用于向Windows系统发送消息机制。
[DllImport("User32.dll")]
privatestaticexternboolSendMessage
(IntPtrhWnd,intwMsg,intwParam,intlParam);
参数说明如下。
l hWnd:
窗口句柄。
l wMsg:
将要发送的消息。
l wParam、lParam:
消息的参数,每个消息都有两个参数,参数设置由发送的消息而定。
捕获一个视频流或当前设备状态时分别使用以下函数:
//捕获一个视频流
CapSetCallbackOnVideoStream;
//得到一个设备错误
CapSetCallbackOnError;
//得到一个设备状态
CapSetCallbackOnStatus
}
自定义的函数1//定义一个帧捕获回调函数
CapSetCallbackOnFrame(ghCapWnd,LongInt(@VideoStreamCallBack));
//将一个捕获窗口与一个设备驱程相关联,第二个参数是个序号,当系统中装有多个显视驱动程序时,其值分别依次为0到总个数
CapDriverConnect(ghCapWnd,0);
//设置设备属性的结构变量
CapParms.dwRequestMicroSecPerFrame:
=40000;
CapParms.fLimitEnabled:
=FALSE;
CapParms.fCaptureAudio:
=FALSE;//NOAudio
CapParms.fMCIControl:
=FALSE;
CapParms.fYield:
=TRUE;
CapParms.vKeyAbort:
=VK_ESCAPE;
CapParms.fAbortLeftMouse:
=FALSE;
CapParms.fAbortRightMouse:
=FALSE;
//使设置生效
CapCaptureSetSetup(ghCapWnd,LongInt(@CapParms),sizeof(TCAPTUREPARMS));
//设置预览时的比例
CapPreviewScale(ghCapWnd,1);
//设置预览时的帧频率
CapPreviewRate(ghCapWnd,66);
//如果要捕获视频流,则要使用函数指定不生成文件。
否则将会自动生成AVI文件
CapCaptureSequenceNoFile(ghCapWnd);
//指定是否使用叠加模式,使用为1,否则为0
CapOverlay(ghCapWnd,1);
//打开预览
CapPreview(ghCapWnd,1);
//停止捕获
capCaptureAbort(ghCapWnd);
//将捕获窗同驱动器断开
capDriverDisconnect(ghCapWnd);
VFW示例
名词解释
avicap32.dll
avicap32.dll是WindowsAPI应用程序接口相关模块,用于对摄像头和其它视频硬件进行AVI电影和视频的截取。
API编程使用方法:
'//CaptureFunctionDeclares
DeclareFunctioncapCreateCaptureWindowLib"avicap32.dll"Alias"capCreateCaptureWindowA"_
(ByVallpszWindowNameAsString,_
ByValdwStyleAsLong,_
ByValxAsLong,_
ByValyAsLong,_
ByValnWidthAsLong,_
ByValnHeightAsLong,_
ByValhwndParentAsLong,_
ByValnIDAsLong)AsLong'returnsHWND
DeclareFunctioncapGetDriverDescriptionLib"avicap32.dll"Alias"capGetDriverDescriptionA"_
(ByValdwDriverIndexAsLong,_
ByVallpszNameAsString,_
ByValcbNameAsLong,_
ByVallpszVerAsString,_
ByValcbVerAsLong)AsLong'returnsCBOOL
user32.dll
user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性,如创建窗口和发送消息。
在早期32-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- vfw