父子窗体交付
一些系统级的消息,比如 WM_PALETTECHANGED、WM_QUERYNEWPALETTE,只被发送到顶层(top-level)和overlapped窗口。如果一个捕获窗体是一个资窗体,那它的父窗口应该来转寄这些消息。
同样地,假如父窗口尺寸改变了,它可能需要发送一个通知消息给捕获窗口。相反,如果捕获视频尺寸变化了,捕获窗口可能需要发一个通知消息给父窗口。最简单的管理方法是让捕获窗口的尺寸等于捕获视频流的尺寸,随时把改变的尺寸告诉给父窗口。
捕获窗体状态
通过发送WM_CAP_GET_STATUS消息(capGetStatus宏),可以获得当前捕获窗口的状态。这个消息得到一个CAPSTATUS结构体的拷贝,状态信息就在这个结构体的成员中。
CAPSTATUS
结构体包含了图形尺寸大小、滚动位置(scroll position)、是否覆盖(overlay)或者预览(preview)等信息。因为在CAPSTATUS
中的信息是动态的,你的应用程序应该随时去刷新这个结构体中的内容。
改变捕获窗口的尺寸对实际的视频流的尺寸没有影响。
视频捕获可以做这几个方面的工作:访问
视频源、显示选项、格式和压缩选项。音频捕获包括指定音频格式和选择压缩方式。
捕获驱动性能
通过发送WM_CAP_DRIVER_GET_CAPS消息(capDriverGetCaps宏),可以获得当前连接的捕获设备的性能。发送该消息后,会返回一个CAPDRIVERCAPS结构的对象。设备的性能信息,就在这个对象中。
视频对话框(Video
Dialog Boxes)
每个捕获设备的驱动程序都可以为控制视频信号和捕获处理和视频压缩提供4个对话框。这些对话框中的内容都是视频捕获驱动程序定义的。
视频源对话框(Video
Source dialog box)用于选择视频输入通道和视频图像的动态参数。
它可以列举出当前连接视频设备的信号类型(SVHS和复合类型),并且可以通过该对话框去修改图像的色调、亮度、饱和度。你可以通过使用WM_CAP_DLG_VIDEOSOURCE
消息 (或 capDlgVideoSource 宏)来显示和刷新这个窗口。
视频格式对话框(Video Format dialog
box)用于选择数字视频的框架大小和视频图像的色深,以及捕获视频图像的压缩格式。你可以通过使用WM_CAP_DLG_VIDEOFORMAT消息
(或 capDlgVideoFormat宏)来显示和刷新这个窗口。
视频显示对话框(Video
Display dialog
box)用于控制视频外观。在该对话框上进行了修改只是对视频显示起作用,对于实际的视频数据是不会造成改变的。比如,可以改变显示的颜色,饱和度等等....。你可以通过使用WM_CAP_DLG_VIDEODISPLAY消息
(或 capDlgVideoDisplay宏)来显示和刷新这个窗口。
视频压缩对话框(Video
Compression dialog
box)用于设置视频压缩的格式。通过使用WM_CAP_DLG_VIDEOCOMPRESSION消息
(或 capDlgVideoCompression宏)来显示和刷新这个窗口。
预览和覆盖模式 (Preview and Overlay )
一般,一个捕获驱动提供两种方式来观看输入的视频流:预览模式和覆盖模式。如果捕获驱动可以提供上面两种模式,那么用户就可以选择其中的模式来使用。
预览模式从捕获设备硬件传输数据帧到系统的内存中,并且在捕获窗口中使用GDI函数来显示这些数据帧。当捕获窗口的父窗体失去焦点的时候,在应用程序的视频预览的数据将变慢,如果父窗体获的焦点后,将对预览显示进行加速。因为预览处理的这种处理方式将大大提高整个系统的效率。
这里用3个消息用于控制预览操作。
l WM_CAP_SET_PREVIEW消息(capPreview宏)可以打开或者关闭预览模式。
l WM_CAP_SET_PREVIEWRATE 消息(capPreviewRate宏)可以设置预览模式下图像的帧速度。
l WM_CAP_SET_SCALE
消息 (capPreviewScale
宏)
打开或者关闭预览视频的缩放比例。
当预览和缩放比例属性都打开后,那么视频将被缩放到和捕获窗口尺寸一样大。打开预览模式后,系统将自动关闭覆盖模式。
覆盖模式,将不占用CPU的处理资源,直接在显示器上显示视频内容。所用的处理是有捕获设备硬件来完成。发送WM_CAP_SET_OVERLAY消息(或capOverlay宏)给捕获窗口,可以打开覆盖模式。打开覆盖模式后,将自动关闭预览格式。
无论是预览模式还是覆盖模式,都可以通过发送WM_CAP_SETSCROLL消息(capSetScroollPos宏),可以设置图像的在整个视频帧的滚动位置(scroll
position)。
视频格式
通过发送WM_CAP_GET_VIDEOFORMAT消息(capGetVideoFormat宏)给视频捕获窗口可以得到一个结构,在这个结构体中就包含了视频的格式、大小。
通过发送WM_CAP_SET_VIDEOFORMAT消息(capSetVideoFormat宏)给视频捕获窗口可以对视频格式进行修改设置。
You can set the format of
captured video data by sending the WM_CAP_SET_VIDEOFORMAT
message (or the
capSetVideoFormat macro) to a capture window.
视频捕获设置
CAPTUREPARMS
数据结构包括了视频流的控制参数。它允许完成如下的任务:
l 指定帧速度(Frame
rate)。
l 指定为视频分配的缓存大小。
l 关闭或者打开音频捕获。
l 设定捕获的时间间隔。
l 指定捕获设备(MCI设备、VCR或者影碟)。
l 指定键盘或鼠标去控制结束捕获。
l 指定适用的视频类型
通过发送WM_CAP_GET_SEQENCE_SETUP消息(capCaptureGetSetup)给捕获窗体,可以获得一个CAPTUREPARMS数据结构的对象,当前视频捕获的设置信息就在这里面。
你可以改写CAPTUREPARMS对象的成员,来实现对视频捕获信息的修改。修改后,发送WM_CAP_SET_SEQUENCE_SETUP消息(capCaptureSetSetup)给捕获窗体,并把这个CAPTUREPARMS
对象发给捕获窗体,就可以实现修改。
音频格式
通过发送WM_CAP_GET_AUDIOFORMAT消息(capGetAudioFormat 和capGetAudioFormatSize宏)给捕获窗体,你就可以获得当前的音频数据格式或音频数据结构的大小。默认音频捕获格式是
mono, 8-bit, 11 kHz
PCM。
当你使用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宏)来预分配一个捕获文件。
你要预分配足够大的磁盘空间去保存预计最大的捕获文件。预分配磁盘空间没有限定捕获文件的大小。如果捕获的数据大于了分配的空间,文件尺寸将自动变大。对一个捕获文件进行重写数据,将对文件的已经分配的磁盘空间进行重写。
通过对捕获文件进行磁盘碎片整理可以提高捕获性能。要对文件进行碎片整理,可以使用一个碎片整理工具来完成,比如Disk
Defragmenter。
通过使用没压缩的磁盘来保存数据,同样可以提高性能。因为在捕获期间压缩数据将对磁盘的吞吐量进行限制。
索引大小
在每个AVI文件中都会使用一个指定大小的索引去查找音视频数据块。在一个索引的入口定位了一个视频帧或者一个波形声音的缓存器。所以,这个索引的大小简接地限定了一个捕获文件所能保存的帧的数量上限。
通过发送WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)给捕获窗口就可以得到当前的索引大小。这个索引大小就保存在CAPTUREPARMS数据结构对象的一个成员中(dwIndexSize)。你可以在dwIndexSize中指定一个新的索引大小,并通过发送消息WM_CAP_SET_SEQUENCE_SETUP(capCaptureSetSetup宏)给捕获窗口完成信息设置。索引默认大小34,952
(允许32K
帧和想匹配的声音缓存器).
音视频块的间隔尺寸(Granularity)
数据块的间隔尺寸是一个AVI文件的逻辑块大小。它用于写和读音视频数据块。当向磁盘写音视频数据时,
AVICap
将在每个数据块中加入一个必须的填充块(filler chunks (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),可以对其进行修改。
音频缓存区
你可以使用下面三种方法来控制捕获的音频数据:
l 在捕获中包含音频或者不包含音频
l 按要求指定音频缓存区的大小
l Request that audio buffers be
a specific size.
你可以使用WM_CAP_GET_SEQUENC_SETUP消息(capCaptureGetSetup)去获得当前的音频缓存区的设置。CAPTUREPARMS的fCaptureAudio指定在这次捕获操作中是否包括对声音的捕获。WNumAudioRequested保存当前要求的音频缓存区的大小。dwAudioBufferSize
保存当前的音频缓存区的大小。
通过对该成员的改写,并发送WM_CAP_GET_SEQUENC_SETUP消息(capCaptureSetSetup),可以对其进行修改。
fCaptureAudio 默认值是TRUE。The
default buffer size (the value of) can contain 0.5 seconds of audio
data or 10K, whichever is greater.