舞
舞鹤
Unregistered / Unconfirmed
GUEST, unregistred user!
AVIFile和视频捕捉
AVIFILE函数和宏提供了对基于时间的RIFF文件的访问,这些函数和宏管理RIFF文件,而无需管理和操作RIFF结构
AVICAP窗口类用以在应用程序中整合视频捕捉功能AVICAP为应用程序提供了简单的基于消息的窗口,用以访问视频和波形捕捉硬件,以及控制将视频捕捉到磁盘的过程。AVIFILE函数和宏处理基于时间的文件中的信息,并将其作为一个或多个数据流而不是信息块,数据流就是基于时间的文件中的组元。AVI文件中可以包含几种不同类型的数据。使用AVIFILE可以独立访问这些组件。AVIFILE函数和宏包含在动态连接库中,调用AVIFILEINIT函数可以初始化库,然后可以任意调用任何AVIFILE函数和宏,调用AVIFILEEXIT函数可以释放库,每个AVIFILEINIT调用都要有相应的AVIFILEEXIT调用
一,,AVIFILE操作
1, 打开和关闭文件
应用程序必须在读取和写入AVI文件前打开它,使用AVIFILEOPEN函数可以打开一个AVI文件
打开AVIFILE文件后,可以使用默认的文件句柄处理程序,也可以指定定制文件句柄处理程序,以读取和写入文件及其数据流。在这两种情况下,AVIFILE都搜索注册表以寻找将使用的正确文件句柄处理程序,在应用程序能访问前,必须确何注册表中存在定制文件句柄处理程序
使用AVIFILERELEASE函数能够增加文件的引用计数,比如,将文件句柄传递给其他应用程序时,就需要使用此函数
使用AVIFILERELEASE函数可以关闭文件,该函数减少AVI文件的引用计数,保存对此文件的修改,当引数为零时,AVIFILERELEASE函数将关闭文件
2, 读取文件
使用AVIINFO函数可以获取被打开文件的信息,使用AVIFILEREADDATA函数可以获取AVI文件的辅助信息
3, 写入文件
使用AVIFILEWRITEDATA函数,可以将辅助信息写入到已被打开且允许写入的文件中,此函数将信息从由应用程序提供的缓冲区中,拷贝到文件中一个或多个信息块中
4, 使用剪帖板
剪帖板提供了方便的临时存储,应用程序可以通过它来拷贝或传输AVI文件,AVIFILE提供了可与磁盘或内存文件一起使用的剪帖板功能
使用AVIPUTFILEONCLIPBOARD函数可以将文件拷贝到剪帖板中,而AVIGETFROMCLIPBOARD函数则用于将剪帖板中的文件写入到内存或磁盘中
使用AVICLEARCLIPBOARD函数可以清除剪帖板中的文件,此函数并不清除剪帖板中的其他类型的信息,如果应用程序将文件拷贝到剪帖板中,而文件中包含的流数据可能被修改,那么应该使用AVIMAKEFILEFROMSTREAMS函数创建一个’克隆’流的内存文件,然后再将此文件置于剪帖板中,并接着不经校验即释放原文件。
二,流操作
1, 打开和关闭流
使用AVIFILEGETSTREAM函数可以打开流,此函数创建了一个流接口,将流句柄置于接口中,然后返回接口指针,
使用AVISTREAMOPENFROMFILE函数打开文件和流,此函数组合了AVIFILE和AVIFILEGETSTREAM函数操作
使用AVISTREAMRELEASE函数可以关闭流,此函数减少流的引用计数,并当引用计数到达零时关闭流
2, 读取流
使用AVISTREAMINFO函数,可以获取与已打开的流的相关的信息,如果流具有相关辅助信息,可以使用AVISTREAMREADDATA函数获取这种信息,此函数将信息返回到由应用程序提供的缓冲区中。使用AVISTREAMDATASIZE宏可以获取必需的缓冲区尺寸
使用AVISTREAMREADFORMAT函数,可以获取与流相关的格式信息
使用AVISTREAMREAD函数可以获取流中的多媒体数据,此函数将原始数据从流中拷贝到由应用程序提供的缓冲区中。对于视频流,此函数获取组成帧内容的位图图像,对于音频流,此函数获取组成声音内容的波形音频采样
使用AVISTRAMbegin
STREAMING函数,可以通知这些程序准备数据流化。此函数使流化处理程序分配初始化必需的资源
使用AVISTREAMENDSTREAMING函数,可以在流化终止后通知处理程序
3, 使用流中的压缩视频数据
AVIFILE提供了多种访问压缩视频流的方式,如果想显示压缩视频流中的一个或多个帖,则可以使用AVISTREAMREAD函数获取帧,并将被压缩的帧传递给DRAWDIB函数以显示它们
DRAWDIB函数能够显示包括多个图像深度的图像,并为不能处理设备独立位图的显示器自动抖动图像,DRAWDIB函数既能处理压缩图像,也能处理非压缩图像
AVIFILE为解压缩单个视频帧提供了函数,使用AVISTREAMGETFRAMEOPEN,可以分配资源,该函数为解压的数据创建了一个缓冲区。使用AVISTREAMGETFRAME函数,可以解压缩单个视频帧,此函数解压缩帧并获取图像数据的完整帧,然后将DIB的地址返回到BITMAPINFOHEADER结构中,应用程序可以使用标准绘制函数或DRAWDIB函数来显示DIB
如果应用程序连续调用AVISTREAMGETFRAME,则该函数将使用每个被获取的帧来覆盖其缓冲区。当使用AVISTREAMGETFRAME完毕后,并且解压缩的DIB处于其缓冲区中,那么可以使用AVISTREAMGETFRAMECLOSE函数释放被分配的资源
4, 根据现存流创建文件
将现存流合并并保存到一个新文件中,为新文件提供数据的流可以驻留于内存或一个或多个文件中
使用AVISAVE函数`可以使用多个流构造文件,此函数创建一个文件,并将指定的数据流写入到该文件。AVISAVE中的流调用序列使用可变数目的参数,这些参数包含将组合入新文件的流接口
使用AVISAVEV函数也可以将数据流合并到一个新文件中。此函数的功能与AVISAVE一致。但使用AVISAVEV时,应用程序以数组的方式指定数据流。
使用AVISAVEOPTIONS函数,可以创建一个对话框提供用户选择一种压缩设置
使用GETSAVEFILENAMEPREVIEW函数,可以由用户为新文件选择文件名。
使用AVIFILERELEASE函数删除文件接口句柄。
5, 将流写入文件
使用AVIFILECREATESTREAM函数,可以在新的或现存的文件中创建一个新流,在写入流内容前,必须指定流格式。
使用AVISTREAMFORMAT函数,设置流格式
使用AVISTREAMWRITE函数,可以将多媒体内容写入到流中,此函数将原始数据从由应用程序提供的缓冲区拷贝到指定流中,默认的AVI文件处理程序将信息追加到流的末尾
使用AVIFILEWRITEDATA和AVISTREAMWRITEDATA函数,可以写入与文件相关的AVISTREAMSETFORMAT或AVIFILECREATESTREAM末包含的辅助信息
AVIFILEWRITEDATA函数可以记录整个文件可用的数据。
使用AVISTREAMRELEASE函数,可以在使用新流后关闭流
6, 在流中定位
AVIFILE提供了多种在数据流中定位和移动的方式,这些函数可以查找流的起点、长度和关键帧,此外它们还可以关联流中的时间和位置
视频捕捉
一.AVICap支持流化视频捕捉和实时单帧捕捉,此外,AVICap还提供了MCI设备频源控制,这样用户能够控制(通过应用程序)
视频源的起点和终点,以及扩充捕捉操作以包含进帧捕捉.由AVICap窗口类创建的窗口能执行以下操作
1,将音频和视频流捕捉到AVI文件中。
2动态连接和解除连接与音频输入设备。
3,覆盖或预览正在进入的视频信号。
4,指定在捕捉和将捕捉文件的内容拷贝到其他文件时使用的文件。
5,设置捕捉速率
6,显示控制视频源和格式的话框
7,创建,保存和载入调色板
8,将图像和调色板拷贝到剪贴板中
9,以DIB形式捕捉和保存单个图像
下面举个简单的例子实现简单的视频捕捉
example:
hWnd:=CapCreateCaptureWindow(‘视频捕捉’,WS_CHILD,0,0,160,120,hwndParent,nld);
SendMessage(hwnd,WM_Cap_driver_connect,0,0L);
SendMessage(hwnd,WM_Cap_sequence,0,0L);
二基本的捕捉选项。
通过修改CAPTUREPARMS结构中的捕捉参数,可以进行如下操作
1. 修改帧捕捉速度
2. 指定终止捕捉会话的键盘或鼠标控制
3. 指定捕捉会话的持续时间
下面介绍一下几个名操作
1, 捕捉速度___就是指每秒捕捉到的帧数。通过发送WM_CAP_GET_SEQUENCE_SETUP消息,可以得到当前的捕捉速度
2, 终止捕捉的键____可以允许用户通过以下方式取消捕捉机会,按下键盘中的某个键。如果用户取消了实时捕捉会话,捕捉文件的内容将被废弃。如果用户取消了步进帧的捕捉会话,取消点前的捕捉文件内容将被保存。
3, 时间限制______使用CAPTRUEPARMS结构中的flimitenabled和wtimelimit可以限制捕捉操作的持续时间
三.捕捉窗口
1, 创建捕捉窗口,使用CapCreateCaptureWindow函数
2, 将捕捉窗口连接到捕捉驱动程序,通过发送WM_CAP_DRIVER_CONNECT消息可以连接或关联捕捉窗口和捕捉驱动程序
如果系统中安装了多个捕捉设备,那么可以通过设置WM_CAP_DRIVER_CONNECT消息的mParam参数
通过发送WM_CAP_DRIVER_DISCONNECT可以解除捕捉窗口与捕捉驱动程序的连接,这时,任何已连接的视频捕捉驱动程序都将自动解除连接。
3父_子窗口的交互
某些系统级消息,像WM_PALETTECHANGED和WM_QUERYNEWPALETTE只发送给顶级和并行窗口。如果捕捉窗口为子窗口,则其父窗口必须转发这些消息。
4.捕捉窗口的状态
通过发送WM_CAP_GET_STATUS消息,可以获取捕捉窗口的当前消息。
四.音频和视频捕捉
驱动程序和底层硬件可以改变视频捕捉的某些方面
1, 发送WM_CAP_DRIVER_GET_CAPS消息可以获得当前连接的视频驱动程序的硬件性能
2, 视频对话框
每个捕捉驱动程序都能最多提供4个对话框,以控制视频数字化和捕捉进程,以及定义用以减少视频数据尺寸的压缩属性.
VIDEO SOURCE对话框控制视频输入通道和参数选择,这些会影响到数字化到帧缓存中的视频图像,此对话框枚举了将视频源连接到捕捉卡的信号类型,并为修改光度,对比度或保和度提供了控制。如果视频捕捉驱动程序支持此对话框的话那么你可以发送WM_CAP_DLG_VIDEOSOURCE消息来显示和更新它
VIDEO FORMAT对话框控制对被捕捉视频的数字化视频尺寸图像位深以及压缩选项的选择,通过发送WM_CAP_DLG_VIDEOFORMAT消息
VIDEO DISPLAY对话框控制捕捉中视频在显示器上的外观,可以通过发送WM_CAP_DLG_VIDEODISPLAY消息来显示
VIDEO COMPRESSION对话框控制捕捉视频的压缩属性,发送WM_CAP_DLG_VIDEOCOMPRESSION消息
3.预览和覆盖模式
捕捉驱动程序能够实现两种浏览引入的视频流的方法:浏览模式和覆盖模式。如果捕捉驱动程序同时实现了这两种方法,那么可以选其中一种。
其中预览模式将数字化的帧从捕捉硬件传输到系统内容中,并接着使用GDI/GDI+函数在捕捉窗口中显示数字化的帧
发下面3种消息能控制预览操作:
发送WM_CAP_SET_PREVIEW消息可以启用或禁用预览模式
发送WM_CAP_SET_PREVIEWRATE消息来设置预览模式中帧的显示速率
发送WM_CAP_SET_SCALE消息以启用或禁止预览视频的缩放
当同时启用了预览和缩放时,被捕捉的视频帧将被扩展到捕捉窗口的尺寸。启用预览模式将自动禁止覆盖模式
通过向捕捉窗口发送WM_CAP_SET_OVERLAY消息,可以启用或禁止覆盖模式,在预览或覆盖模式中,可以通过向捕捉窗口发送WM_CAP_SET_SCROLL消息来设置窗口客户区中的滚动位置。
4. 视频格式
发送WM_CAP_GET_VIDEOFORMAT消息,可以获取指定视频格式的结构或该结构的尺寸。发送WM_CAP_SET_VIDEOFORMAT消息可以设置被捕捉的视频数据的格式
5. 视频捕捉设置
CAPTUREPARMS结构中包含流化视频捕捉的控制参数此结构控制捕捉过程中的多个方面,并允许用户执行下面的任务
。指定帧速度
。指定要分配的视频缓冲数目
。禁止和启用音频捕捉
。指定捕捉的时间间隔
。指定捕捉中是否用了MCI设备
。指定终止流化的键盘或鼠标键
。指定捕捉中采用的视频平均类型
通过发送WM_CAP_GET_AUDIOFORMAT消息,可以获取CAPTUREPARMS结构中的当前捕捉设置。然后更新CAPTUREPARMS结构中的相应成员值,并接着将该结构发送给WM_CAP_SET_SEQUENCE_SETUP消息,可以修改或设置捕捉选项
6. 音频格式
发送WM_CAP_SET_GET_AUDIOFORMAT消息可以获取视频数据的捕捉格式,或视频格式结构的尺寸。视频捕捉的默认格式是单声道、8位、11KHZ PCM。当使用WM_CAP_GET_AUDIOFORMAT获取捕捉格式时,将总是使用WAVEFORMATEX结构发送WM_CAP_SET_AUDIOFORMAT消息可以设置音频数据的捕捉格式,当设置音频格式时,可以传递一个指向WAVEFORMAT,WAVEFORMATEX或PCMWAVEFORMAT结构的指针。
五.捕捉时使用的文件和缓冲区
1, 保存捕捉数据的文件名
默认下,AVICAP将视频和音频数据从捕捉窗口发送到名为capture.avi的文件中,此文件处于当前磁盘驱动器的根目录下。向捕捉窗口发送WM_CAP_FILE_SET_CAPTURE_FILE消息,可以指定其他文件名。此消息只是指定文件名,而不创建、分配或打开文件。发送WM_CAP_FILE_GET_CAPTURE_FILE消息,可以获取当前保存捕捉数据的文件名
2, 另存被捕捉的数据
如果想另存被捕捉的数据,应用程序应该发送WM_CAP_FILE_SAVEAS消息,将捕捉内容保存到其他文件中。此消息并不修改原先捕捉文件的名称和内容,应用程序必须指定新文件的名称,因为捕捉文件将保存持它的原名不变。一般来说,将为保存捕捉数据的文件预先分配预期的最大捕捉段,而可能只有其中一段会用于捕捉数据。此消息值拷贝包含捕捉数据的文件部分.
3,预分配磁盘空间
为保存捕捉数据的文件预先分配磁盘空间,将在开始捕捉操作前在磁盘中构造具有指定尺寸的文件
4.,索引尺寸
每个AVI文件都使用指定尺寸的索引,来定位文件中的视频和音频数据块。索引中的每项都定位一个视频或波形音频缓冲区。所以索引尺寸的值会间接设置文件中可捕捉的帧数上限。发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前的索引尺寸。当前的索引尺寸存储于CAPTUREPARMS结构的DWINDEXSIZE成员中,修改该成员的值,然后发送WM_CAP_SET_SEQUENCE_SETUP消息,可以将更新后的CAPTUREPARMS结构发送给捕捉窗口,从而指定新的索引尺寸
5,视频和音频的信息块尺寸
信息块尺寸是AVI文件的逻辑块尺寸,用以写入和获取音频和视频数据信息块,当把音频和视频信息块写入磁盘时,AVICAP将按需要增加填充块(RIFF”JUNK”),从而埴充每个逻辑数据块.
发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前的信息块尺寸,当前信息块尺寸存储在CAPTUREPARMS结构中的WCHUNKGRANULARITY成员中,为该成员设置了新值后,可以发送WM_CAP_SET_SEQUENCE_SETUP消息将更新后的CAPTUREPARMS结构传递给捕捉窗口,从而指定新的信息块尺寸
6,视频缓冲区
视频捕捉使用的缓冲区驻留于内存堆中。捕捉操作中使用的缓冲区数目可以不同,这取决于CAPTUREPARMS结构中的WNUMVIDEOREQUESTED成员值,以及可用的系统内存量。发送WM_CAP_GET_SEQUENCE_SETUP消息可以获得被请求的视频缓冲区数目的当前值,当前的请求的视频缓冲区数存储于CAPTUREPARMS结构中的WNUMVIEDEOREQUESTED成员中.。为该成员设置了新值后,通过发送WM_CAP_SET_SEQUENCE_SETUP消息将更新后的CAPTUREPARMS结构传递给捕捉窗口,从而指定新的视频缓冲区数
7,音频缓冲区
可以通过3种方式控制捕捉操作的音频部分
。使捕捉操作包括或排斥音频
。请求指定数目的音频缓冲区
。将音频缓冲区设置为指定尺寸
发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取音频缓冲区的设置。CAPTUREPARMS结构中的FCAPTUREAUDIO成员指定了音频是否被包括于捕捉操作中。当前请求的音频缓冲区数目存储于该结构的WNUMAUDIOREQUESTED成员中,而当前的音频缓冲区尺寸存储于DWAUDIOBUFFERSIZE成员中,设置好新值后,发送WM_CAP_SET_SEQUENCE_SETUP消息传递给捕捉窗口,从而指定新的音频捕捉设置
六.捕捉的其他类型
除了基于常量时间间隔的流化捕捉外,AVICAP还支持以下类型的捕捉
。手动帧捕捉(由程序控制被捕捉的帧)
。静态图像捕捉
。不使用磁盘存储的捕捉
。MCI设备(实时或步进帧)的流化捕捉
1, 手动捕捉帧
如果希望指定要捕捉视频流中的那一帧,则应该使用WM_CAP_SINGLE_FRAME_OPEN,WM_CAP_SINGLE_FRAME
和WM_CAP_SINGLE_FRAME_CLOSE消息来控制序列,一般来说,这些消息用于创建动画,即在捕捉文件中追加单个帧WM_CAP_SINGLE_FRAME_OPEN打开一个文件或手动驱动捕捉操作。WM_CAP_SINGLE_FRAME捕捉单个帧并将其追加到捕捉文件中。WM_CAP_SINGLE_FRAME_CLOSE。则关闭手动帧捕捉中使用的文件
2, 静态图像捕捉
如果希望将单个帧捕捉为静态图像,则可以使用WM_CAP_GRAB_FRAME_NOSTOP或WM_CAP_GRAB_FRAME消息,以将数字化图像捕捉到内部帧缓冲区。WM_CAP_GRAB_FRAME可以冻结被捕捉图像的显示。如果无需这样,则应使用WM_CAP_GRAB_FRAME_NOSTOP。
捕捉后,可以将图像拷贝出来供其他应用程序使用,发送WM_CAP_EDIT_COPY消息,可以将图像从帧缓冲区拷贝到剪帖板中。发送WM_CAP_FILE_SAVEDIB消息可以将图像从帧缓冲区拷贝为DIB,
3, 不使用磁盘存储的捕捉
发送WM_CAP_SEQUENCE_NOFILE消息,可以使用不将数据写入磁盘文件的捕捉服务。此消息只当与允许应用程序直接使用视频和音频数据的回调函数一起使用才有用。比如视频会议应用程序可能使用此消息来获取流化的视频帧,而回调函数则将被捕捉的图像传输给远程计算机。
七.高级捕捉选项
1, 衡量视频质量
衡量视频千质量的一种方式是限制操作中受损的帧数目,发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前对受损帧的限制
2, 由用户启动的捕捉
发送WM_CAP_GET_SEQUENCE_SETUP消息,可以获取用户启动的捕捉标志的当前值,设置CAPTUREPARMS结构中的FMAKEUSERHITOKTOCAPTURE成员为TURE,则可以在启动捕捉时为用户提供精确的控制
3, 使用调色板
发送WM_CAP_PAL_PASTE或WM_CAP_PAL_OPEN消息,可以获取现存调色板来替换默认的调色板,还可以发送WM_CAP_PAL_AUTOCREATE或WM_CAP_PAL_MANUALCREATE消息来创建定制调色板以替换默认调色板
发送WM_CAP_PAL_AUTOCREATE时,必须指定AVICAP采样的帧数和颜色调色板的尺寸
发送WM_CAP_PAL_SAVE消息,可以保存一个新调色板,而以后则可以通过WM_CAP_PAL_OPEN消息来获取此调色板发送WM_CAP_PAL_PASTE,消息,可以将剪贴板中的调色板粘贴到视频窗口中,捕捉窗口将调色板传递给捕捉驱动程序其它应用程序可以将调色板拷贝到剪贴板中,还可以发送WM_CAP_EDIT_COPY消息,将调色板拷贝到剪贴板中,此消息将视频剪辑缓冲区,包括调色板,拷贝到剪贴板中。
4, 在AVI文件中嵌入信息块
发送WM_CAP_FILE_SET_INFOCHUNK消息,可以将信息块插入到AVI文件中,还可以使用此消息来清除AVI文件中的信息块
5, 用户数据消息
使用WM_CAP_GET_USER_DATA和WM_CAP_SET_USER_DATA消息可以将数据关联到捕捉窗口,发送WM_CAP_GET_USER_DATA消息来、获取LONG数据值,而发送WM_CAP_SET_USER_DATA消息则可以设置LONG数据值。
八.AVICAP回调函数
应用程序可以捕捉窗口注册回调函数,以使其在状态发生变化、出现错误、视频帧和音频缓冲区可以用等情况下通知应用程序
WM_CAP_SET_CALLBACK_CAPCONTROL 精确控制捕捉开始和结束回调函数
WM_CAP_SET_CALLBACK_ERROR 指定当错误发生时调用的回调函数
WM_CAP_SET_CALLBACK_FRAME 指定预览帧被捕捉时调用的回调函数
WM_CAP_SET_CALLBACK_STATUS 指定状态发生变化时调用的回调函数
WM_CAP_SET_CALLBACK_VIDEOSTREAM指定当新视频缓存可用时调用的回调函数
WM_CAP_SET_CALLBACK_WAVESTREAM 指定当新音视频缓存可用时调用的回调函数
WM_CAP_SET_CALLBACK_YIELD指定当在流化捕捉中进行压缩时调用的回调函数
1,精确捕捉控制
捕捉窗口可以提供捕捉控制回调函数,以精确控制流化捕捉的起始和终止的时刻。在过完成所有缓冲区分配和其他捕捉准备后,从捕捉驱动程序发送回调过程的第一个消息,将NSTATE参数设置为CONTROLCALLBACK_PREROLL,此消息给予应用程序以预巻视频源的能力。回调函数接着返回录制将开始的精确时刻,如果回调函数的返回值为TRUE,则捕捉将继续,当捕捉开始时,回调函数将经常调用,并且NSTATE被设置为CONTROLCALLBACK_CAPTURING,以允许应用程序通过返回FALSE来终止捕捉
3, 缩回调函数
这种函数一般由调用PEEKMESSAGE,TRANSLATEMESSAGE和DISPATCHMESSAGE的消息循环组成,捕捉窗口为每个被捕捉的视频帧至少调用压缩回调函数一次,但是实际的次数取决于帧速率和视频驱动程序与磁盘的开销。
具体使用视频捕捉
1, 首先创建捕捉窗口
HWND=CAPCREATECAPTUREWINDOW(‘窗口名’,WS_CHILD|WS_VISIBLE,0,0,160,120,父窗口句柄,编号)
2,连接捕捉以驱动程序
下面的示例代码将句柄为HWND的捕捉窗口连接到MSVIDEO驱动程序,并接着使用CAPDRIVERDISCONNECT宏解除它们之间的连接:
FOK=SENDMESSAGE(HWND,WM_CAP_DRIVER_CONNECT,0,0L)
//还可以使用宏来连接MSVIDEO驱动程序 如:FOK=CAPDIVERCONNECT(HWND,0)
//添加代码以设置视频捕捉 CAPDRIVERDISCONNECT(HWND)
3,枚举已安装的捕捉驱动程序
使用CAPGETDRIVERDESCRIPTION函数,来获取已安装的捕捉驱动程序的名称和版本
DRIVEICENAME:STRING;
DRIVEICEVERSION:STRING;
FOR DRIVERINDEX:=0 TO 8
CAPGETDRIVERDESCRIPTION(DRIVERINDEX,DRIVERNAME,SIZEOF(DRIVERNAME),DRIVERVERSION,SIZEOF(DRIVERVERSION))
4,获取捕捉驱动程序的性能
WM_CAP_DRIVER_GET_CAPS消息将捕捉驱动程序和基研硬件的性能返回到CAPDRIVERCAPS结构中
每次应用程序将捕捉窗口连接到新的捕捉驱动程序时,都应更新CAPDRIVERCAPS结构
mycapdrivercaps:CAPDRIVERCAPS
SENDMESSAGE(HWND,WM_CAP_DRIVER_GET_CAPS,SIZEOF(CAPDRIVERCAPS),(long)@mycapdrivercaps)
5,获取捕捉窗口的状态
使用SETWINDOWPOS函数将捕捉窗口的尺寸设置为视频流的尺寸,这些信息来自由CAPGETSTATUS宏返回的CAPSTATUS结构:
mycapstatus:CAPSTATUS;
CAPGETSTATUS(HWND,@mycapstatus,sizeof(CAPSTATUS));
Setwindowpos(hwnd,null,0,0,mycapstatus.uilmagewidth,mycapstatus.uilmageheight,SWP_NOZORDER|SWP_NOMOVE);
6,显示设置视频特征的对话框
每个捕捉驱动程序都能提供3个对话框,以控制视频数字化和捕捉处理的不同方面,在显示对话框以前代码调用CAPDRIVERGETCAPS宏,并检查返回的CAPDRIVERCAPS结构以确定捕捉驱动程序是否能显示对话框,代码如下:
mycapdrivercaps:CAPDRIVERCAPS;
CAPDRIVERGETCAPS(hwnd,@mycapdrivercaps,sizeof(CAPDRIVERCAPS));
//视频源对话框
if (CAPDRIVERCAPS.FHASDLGVIDEOSOURCE) then
CAPDLGVIDEOSOURCE(HWND);
// 视频格式对话框
if (CAPDRIVERCAPS.FHASDLGVIDEOFORMAT) then
CAPDLGVIDEOFORMAT(hwnd);
// 是否存在新的图像尺寸
CAPGETSTATUS(hwnd,@capstatus,sizeof(capstatus));
//视频显示对话框
if (CAPDRIVERCAPS.FHASDLGVIDEODISPLAY) then
CAPDLGVIDEODISPLAY(HWND);
7,获取和设置视频格式
BITMAPINFO结构能容纳标准和压缩数据格式,因为它的长度可变,所以应用程序必须是应该获取当前视频格式前查询结构尺寸,可以使用CAPGETVIDEOFORMATSIZE宏来获取当前视频格式
Mybitmapinfo:BITMAPINFO;
DwsizeWORD;
Dwsize:=capgetvideoformatsize(hwnd);
Mybitmapinto:=globalallocptr(ghnd,dwsize);
Capgetvideoformat(hwnd,Mybitmapinfo,dwsize);
应用程序可以使用CAPSETVIDEOFORMAT宏或发送WM_CAP_SET_VIDEOFORMAT消息将BITMAPINFO头结构发送给捕捉窗口,因视频格式是特定于设备的,所以应用程序该检查返回值以确定格式是否可以接受
8,预览视频
可以使用CAPPREVIEWRATE宏将预览模式的帧显示速度设置为66MS/帧,并接着使用CAPPREVIEW宏将捕捉窗口预览模式中:
CAPPREVIEWRATE(HWND,66);
CAPPREVIEW(HWND,TRUE);//开始预览
CAPPREVIEW(HWND,FALSE)//禁止预览
9,启用视频覆盖
使用CAPDRIVERGETCAPS宏,以确定捕捉驱动程序是否具有覆盖性能,如果有,则此宏将启用覆盖
mycapdrivercaps:CAPDRIVERCAPS;
capdrivergetcaps(hwnd,@mycapdrivercaps,sizeof(CAPDRIVERCAPS));
if (mycapdrivercaps.fhasoverlay) then
capoverlay(hwnd,true);
10,命名捕捉文件
使用CAPFILESETCAPTUREFILE宏为捕捉文件指定了不同的文件名(exmple.avi),并使用CAPFILEALLOC宏将文件预分配5M空间
fname:string;
fname=’exmple.avi’;
capfilesetcapturefile(hwnd,fname);
capfilealloc(hwnd,(1024l*lo24l*5));
11,格式化视频捕捉
下面使用CAPSETAUDIOFORMAT将音频设置为11KHZ,8位PCM立体声:
wfex:WAVEFORMATEX;
wfex.wformattag:=WAVE_FORMAT_PCM
wfex.nchannels:=2;
wfex.nsamplespersec:=11025;
wfex.navgbytespersec:=22050;
wfex.nblockalign:=2;
wfex.wbitspersample:=8;
wfex.cbsize:=0;
CAPSETAUDIOFORMAT(HWND,@wfex,sizeof(WAVEFORMATEX));
12,修改视频捕捉设置
使用CAPCAPTUREGETSETUP和CAPCAPTURESETSETUP宏,将捕捉速度从默认值(15帧/S)修改为10帧/S
mycaptureparms:CAPTUREPARMS;
framepersec:=float;
framepersec:=10.0;
CAPCAPTUREGETSETUP(HWND,@mycaptureparms,sizeof(CAPTUREPARMS));
Captureparms.dwrequestmicrosecperfrmae:=(dword)(1.0e6/framepersec);
CAPCAPTURESETSETUP(HWND,@mycaptureparms,sizeof(CAPTUREPARMS));
13,捕捉数据
使用CAPCAPTURESEQUENCE宏启动视频捕捉,然后使用CAPFILESAVESA宏将已捕捉的数据从捕捉文件拷贝到NEWFILE.AVI中
fname:string;
fname:=’newfile.ave’;
CAPCAPTURESEQUENCE(HWND);
CAPFILESAVEAS(HWND,fname);
14,添加信息块
如果希望应用程序中除包含视频和音频外的其他信息,则可以创建信息块并将其插入到捕捉文件中,信息块可以包含各种类型的信息,下面代码将外部时间信息存储到信息块,并使用CAPFILESETINFOCHUNK宏将此块加入到捕捉文件中
cie:CAPINFOCHUNK;
cie:=infotypesmpty_time;
cie:=’00:20:30:12’;
cie:=strlen(cie.data)+1;
CAPFILESETINFOCHUNK(HWND,@cie);
15,为应用程序加入回调函数
为了得到以下事件通告,应用程序可以为视频窗口注册回调函数:状态变化、错误、视频帧和音频缓冲区可用和流化捕捉压缩。以下代码可以创建一个捕捉窗口,并在应用程序的消息处理循环中注册了状态、错误、视频和帧回调函数:
case MESSAGE OF
WM_CREATE:
Procedure callbackfunction;
Var devicename,deviceversion,bufferchar;
Drivercount:integer;
Windex,werror:word;
Menu:hmenu;
begin
Hwnd:=capcreatecapturewindow(‘mycapture’,WS_CHILD|WS_VISIBLE,0,0,160,130,(HWND)hwnd,integer(0));
Capsetcallbackonerror(hwnd,fperrorcallback);//注册错误回调函数
Capsetcallbackonstatus(hwnd,fpstatuscallback);//注册状态回调函数
Capsetcallbackonvideostream(hwnd,fpvideocallback);//注册视频流回调函数
Capsetcallbackonframe(hwnd,fpframecallback);//注册帧回调函数
end;
WM_CLOSE:
Capsetcallbackonframe(hwnd,null);
16,创建回调函数
.
AVIFILE函数和宏提供了对基于时间的RIFF文件的访问,这些函数和宏管理RIFF文件,而无需管理和操作RIFF结构
AVICAP窗口类用以在应用程序中整合视频捕捉功能AVICAP为应用程序提供了简单的基于消息的窗口,用以访问视频和波形捕捉硬件,以及控制将视频捕捉到磁盘的过程。AVIFILE函数和宏处理基于时间的文件中的信息,并将其作为一个或多个数据流而不是信息块,数据流就是基于时间的文件中的组元。AVI文件中可以包含几种不同类型的数据。使用AVIFILE可以独立访问这些组件。AVIFILE函数和宏包含在动态连接库中,调用AVIFILEINIT函数可以初始化库,然后可以任意调用任何AVIFILE函数和宏,调用AVIFILEEXIT函数可以释放库,每个AVIFILEINIT调用都要有相应的AVIFILEEXIT调用
一,,AVIFILE操作
1, 打开和关闭文件
应用程序必须在读取和写入AVI文件前打开它,使用AVIFILEOPEN函数可以打开一个AVI文件
打开AVIFILE文件后,可以使用默认的文件句柄处理程序,也可以指定定制文件句柄处理程序,以读取和写入文件及其数据流。在这两种情况下,AVIFILE都搜索注册表以寻找将使用的正确文件句柄处理程序,在应用程序能访问前,必须确何注册表中存在定制文件句柄处理程序
使用AVIFILERELEASE函数能够增加文件的引用计数,比如,将文件句柄传递给其他应用程序时,就需要使用此函数
使用AVIFILERELEASE函数可以关闭文件,该函数减少AVI文件的引用计数,保存对此文件的修改,当引数为零时,AVIFILERELEASE函数将关闭文件
2, 读取文件
使用AVIINFO函数可以获取被打开文件的信息,使用AVIFILEREADDATA函数可以获取AVI文件的辅助信息
3, 写入文件
使用AVIFILEWRITEDATA函数,可以将辅助信息写入到已被打开且允许写入的文件中,此函数将信息从由应用程序提供的缓冲区中,拷贝到文件中一个或多个信息块中
4, 使用剪帖板
剪帖板提供了方便的临时存储,应用程序可以通过它来拷贝或传输AVI文件,AVIFILE提供了可与磁盘或内存文件一起使用的剪帖板功能
使用AVIPUTFILEONCLIPBOARD函数可以将文件拷贝到剪帖板中,而AVIGETFROMCLIPBOARD函数则用于将剪帖板中的文件写入到内存或磁盘中
使用AVICLEARCLIPBOARD函数可以清除剪帖板中的文件,此函数并不清除剪帖板中的其他类型的信息,如果应用程序将文件拷贝到剪帖板中,而文件中包含的流数据可能被修改,那么应该使用AVIMAKEFILEFROMSTREAMS函数创建一个’克隆’流的内存文件,然后再将此文件置于剪帖板中,并接着不经校验即释放原文件。
二,流操作
1, 打开和关闭流
使用AVIFILEGETSTREAM函数可以打开流,此函数创建了一个流接口,将流句柄置于接口中,然后返回接口指针,
使用AVISTREAMOPENFROMFILE函数打开文件和流,此函数组合了AVIFILE和AVIFILEGETSTREAM函数操作
使用AVISTREAMRELEASE函数可以关闭流,此函数减少流的引用计数,并当引用计数到达零时关闭流
2, 读取流
使用AVISTREAMINFO函数,可以获取与已打开的流的相关的信息,如果流具有相关辅助信息,可以使用AVISTREAMREADDATA函数获取这种信息,此函数将信息返回到由应用程序提供的缓冲区中。使用AVISTREAMDATASIZE宏可以获取必需的缓冲区尺寸
使用AVISTREAMREADFORMAT函数,可以获取与流相关的格式信息
使用AVISTREAMREAD函数可以获取流中的多媒体数据,此函数将原始数据从流中拷贝到由应用程序提供的缓冲区中。对于视频流,此函数获取组成帧内容的位图图像,对于音频流,此函数获取组成声音内容的波形音频采样
使用AVISTRAMbegin
STREAMING函数,可以通知这些程序准备数据流化。此函数使流化处理程序分配初始化必需的资源
使用AVISTREAMENDSTREAMING函数,可以在流化终止后通知处理程序
3, 使用流中的压缩视频数据
AVIFILE提供了多种访问压缩视频流的方式,如果想显示压缩视频流中的一个或多个帖,则可以使用AVISTREAMREAD函数获取帧,并将被压缩的帧传递给DRAWDIB函数以显示它们
DRAWDIB函数能够显示包括多个图像深度的图像,并为不能处理设备独立位图的显示器自动抖动图像,DRAWDIB函数既能处理压缩图像,也能处理非压缩图像
AVIFILE为解压缩单个视频帧提供了函数,使用AVISTREAMGETFRAMEOPEN,可以分配资源,该函数为解压的数据创建了一个缓冲区。使用AVISTREAMGETFRAME函数,可以解压缩单个视频帧,此函数解压缩帧并获取图像数据的完整帧,然后将DIB的地址返回到BITMAPINFOHEADER结构中,应用程序可以使用标准绘制函数或DRAWDIB函数来显示DIB
如果应用程序连续调用AVISTREAMGETFRAME,则该函数将使用每个被获取的帧来覆盖其缓冲区。当使用AVISTREAMGETFRAME完毕后,并且解压缩的DIB处于其缓冲区中,那么可以使用AVISTREAMGETFRAMECLOSE函数释放被分配的资源
4, 根据现存流创建文件
将现存流合并并保存到一个新文件中,为新文件提供数据的流可以驻留于内存或一个或多个文件中
使用AVISAVE函数`可以使用多个流构造文件,此函数创建一个文件,并将指定的数据流写入到该文件。AVISAVE中的流调用序列使用可变数目的参数,这些参数包含将组合入新文件的流接口
使用AVISAVEV函数也可以将数据流合并到一个新文件中。此函数的功能与AVISAVE一致。但使用AVISAVEV时,应用程序以数组的方式指定数据流。
使用AVISAVEOPTIONS函数,可以创建一个对话框提供用户选择一种压缩设置
使用GETSAVEFILENAMEPREVIEW函数,可以由用户为新文件选择文件名。
使用AVIFILERELEASE函数删除文件接口句柄。
5, 将流写入文件
使用AVIFILECREATESTREAM函数,可以在新的或现存的文件中创建一个新流,在写入流内容前,必须指定流格式。
使用AVISTREAMFORMAT函数,设置流格式
使用AVISTREAMWRITE函数,可以将多媒体内容写入到流中,此函数将原始数据从由应用程序提供的缓冲区拷贝到指定流中,默认的AVI文件处理程序将信息追加到流的末尾
使用AVIFILEWRITEDATA和AVISTREAMWRITEDATA函数,可以写入与文件相关的AVISTREAMSETFORMAT或AVIFILECREATESTREAM末包含的辅助信息
AVIFILEWRITEDATA函数可以记录整个文件可用的数据。
使用AVISTREAMRELEASE函数,可以在使用新流后关闭流
6, 在流中定位
AVIFILE提供了多种在数据流中定位和移动的方式,这些函数可以查找流的起点、长度和关键帧,此外它们还可以关联流中的时间和位置
视频捕捉
一.AVICap支持流化视频捕捉和实时单帧捕捉,此外,AVICap还提供了MCI设备频源控制,这样用户能够控制(通过应用程序)
视频源的起点和终点,以及扩充捕捉操作以包含进帧捕捉.由AVICap窗口类创建的窗口能执行以下操作
1,将音频和视频流捕捉到AVI文件中。
2动态连接和解除连接与音频输入设备。
3,覆盖或预览正在进入的视频信号。
4,指定在捕捉和将捕捉文件的内容拷贝到其他文件时使用的文件。
5,设置捕捉速率
6,显示控制视频源和格式的话框
7,创建,保存和载入调色板
8,将图像和调色板拷贝到剪贴板中
9,以DIB形式捕捉和保存单个图像
下面举个简单的例子实现简单的视频捕捉
example:
hWnd:=CapCreateCaptureWindow(‘视频捕捉’,WS_CHILD,0,0,160,120,hwndParent,nld);
SendMessage(hwnd,WM_Cap_driver_connect,0,0L);
SendMessage(hwnd,WM_Cap_sequence,0,0L);
二基本的捕捉选项。
通过修改CAPTUREPARMS结构中的捕捉参数,可以进行如下操作
1. 修改帧捕捉速度
2. 指定终止捕捉会话的键盘或鼠标控制
3. 指定捕捉会话的持续时间
下面介绍一下几个名操作
1, 捕捉速度___就是指每秒捕捉到的帧数。通过发送WM_CAP_GET_SEQUENCE_SETUP消息,可以得到当前的捕捉速度
2, 终止捕捉的键____可以允许用户通过以下方式取消捕捉机会,按下键盘中的某个键。如果用户取消了实时捕捉会话,捕捉文件的内容将被废弃。如果用户取消了步进帧的捕捉会话,取消点前的捕捉文件内容将被保存。
3, 时间限制______使用CAPTRUEPARMS结构中的flimitenabled和wtimelimit可以限制捕捉操作的持续时间
三.捕捉窗口
1, 创建捕捉窗口,使用CapCreateCaptureWindow函数
2, 将捕捉窗口连接到捕捉驱动程序,通过发送WM_CAP_DRIVER_CONNECT消息可以连接或关联捕捉窗口和捕捉驱动程序
如果系统中安装了多个捕捉设备,那么可以通过设置WM_CAP_DRIVER_CONNECT消息的mParam参数
通过发送WM_CAP_DRIVER_DISCONNECT可以解除捕捉窗口与捕捉驱动程序的连接,这时,任何已连接的视频捕捉驱动程序都将自动解除连接。
3父_子窗口的交互
某些系统级消息,像WM_PALETTECHANGED和WM_QUERYNEWPALETTE只发送给顶级和并行窗口。如果捕捉窗口为子窗口,则其父窗口必须转发这些消息。
4.捕捉窗口的状态
通过发送WM_CAP_GET_STATUS消息,可以获取捕捉窗口的当前消息。
四.音频和视频捕捉
驱动程序和底层硬件可以改变视频捕捉的某些方面
1, 发送WM_CAP_DRIVER_GET_CAPS消息可以获得当前连接的视频驱动程序的硬件性能
2, 视频对话框
每个捕捉驱动程序都能最多提供4个对话框,以控制视频数字化和捕捉进程,以及定义用以减少视频数据尺寸的压缩属性.
VIDEO SOURCE对话框控制视频输入通道和参数选择,这些会影响到数字化到帧缓存中的视频图像,此对话框枚举了将视频源连接到捕捉卡的信号类型,并为修改光度,对比度或保和度提供了控制。如果视频捕捉驱动程序支持此对话框的话那么你可以发送WM_CAP_DLG_VIDEOSOURCE消息来显示和更新它
VIDEO FORMAT对话框控制对被捕捉视频的数字化视频尺寸图像位深以及压缩选项的选择,通过发送WM_CAP_DLG_VIDEOFORMAT消息
VIDEO DISPLAY对话框控制捕捉中视频在显示器上的外观,可以通过发送WM_CAP_DLG_VIDEODISPLAY消息来显示
VIDEO COMPRESSION对话框控制捕捉视频的压缩属性,发送WM_CAP_DLG_VIDEOCOMPRESSION消息
3.预览和覆盖模式
捕捉驱动程序能够实现两种浏览引入的视频流的方法:浏览模式和覆盖模式。如果捕捉驱动程序同时实现了这两种方法,那么可以选其中一种。
其中预览模式将数字化的帧从捕捉硬件传输到系统内容中,并接着使用GDI/GDI+函数在捕捉窗口中显示数字化的帧
发下面3种消息能控制预览操作:
发送WM_CAP_SET_PREVIEW消息可以启用或禁用预览模式
发送WM_CAP_SET_PREVIEWRATE消息来设置预览模式中帧的显示速率
发送WM_CAP_SET_SCALE消息以启用或禁止预览视频的缩放
当同时启用了预览和缩放时,被捕捉的视频帧将被扩展到捕捉窗口的尺寸。启用预览模式将自动禁止覆盖模式
通过向捕捉窗口发送WM_CAP_SET_OVERLAY消息,可以启用或禁止覆盖模式,在预览或覆盖模式中,可以通过向捕捉窗口发送WM_CAP_SET_SCROLL消息来设置窗口客户区中的滚动位置。
4. 视频格式
发送WM_CAP_GET_VIDEOFORMAT消息,可以获取指定视频格式的结构或该结构的尺寸。发送WM_CAP_SET_VIDEOFORMAT消息可以设置被捕捉的视频数据的格式
5. 视频捕捉设置
CAPTUREPARMS结构中包含流化视频捕捉的控制参数此结构控制捕捉过程中的多个方面,并允许用户执行下面的任务
。指定帧速度
。指定要分配的视频缓冲数目
。禁止和启用音频捕捉
。指定捕捉的时间间隔
。指定捕捉中是否用了MCI设备
。指定终止流化的键盘或鼠标键
。指定捕捉中采用的视频平均类型
通过发送WM_CAP_GET_AUDIOFORMAT消息,可以获取CAPTUREPARMS结构中的当前捕捉设置。然后更新CAPTUREPARMS结构中的相应成员值,并接着将该结构发送给WM_CAP_SET_SEQUENCE_SETUP消息,可以修改或设置捕捉选项
6. 音频格式
发送WM_CAP_SET_GET_AUDIOFORMAT消息可以获取视频数据的捕捉格式,或视频格式结构的尺寸。视频捕捉的默认格式是单声道、8位、11KHZ PCM。当使用WM_CAP_GET_AUDIOFORMAT获取捕捉格式时,将总是使用WAVEFORMATEX结构发送WM_CAP_SET_AUDIOFORMAT消息可以设置音频数据的捕捉格式,当设置音频格式时,可以传递一个指向WAVEFORMAT,WAVEFORMATEX或PCMWAVEFORMAT结构的指针。
五.捕捉时使用的文件和缓冲区
1, 保存捕捉数据的文件名
默认下,AVICAP将视频和音频数据从捕捉窗口发送到名为capture.avi的文件中,此文件处于当前磁盘驱动器的根目录下。向捕捉窗口发送WM_CAP_FILE_SET_CAPTURE_FILE消息,可以指定其他文件名。此消息只是指定文件名,而不创建、分配或打开文件。发送WM_CAP_FILE_GET_CAPTURE_FILE消息,可以获取当前保存捕捉数据的文件名
2, 另存被捕捉的数据
如果想另存被捕捉的数据,应用程序应该发送WM_CAP_FILE_SAVEAS消息,将捕捉内容保存到其他文件中。此消息并不修改原先捕捉文件的名称和内容,应用程序必须指定新文件的名称,因为捕捉文件将保存持它的原名不变。一般来说,将为保存捕捉数据的文件预先分配预期的最大捕捉段,而可能只有其中一段会用于捕捉数据。此消息值拷贝包含捕捉数据的文件部分.
3,预分配磁盘空间
为保存捕捉数据的文件预先分配磁盘空间,将在开始捕捉操作前在磁盘中构造具有指定尺寸的文件
4.,索引尺寸
每个AVI文件都使用指定尺寸的索引,来定位文件中的视频和音频数据块。索引中的每项都定位一个视频或波形音频缓冲区。所以索引尺寸的值会间接设置文件中可捕捉的帧数上限。发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前的索引尺寸。当前的索引尺寸存储于CAPTUREPARMS结构的DWINDEXSIZE成员中,修改该成员的值,然后发送WM_CAP_SET_SEQUENCE_SETUP消息,可以将更新后的CAPTUREPARMS结构发送给捕捉窗口,从而指定新的索引尺寸
5,视频和音频的信息块尺寸
信息块尺寸是AVI文件的逻辑块尺寸,用以写入和获取音频和视频数据信息块,当把音频和视频信息块写入磁盘时,AVICAP将按需要增加填充块(RIFF”JUNK”),从而埴充每个逻辑数据块.
发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前的信息块尺寸,当前信息块尺寸存储在CAPTUREPARMS结构中的WCHUNKGRANULARITY成员中,为该成员设置了新值后,可以发送WM_CAP_SET_SEQUENCE_SETUP消息将更新后的CAPTUREPARMS结构传递给捕捉窗口,从而指定新的信息块尺寸
6,视频缓冲区
视频捕捉使用的缓冲区驻留于内存堆中。捕捉操作中使用的缓冲区数目可以不同,这取决于CAPTUREPARMS结构中的WNUMVIDEOREQUESTED成员值,以及可用的系统内存量。发送WM_CAP_GET_SEQUENCE_SETUP消息可以获得被请求的视频缓冲区数目的当前值,当前的请求的视频缓冲区数存储于CAPTUREPARMS结构中的WNUMVIEDEOREQUESTED成员中.。为该成员设置了新值后,通过发送WM_CAP_SET_SEQUENCE_SETUP消息将更新后的CAPTUREPARMS结构传递给捕捉窗口,从而指定新的视频缓冲区数
7,音频缓冲区
可以通过3种方式控制捕捉操作的音频部分
。使捕捉操作包括或排斥音频
。请求指定数目的音频缓冲区
。将音频缓冲区设置为指定尺寸
发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取音频缓冲区的设置。CAPTUREPARMS结构中的FCAPTUREAUDIO成员指定了音频是否被包括于捕捉操作中。当前请求的音频缓冲区数目存储于该结构的WNUMAUDIOREQUESTED成员中,而当前的音频缓冲区尺寸存储于DWAUDIOBUFFERSIZE成员中,设置好新值后,发送WM_CAP_SET_SEQUENCE_SETUP消息传递给捕捉窗口,从而指定新的音频捕捉设置
六.捕捉的其他类型
除了基于常量时间间隔的流化捕捉外,AVICAP还支持以下类型的捕捉
。手动帧捕捉(由程序控制被捕捉的帧)
。静态图像捕捉
。不使用磁盘存储的捕捉
。MCI设备(实时或步进帧)的流化捕捉
1, 手动捕捉帧
如果希望指定要捕捉视频流中的那一帧,则应该使用WM_CAP_SINGLE_FRAME_OPEN,WM_CAP_SINGLE_FRAME
和WM_CAP_SINGLE_FRAME_CLOSE消息来控制序列,一般来说,这些消息用于创建动画,即在捕捉文件中追加单个帧WM_CAP_SINGLE_FRAME_OPEN打开一个文件或手动驱动捕捉操作。WM_CAP_SINGLE_FRAME捕捉单个帧并将其追加到捕捉文件中。WM_CAP_SINGLE_FRAME_CLOSE。则关闭手动帧捕捉中使用的文件
2, 静态图像捕捉
如果希望将单个帧捕捉为静态图像,则可以使用WM_CAP_GRAB_FRAME_NOSTOP或WM_CAP_GRAB_FRAME消息,以将数字化图像捕捉到内部帧缓冲区。WM_CAP_GRAB_FRAME可以冻结被捕捉图像的显示。如果无需这样,则应使用WM_CAP_GRAB_FRAME_NOSTOP。
捕捉后,可以将图像拷贝出来供其他应用程序使用,发送WM_CAP_EDIT_COPY消息,可以将图像从帧缓冲区拷贝到剪帖板中。发送WM_CAP_FILE_SAVEDIB消息可以将图像从帧缓冲区拷贝为DIB,
3, 不使用磁盘存储的捕捉
发送WM_CAP_SEQUENCE_NOFILE消息,可以使用不将数据写入磁盘文件的捕捉服务。此消息只当与允许应用程序直接使用视频和音频数据的回调函数一起使用才有用。比如视频会议应用程序可能使用此消息来获取流化的视频帧,而回调函数则将被捕捉的图像传输给远程计算机。
七.高级捕捉选项
1, 衡量视频质量
衡量视频千质量的一种方式是限制操作中受损的帧数目,发送WM_CAP_GET_SEQUENCE_SETUP消息可以获取当前对受损帧的限制
2, 由用户启动的捕捉
发送WM_CAP_GET_SEQUENCE_SETUP消息,可以获取用户启动的捕捉标志的当前值,设置CAPTUREPARMS结构中的FMAKEUSERHITOKTOCAPTURE成员为TURE,则可以在启动捕捉时为用户提供精确的控制
3, 使用调色板
发送WM_CAP_PAL_PASTE或WM_CAP_PAL_OPEN消息,可以获取现存调色板来替换默认的调色板,还可以发送WM_CAP_PAL_AUTOCREATE或WM_CAP_PAL_MANUALCREATE消息来创建定制调色板以替换默认调色板
发送WM_CAP_PAL_AUTOCREATE时,必须指定AVICAP采样的帧数和颜色调色板的尺寸
发送WM_CAP_PAL_SAVE消息,可以保存一个新调色板,而以后则可以通过WM_CAP_PAL_OPEN消息来获取此调色板发送WM_CAP_PAL_PASTE,消息,可以将剪贴板中的调色板粘贴到视频窗口中,捕捉窗口将调色板传递给捕捉驱动程序其它应用程序可以将调色板拷贝到剪贴板中,还可以发送WM_CAP_EDIT_COPY消息,将调色板拷贝到剪贴板中,此消息将视频剪辑缓冲区,包括调色板,拷贝到剪贴板中。
4, 在AVI文件中嵌入信息块
发送WM_CAP_FILE_SET_INFOCHUNK消息,可以将信息块插入到AVI文件中,还可以使用此消息来清除AVI文件中的信息块
5, 用户数据消息
使用WM_CAP_GET_USER_DATA和WM_CAP_SET_USER_DATA消息可以将数据关联到捕捉窗口,发送WM_CAP_GET_USER_DATA消息来、获取LONG数据值,而发送WM_CAP_SET_USER_DATA消息则可以设置LONG数据值。
八.AVICAP回调函数
应用程序可以捕捉窗口注册回调函数,以使其在状态发生变化、出现错误、视频帧和音频缓冲区可以用等情况下通知应用程序
WM_CAP_SET_CALLBACK_CAPCONTROL 精确控制捕捉开始和结束回调函数
WM_CAP_SET_CALLBACK_ERROR 指定当错误发生时调用的回调函数
WM_CAP_SET_CALLBACK_FRAME 指定预览帧被捕捉时调用的回调函数
WM_CAP_SET_CALLBACK_STATUS 指定状态发生变化时调用的回调函数
WM_CAP_SET_CALLBACK_VIDEOSTREAM指定当新视频缓存可用时调用的回调函数
WM_CAP_SET_CALLBACK_WAVESTREAM 指定当新音视频缓存可用时调用的回调函数
WM_CAP_SET_CALLBACK_YIELD指定当在流化捕捉中进行压缩时调用的回调函数
1,精确捕捉控制
捕捉窗口可以提供捕捉控制回调函数,以精确控制流化捕捉的起始和终止的时刻。在过完成所有缓冲区分配和其他捕捉准备后,从捕捉驱动程序发送回调过程的第一个消息,将NSTATE参数设置为CONTROLCALLBACK_PREROLL,此消息给予应用程序以预巻视频源的能力。回调函数接着返回录制将开始的精确时刻,如果回调函数的返回值为TRUE,则捕捉将继续,当捕捉开始时,回调函数将经常调用,并且NSTATE被设置为CONTROLCALLBACK_CAPTURING,以允许应用程序通过返回FALSE来终止捕捉
3, 缩回调函数
这种函数一般由调用PEEKMESSAGE,TRANSLATEMESSAGE和DISPATCHMESSAGE的消息循环组成,捕捉窗口为每个被捕捉的视频帧至少调用压缩回调函数一次,但是实际的次数取决于帧速率和视频驱动程序与磁盘的开销。
具体使用视频捕捉
1, 首先创建捕捉窗口
HWND=CAPCREATECAPTUREWINDOW(‘窗口名’,WS_CHILD|WS_VISIBLE,0,0,160,120,父窗口句柄,编号)
2,连接捕捉以驱动程序
下面的示例代码将句柄为HWND的捕捉窗口连接到MSVIDEO驱动程序,并接着使用CAPDRIVERDISCONNECT宏解除它们之间的连接:
FOK=SENDMESSAGE(HWND,WM_CAP_DRIVER_CONNECT,0,0L)
//还可以使用宏来连接MSVIDEO驱动程序 如:FOK=CAPDIVERCONNECT(HWND,0)
//添加代码以设置视频捕捉 CAPDRIVERDISCONNECT(HWND)
3,枚举已安装的捕捉驱动程序
使用CAPGETDRIVERDESCRIPTION函数,来获取已安装的捕捉驱动程序的名称和版本
DRIVEICENAME:STRING;
DRIVEICEVERSION:STRING;
FOR DRIVERINDEX:=0 TO 8
CAPGETDRIVERDESCRIPTION(DRIVERINDEX,DRIVERNAME,SIZEOF(DRIVERNAME),DRIVERVERSION,SIZEOF(DRIVERVERSION))
4,获取捕捉驱动程序的性能
WM_CAP_DRIVER_GET_CAPS消息将捕捉驱动程序和基研硬件的性能返回到CAPDRIVERCAPS结构中
每次应用程序将捕捉窗口连接到新的捕捉驱动程序时,都应更新CAPDRIVERCAPS结构
mycapdrivercaps:CAPDRIVERCAPS
SENDMESSAGE(HWND,WM_CAP_DRIVER_GET_CAPS,SIZEOF(CAPDRIVERCAPS),(long)@mycapdrivercaps)
5,获取捕捉窗口的状态
使用SETWINDOWPOS函数将捕捉窗口的尺寸设置为视频流的尺寸,这些信息来自由CAPGETSTATUS宏返回的CAPSTATUS结构:
mycapstatus:CAPSTATUS;
CAPGETSTATUS(HWND,@mycapstatus,sizeof(CAPSTATUS));
Setwindowpos(hwnd,null,0,0,mycapstatus.uilmagewidth,mycapstatus.uilmageheight,SWP_NOZORDER|SWP_NOMOVE);
6,显示设置视频特征的对话框
每个捕捉驱动程序都能提供3个对话框,以控制视频数字化和捕捉处理的不同方面,在显示对话框以前代码调用CAPDRIVERGETCAPS宏,并检查返回的CAPDRIVERCAPS结构以确定捕捉驱动程序是否能显示对话框,代码如下:
mycapdrivercaps:CAPDRIVERCAPS;
CAPDRIVERGETCAPS(hwnd,@mycapdrivercaps,sizeof(CAPDRIVERCAPS));
//视频源对话框
if (CAPDRIVERCAPS.FHASDLGVIDEOSOURCE) then
CAPDLGVIDEOSOURCE(HWND);
// 视频格式对话框
if (CAPDRIVERCAPS.FHASDLGVIDEOFORMAT) then
CAPDLGVIDEOFORMAT(hwnd);
// 是否存在新的图像尺寸
CAPGETSTATUS(hwnd,@capstatus,sizeof(capstatus));
//视频显示对话框
if (CAPDRIVERCAPS.FHASDLGVIDEODISPLAY) then
CAPDLGVIDEODISPLAY(HWND);
7,获取和设置视频格式
BITMAPINFO结构能容纳标准和压缩数据格式,因为它的长度可变,所以应用程序必须是应该获取当前视频格式前查询结构尺寸,可以使用CAPGETVIDEOFORMATSIZE宏来获取当前视频格式
Mybitmapinfo:BITMAPINFO;
DwsizeWORD;
Dwsize:=capgetvideoformatsize(hwnd);
Mybitmapinto:=globalallocptr(ghnd,dwsize);
Capgetvideoformat(hwnd,Mybitmapinfo,dwsize);
应用程序可以使用CAPSETVIDEOFORMAT宏或发送WM_CAP_SET_VIDEOFORMAT消息将BITMAPINFO头结构发送给捕捉窗口,因视频格式是特定于设备的,所以应用程序该检查返回值以确定格式是否可以接受
8,预览视频
可以使用CAPPREVIEWRATE宏将预览模式的帧显示速度设置为66MS/帧,并接着使用CAPPREVIEW宏将捕捉窗口预览模式中:
CAPPREVIEWRATE(HWND,66);
CAPPREVIEW(HWND,TRUE);//开始预览
CAPPREVIEW(HWND,FALSE)//禁止预览
9,启用视频覆盖
使用CAPDRIVERGETCAPS宏,以确定捕捉驱动程序是否具有覆盖性能,如果有,则此宏将启用覆盖
mycapdrivercaps:CAPDRIVERCAPS;
capdrivergetcaps(hwnd,@mycapdrivercaps,sizeof(CAPDRIVERCAPS));
if (mycapdrivercaps.fhasoverlay) then
capoverlay(hwnd,true);
10,命名捕捉文件
使用CAPFILESETCAPTUREFILE宏为捕捉文件指定了不同的文件名(exmple.avi),并使用CAPFILEALLOC宏将文件预分配5M空间
fname:string;
fname=’exmple.avi’;
capfilesetcapturefile(hwnd,fname);
capfilealloc(hwnd,(1024l*lo24l*5));
11,格式化视频捕捉
下面使用CAPSETAUDIOFORMAT将音频设置为11KHZ,8位PCM立体声:
wfex:WAVEFORMATEX;
wfex.wformattag:=WAVE_FORMAT_PCM
wfex.nchannels:=2;
wfex.nsamplespersec:=11025;
wfex.navgbytespersec:=22050;
wfex.nblockalign:=2;
wfex.wbitspersample:=8;
wfex.cbsize:=0;
CAPSETAUDIOFORMAT(HWND,@wfex,sizeof(WAVEFORMATEX));
12,修改视频捕捉设置
使用CAPCAPTUREGETSETUP和CAPCAPTURESETSETUP宏,将捕捉速度从默认值(15帧/S)修改为10帧/S
mycaptureparms:CAPTUREPARMS;
framepersec:=float;
framepersec:=10.0;
CAPCAPTUREGETSETUP(HWND,@mycaptureparms,sizeof(CAPTUREPARMS));
Captureparms.dwrequestmicrosecperfrmae:=(dword)(1.0e6/framepersec);
CAPCAPTURESETSETUP(HWND,@mycaptureparms,sizeof(CAPTUREPARMS));
13,捕捉数据
使用CAPCAPTURESEQUENCE宏启动视频捕捉,然后使用CAPFILESAVESA宏将已捕捉的数据从捕捉文件拷贝到NEWFILE.AVI中
fname:string;
fname:=’newfile.ave’;
CAPCAPTURESEQUENCE(HWND);
CAPFILESAVEAS(HWND,fname);
14,添加信息块
如果希望应用程序中除包含视频和音频外的其他信息,则可以创建信息块并将其插入到捕捉文件中,信息块可以包含各种类型的信息,下面代码将外部时间信息存储到信息块,并使用CAPFILESETINFOCHUNK宏将此块加入到捕捉文件中
cie:CAPINFOCHUNK;
cie:=infotypesmpty_time;
cie:=’00:20:30:12’;
cie:=strlen(cie.data)+1;
CAPFILESETINFOCHUNK(HWND,@cie);
15,为应用程序加入回调函数
为了得到以下事件通告,应用程序可以为视频窗口注册回调函数:状态变化、错误、视频帧和音频缓冲区可用和流化捕捉压缩。以下代码可以创建一个捕捉窗口,并在应用程序的消息处理循环中注册了状态、错误、视频和帧回调函数:
case MESSAGE OF
WM_CREATE:
Procedure callbackfunction;
Var devicename,deviceversion,bufferchar;
Drivercount:integer;
Windex,werror:word;
Menu:hmenu;
begin
Hwnd:=capcreatecapturewindow(‘mycapture’,WS_CHILD|WS_VISIBLE,0,0,160,130,(HWND)hwnd,integer(0));
Capsetcallbackonerror(hwnd,fperrorcallback);//注册错误回调函数
Capsetcallbackonstatus(hwnd,fpstatuscallback);//注册状态回调函数
Capsetcallbackonvideostream(hwnd,fpvideocallback);//注册视频流回调函数
Capsetcallbackonframe(hwnd,fpframecallback);//注册帧回调函数
end;
WM_CLOSE:
Capsetcallbackonframe(hwnd,null);
16,创建回调函数
.