视频捕获.docx
- 文档编号:4382393
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:27
- 大小:33.11KB
视频捕获.docx
《视频捕获.docx》由会员分享,可在线阅读,更多相关《视频捕获.docx(27页珍藏版)》请在冰豆网上搜索。
视频捕获
这段时间闲来无事,看了看MSDN的文档,自己翻译了一下。
一是为了学习,二是对空闲时间的打发。
所以也希望大家在拍砖的同时,尊重我的劳动,如要转贴请注明转至
Microsoft®VideoforWindows®(VFW)提供的函数可以让应用程序去处理视频数据。
VFW在16位Windows的时候就被引入了。
它的许多重要功能已经被DirectX取代了。
要获得更多的信息,你可以参考DirectX的文档。
下面讲介绍VFW的视频捕获:
3.视频捕获
你可以使用windows的AVICap类轻松地完成视频捕获。
AVICap提供给应用程序一个简单的、基于消息的接口去访问视频设备和录音设备,并且可以控制处理视频流捕获。
3.1关于视频捕获
AVICap支持实是视频流捕获和实时单帧图像捕获。
另外,AVICap提供了对视频源的控制(MCI媒体控制接口设备),因此使用者可以通过应用程序控制一个视频源开始和结束的位置,并且可以加大对帧捕获的控制。
你使用AVICap类可以完成如下的任务:
● 捕获声音和视频,并将他们写入到一个AVI文件中。
● 动态连接和断开视频和音频的输入设备。
● 使用覆盖或预览的方法去显示当前的视频信号。
● 指定一个文件用于捕获,并且把这个捕获文件的内容拷贝给另一个文件。
● 设定捕获图像速度(好多帧)。
● 显示对话框用于控制视频源和格式。
● 创建、保存、加载调色板。
● 拷贝图像和调色板到剪贴板中。
● 捕获并把图像作为一个DIB位图保存。
3.1.1视频捕获:
最简单的方法
视频捕获将数字化一个视频流和音频数据,并且将他们保存在硬盘和其他存储设备上。
这里将描述如何在应用程序中简单地应用视频捕获,它通过三句代码实现。
它还介绍了如何通过发送消息给视频捕获窗口来结束或中断一个视频会话。
AVICap捕获窗口可以把捕获的音视频信息写入一个AVI文件中。
你的应用程序可以自由地处理这个AVI文件、管理缓存区的音视频数据、还可以在底层访问音视频设备的驱动器。
AVICap为应用程序提供了一个灵活的接口。
你可以使用下面的代码,在你的应用程序中加入视频捕获:
HWndC=capCreateCaptureWindow("MyOwnCaptureWindow",
WS_CHILD|WS_VISIBLE,0,0,160,120,hwndParent,nID);
SendMessage(hWndC,WM_CAP_DRIVER_CONNECT,0/*wIndex*/,0L);
SendMessage(hWndC,WM_CAP_SEQUENCE,0,0L);
宏接口同样有用,你可以选择是使用宏接口还是SendMessage函数来实现上面的功能,不过宏接口可以让你的代码更加容易理解。
下面就使用了宏接口。
HWndC=capCreateCaptureWindow("MyOwnCaptureWindow",
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的文件中,捕获动作将一直持续,除非有下面的事件发生:
● 用户按了ESC键或者鼠标的按钮。
● 你的应用程序停止或者退出了捕获操作。
● 磁盘写满了。
在应用程序中,你可以通过发送WM_CAP_STOP命令(或capCaptureStop)给捕获窗口,让它停止向文件写数据。
你还可以通过发送WM_CAP_ABORT命令(或capCaptureAbort)给捕获窗口,让它中断捕获操作。
3.1.2捕获基本设置
通过对定义在CAPTUREPARMS结构中的捕获参数进行修改,你可以完成:
● 改变捕获的帧频律(帧/秒);
● 指定用键盘或鼠标去结束一个捕获会话;
● 为一个捕获会话指定时间周期;
捕获的帧频率
捕获的帧频率表示在一个捕获会话中,每秒要捕获多少帧。
你通过WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)可以得到当前捕获的帧频率。
当前的帧频率被保存在CAPTUREPARMS结构的dwRequestMicroSecPerFrame成员中。
你可以对该值进行修改,从而去改变帧频率。
该值为捕获一帧要用的时间(单位是微秒1/1000000秒),修改后,你可以发送WM_CAP_SET_SEQUENCE_SETUP消息(或capCaptureSetSetup宏)给你的捕获窗体,来刷新CAPTUREPARMS结构。
dwRequestMicroSecPerFrame默认值是66667微秒,表示每秒15帧。
(1000000/15=66667)
退出数据捕获
你可以让用户按这几种方法退出一个捕获会话,按键盘上的一个键或几个组合键、或者按鼠标的左键或者是右键。
如果用户退出一个实时的捕获会话,那么捕获文件中的内容将被系统丢弃掉。
如果用户退出一个步帧(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.
3.1.3捕获窗口
捕获窗体类似于一个标准控件(不如按钮、列表框…),它一般使用WS_CHILD和WS_VISIBLE窗口类型。
.
创建一个AVICap捕获窗口
使用capCreateCaptureWindow函数可以创建一个AVICap的捕获窗口。
这个函数返回一个窗口句柄,这个句柄就是捕获窗口的句柄,后面其他操作就是通过发送消息给该句柄来实现。
你可以在一个程序中创建多个捕获窗口,并且每个窗口连接到不同的捕获设备上。
建立捕获窗口到捕获设备的连接
你可以动态地连接或断开捕获窗口与设备间的链接。
通过使用WM_CAP_DRIVR_CONNECT消息(或capDriverConnect宏),可以实现捕获窗体与设备驱动间的连接。
当捕获窗体和捕获设备驱动连接后,你就可以发送针对设备的消息给该窗体了。
如果你的系统安装了多个捕获设备,你可以通过在发送WM_CAP_DRIVER_CONNECT消息时,设置wPrarm参数(integer)。
来指定捕获窗口与那个具体的视频捕获设备相连接。
WPrarm参数是一个整数,它表示一个系统已经安装的视频捕获设备列表的索引(注册表中或这System.ini[drivers]中的信息)。
该列表的索引从0开始。
通过capGetDriverDescription函数可以获得安装的捕获驱动程序的名称和版本。
你的应用程序可以使用这个函数列举除安装的所有捕获设备,让用户可以选择其中一个去与捕获窗口相联。
通过发送WM_CAP_DRIVER_GET_NAME消息(capDriverGetName宏),可以获得与指定窗体连接的捕获设备的名称。
通过发送WM_CAP_DRIVER_GET_VERSION消息(capDriverGetVersion宏),可以获得与指定窗体连接的捕获设备的版本。
通过发送WM_CAP_DRIVER_DISCONNECT消息(capDriverGetDisconnect宏),可以断开连接。
当捕获窗体销毁后,任何连接的视频捕获设备都将自动断开。
父子窗体交付
一些系统级的消息,比如WM_PALETTECHANGED、WM_QUERYNEWPALETTE,只被发送到顶层(top-level)和overlapped窗口。
如果一个捕获窗体是一个资窗体,那它的父窗口应该来转寄这些消息。
同样地,假如父窗口尺寸改变了,它可能需要发送一个通知消息给捕获窗口。
相反,如果捕获视频尺寸变化了,捕获窗口可能需要发一个通知消息给父窗口。
最简单的管理方法是让捕获窗口的尺寸等于捕获视频流的尺寸,随时把改变的尺寸告诉给父窗口。
捕获窗体状态
通过发送WM_CAP_GET_STATUS消息(capGetStatus宏),可以获得当前捕获窗口的状态。
这个消息得到一个CAPSTATUS结构体的拷贝,状态信息就在这个结构体的成员中。
CAPSTATUS结构体包含了图形尺寸大小、滚动位置(scrollposition)、是否覆盖(overlay)或者预览(preview)等信息。
因为在CAPSTATUS中的信息是动态的,你的应用程序应该随时去刷新这个结构体中的内容。
改变捕获窗口的尺寸对实际的视频流的尺寸没有影响。
3.1.4捕获和音频驱动器
视频捕获可以做这几个方面的工作:
访问视频源、显示选项、格式和压缩选项。
音频捕获包括指定音频格式和选择压缩方式。
捕获驱动性能
通过发送WM_CAP_DRIVER_GET_CAPS消息(capDriverGetCaps宏),可以获得当前连接的捕获设备的性能。
发送该消息后,会返回一个CAPDRIVERCAPS结构的对象。
设备的性能信息,就在这个对象中。
视频对话框(VideoDialogBoxes)
每个捕获设备的驱动程序都可以为控制视频信号和捕获处理和视频压缩提供4个对话框。
这些对话框中的内容都是视频捕获驱动程序定义的。
视频源对话框(VideoSourcedialogbox)用于选择视频输入通道和视频图像的动态参数。
它可以列举出当前连接视频设备的信号类型(SVHS和复合类型),并且可以通过该对话框去修改图像的色调、亮度、饱和度。
你可以通过使用WM_CAP_DLG_VIDEOSOURCE消息(或capDlgVideoSource宏)来显示和刷新这个窗口。
视频格式对话框(VideoFormatdialogbox)用于选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式。
你可以通过使用WM_CAP_DLG_VIDEOFORMAT消息(或capDlgVideoFormat宏)来显示和刷新这个窗口。
视频显示对话框(VideoDisplaydialogbox)用于控制视频外观。
在该对话框上进行了修改只是对视频显示起作用,对于实际的视频数据是不会造成改变的。
比如,可以改变显示的颜色,饱和度等等....。
你可以通过使用WM_CAP_DLG_VIDEODISPLAY消息(或capDlgVideoDisplay宏)来显示和刷新这个窗口。
视频压缩对话框(VideoCompressiondialogbox)用于设置视频压缩的格式。
通过使用WM_CAP_DLG_VIDEOCOMPRESSION消息(或capDlgVideoCompression宏)来显示和刷新这个窗口。
预览和覆盖模式(PreviewandOverlay)
一般,一个捕获驱动提供两种方式来观看输入的视频流:
预览模式和覆盖模式。
如果捕获驱动可以提供上面两种模式,那么用户就可以选择其中的模式来使用。
预览模式从捕获设备硬件传输数据帧到系统的内存中,并且在捕获窗口中使用GDI函数来显示这些数据帧。
当捕获窗口的父窗体失去焦点的时候,在应用程序的视频预览的数据将变慢,如果父窗体获的焦点后,将对预览显示进行加速。
因为预览处理的这种处理方式将大大提高整个系统的效率。
这里用3个消息用于控制预览操作。
● WM_CAP_SET_PREVIEW消息(capPreview宏)可以打开或者关闭预览模式。
● WM_CAP_SET_PREVIEWRATE消息(capPreviewRate宏)可以设置预览模式下图像的帧速度。
● WM_CAP_SET_SCALE消息(capPreviewScale宏)打开或者关闭预览视频的缩放比例。
当预览和缩放比例属性都打开后,那么视频将被缩放到和捕获窗口尺寸一样大。
打开预览模式后,系统将自动关闭覆盖模式。
覆盖模式,将不占用CPU的处理资源,直接在显示器上显示视频内容。
所用的处理是有捕获设备硬件来完成。
发送WM_CAP_SET_OVERLAY消息(或capOverlay宏)给捕获窗口,可以打开覆盖模式。
打开覆盖模式后,将自动关闭预览格式。
无论是预览模式还是覆盖模式,都可以通过发送WM_CAP_SETSCROLL消息(capSetScroollPos宏),可以设置图像的在整个视频帧的滚动位置(scrollposition)。
视频格式
通过发送WM_CAP_GET_VIDEOFORMAT消息(capGetVideoFormat宏)给视频捕获窗口可以得到一个结构,在这个结构体中就包含了视频的格式、大小。
通过发送WM_CAP_SET_VIDEOFORMAT消息(capSetVideoFormat宏)给视频捕获窗口可以对视频格式进行修改设置。
YoucansettheformatofcapturedvideodatabysendingtheWM_CAP_SET_VIDEOFORMATmessage(orthecapSetVideoFormatmacro)toacapturewindow.
视频捕获设置
CAPTUREPARMS数据结构包括了视频流的控制参数。
它允许完成如下的任务:
● 指定帧速度(Framerate)。
● 指定为视频分配的缓存大小。
● 关闭或者打开音频捕获。
● 设定捕获的时间间隔。
● 指定捕获设备(MCI设备、VCR或者影碟)。
● 指定键盘或鼠标去控制结束捕获。
● 指定适用的视频类型
通过发送WM_CAP_GET_SEQENCE_SETUP消息(capCaptureGetSetup)给捕获窗体,可以获得一个CAPTUREPARMS数据结构的对象,当前视频捕获的设置信息就在这里面。
你可以改写CAPTUREPARMS对象的成员,来实现对视频捕获信息的修改。
修改后,发送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)给捕获窗体,并把这个CAPTUREPARMS对象发给捕获窗体,就可以实现修改。
音频格式
通过发送WM_CAP_GET_AUDIOFORMAT消息(capGetAudioFormat和capGetAudioFormatSize宏)给捕获窗体,你就可以获得当前的音频数据格式或音频数据结构的大小。
默认音频捕获格式是mono,8-bit,11kHzPCM。
当你使用WM_CAP_GET_AUDIOFORMAT消息得到音频格式后,通常会使用WAVEFORMATEX这个数据结构。
通过发送WM_CAP_SET_AUDIOFORMAT消息(capSetAudioFormat宏)给捕获窗体,你可以设置音频数据捕获格式。
当设置这个音频格式时,你可以通过一个指针指向一个WAVEFORMAT,WAVEFORMATEX,或者PCMWAVEFORMAT数据结构。
3.1.5捕获文件和缓存区
捕获文件名
AVICap默认,把音视频数据从捕获窗口保存到当前驱动得根目录下,文件名称为CAPTURE.AVI。
发送WM_CAP_FILE_SET_CAPTURE_FILE消息(capFileSetCaptureFile)给捕获窗体,可以改变保存的文件名。
这个消息指定文件名;它不实际创建文件,分配空间,也不能打开文件。
通过发送WM_CAP_FILE_GET_CAPTURE_FILE消息(capFileFGetCaptureFile宏)给捕获窗口,就可以得到当前文件名。
保存捕获数据到一个新文件
如果用户想保存捕获数据,把数据存到另外一个文件中。
可以使用WM_CAP_FILE_SAVEAS消息(capFileSaveAs宏)。
这个消息不能改变捕获文件的名称和内容。
你必须去指定新建的文件名,因为捕获文件将保留原来的文件名称。
为捕获文件预分配磁盘空间
在捕获操作前,先在磁盘上为捕获文件建一个指定大小的文件。
预分配空间将减少数据保存时的处理时间。
可以通过WM_CAP_FILE_ALLOCATE消息(capFileAlloc宏)来预分配一个捕获文件。
你要预分配足够大的磁盘空间去保存预计最大的捕获文件。
预分配磁盘空间没有限定捕获文件的大小。
如果捕获的数据大于了分配的空间,文件尺寸将自动变大。
对一个捕获文件进行重写数据,将对文件的已经分配的磁盘空间进行重写。
通过对捕获文件进行磁盘碎片整理可以提高捕获性能。
要对文件进行碎片整理,可以使用一个碎片整理工具来完成,比如DiskDefragmenter。
通过使用没压缩的磁盘来保存数据,同样可以提高性能。
因为在捕获期间压缩数据将对磁盘的吞吐量进行限制。
索引大小
在每个AVI文件中都会使用一个指定大小的索引去查找音视频数据块。
在一个索引的入口定位了一个视频帧或者一个波形声音的缓存器。
所以,这个索引的大小简接地限定了一个捕获文件所能保存的帧的数量上限。
通过发送WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)给捕获窗口就可以得到当前的索引大小。
这个索引大小就保存在CAPTUREPARMS数据结构对象的一个成员中(dwIndexSize)。
你可以在dwIndexSize中指定一个新的索引大小,并通过发送消息WM_CAP_SET_SEQUENCE_SETUP(capCaptureSetSetup宏)给捕获窗口完成信息设置。
索引默认大小34,952(允许32K帧和想匹配的声音缓存器).
音视频块的间隔尺寸(Granularity)
数据块的间隔尺寸是一个AVI文件的逻辑块大小。
它用于写和读音视频数据块。
当向磁盘写音视频数据时,AVICap将在每个数据块中加入一个必须的填充块(fillerchunks(RIFF"JUNK"chunks))去填充满该数据块。
你可以使用WM_CAP_GET_SEQUENC_SETUP消息(capCaptureGetSetup)去获得当前的块间隔尺寸(Granularity)。
CAPTUREPARMS的wChunkGranularity成员保存的是当前的块间隔尺寸信息。
通过对该成员的改写,并发送WM_CAP_GET_SEQUENC_SETUP消息(capCaptureSetSetup),可以对其进行修改。
你设置该参数为零的话,那么块间隔尺寸的值就为磁盘的扇区大小。
视频缓存区
这个缓存区将视频数据放在内存的堆中。
缓存区的大小可以改变,并且它的大小是由CAPTUREPARMS的wNumVideoRequested成员和系统可以的内存大小来决定。
你可以使用WM_CAP_GET_SEQUENC_SETUP消息(capCaptureGetSetup)去获得当前的视频缓存区的大小。
CAPTUREPARMS的wNumVideoRequested成员保存的是当前的缓存区尺寸。
通过对该成员的改写,并发送WM_CAP_GET_SEQUENC_SETUP消息(capCaptureSetSetup),可以对其进行修改。
音频缓存区
你可以使用下面三种方法来控制捕获的音频数据:
● 在捕获中包含音频或者不包含音频
● 按要求指定音频缓存区的大小
● Requestthataudiobuffersbeaspecificsize.
你可以使用WM_CAP_GET_SEQUENC_SETUP消息(capCaptureGetSetup)去获得当前的音频缓存区的设置。
CAPTUREPARMS的fCaptureAudio指定在这次捕获操作中是否包括对声音的捕获。
WNumAudioRequested保存当前要求的音频缓存区的大小。
dwAudioBufferSize保存当前的音频缓存区的大小。
通过对该成员的改写,并发送WM_CAP_GET_SEQUENC_SETUP消息(capCaptureSetSetup),可以对其进行修改。
fCaptureAudio默认值是TRUE。
Thedefaultbuffersize(thevalueof)cancontain0.5secondsofaudiodataor10K,whicheverisgreater.
3.1.6捕获变化
除了对基于持续时间间隔的流捕获外,AVICap还支持如下的捕获:
● 手控制帧捕获
● Still-image捕获
● 不使用磁盘存储
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 视频 捕获
![提示](https://static.bdocx.com/images/bang_tan.gif)