调用摄像头接口方法合集

虽然看了也没完全明白,对视频的一些操作不了解,还有对于底层的一些调用方法不熟悉,这里先保存下了。

视频捕获设置

 

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.

 

3.1.6捕获变化

      

除了对基于持续时间间隔的流捕获外,AVICap还支持如下的捕获:

l         手控制帧捕获

l         Still-image 捕获

l         不使用磁盘存储的捕获

l         从一个MCI设备的流捕获(real-time and step-frame)

 

手动帧捕获

 

如果你向指定捕获视频流中个别帧,你可以通过WM_CAP_SINGLE_FRAME_OPEN消息、WM_CAP_SINGLE_FRAME消息、WM_CAP_SINGLE_FRMAE_CLOSE消息来控制帧序列(capCaptureSingleFrameOpen、/capCaptureSingleFrame、capCaptureSigleFrameClose)。

 

典型应用是,这些消息用于向捕获文件添加单独的帧来创建一个动画, WM_CAP_SINGLE_FRAME_OPEN 为手动捕获操作打开一个文件,WM_CAP_SINGLE_FRAME用于捕获一个单独的帧放在文件中。

WM_CAP_SINGLE_FRMAE_CLOSE用于关闭这个捕获文件。

 

注:  该操作支持音视频同时捕获。

Still-Image捕获

 

如果要捕获一个单独的帧作为一个静态图像,你可以使用WM_CAP_GRAB_FRAME_NOSTOP或者 WM_CAP_GRAB_FRAME 消息 (capGrabFrameNoStop

capGrabFrame 宏) 在一个帧缓存区中捕获一个图像。你可以通过使用下面的消息来抓获当前显示的图形WM_CAP_GRAB_FRAME ,否则,使用WM_CAP_GRAB_FRAME_NOSTOP。

一旦开始捕获,你可以拷贝图像给其他应用程序。你可以从帧缓存区拷贝一个图像到剪贴板(使用WM_CAP_EDIT_COPY 消息或capEditCopy宏)。你还可以使用如下的消息,将缓存区的一张图像拷贝到一个DIB位图中(WM_CAP_FILE_SAVEDIB消息或capFileSaveDIB宏)。

 

不使用磁盘存储的捕获

     

使用WM_CAP_SEUENCE_NOFILE消息(capCaptureSequenceNoFile宏),可以不向磁盘文件写入数据。该消息仅在配合回调函数时有用,它允许你的应用程序直接使用音视频数据。例如,在视频会议中,应用程序使用该消息区获得视频流。回调函数将传输捕获的图像传送给远程的计算机。

 

从MCI设备进行流捕获

MCI设备加强了实时捕获和步进帧(step-frame)捕获的处理操作。你可以指定一个MCI设备,比如一张影碟或者一盘录像带(VCR)来充当视频源。通过发送消息并指定你要选定的MCI设备的名称。消息:WM_CAP_SET_MCI_DEVICE (capSetMCIDeviceName宏)。获得当前使用的设备可以使用WM_CAP_GET_MCI_DEVICE(capGetMCIDeviceName)消息。

在实时捕获中, the capture window synchronizes the capture operation and compensates for delays associated with positioning the MCI video source and initializing the resources (such as capture buffers) required for capturing data. The capture window expects a valid MCI video device to be installed in the system for capturing data this way.

控制MCI设备的规格信息保存在CAPTRUEPARMS数据结构体的数据成员中。MCI兼容的视频源包括录像机(VCR)和光碟。如果fMCIControl数据成员为TRUE,捕获窗口采用MCI操作。捕获窗口使用dwMCIStartTime和dwMCIStopTime来获得开始和结束位置(毫秒)。 如果fMCIControl数据成员的值为FALSE, dwMCIStartTime和dwMCIStopTime的值将被忽略不见。

你可以使用Media Player 去快速检查MCI设备是否正确地连接到了你的系统上,如果在视频显示显示了图像,就表示这个视频源正确连接到了捕获硬件上。

在步进帧(step-frame)捕获情况下, the capture window synchronizes the capture operation and compensates for the delays associated with positioning the MCI video source and initializing the resources required for capturing data. In addition, the capture window ensures that no frames are dropped; it steps through the video frames individually, ensuring that the frame is captured and stored before capturing the next frame in the video stream.

步进帧(step-frame)捕获控制的规格信息保存在CAPTRUEPARMS数据结构体的数据成员中。步进帧(step-frame)捕获除了使用视频捕获要用的数据成员外,还使用其他的数据成员:fStepMCIDevice, fStepCaptureAt2x, 和 wStepCaptureAverageFrames。如果数据成员fStepMCIDevice的值为TRUE,捕获窗口采用步进帧(step-frame)捕获。捕获窗口将使用这两个参数来指定捕获的开始和结束位置(dwMCIStartTime和dwMCIStopTime 毫秒)。捕获窗口使用fStepCaptureAt2x 来决定捕获硬件捕获的视频帧使用两个普通的分辨率。使用 wStepCaptureAverageFrames 来指定捕获时每帧图像使用的时间大小。

       如果在一个步进帧(step-frame)捕获中,指定fStepCaptureAt2x为TRUE,那么捕获硬件将使用两个指定的解析度来进行捕获(高和宽的解析度都是双倍的)。它使用软件,在指定的解析度的基础上改写图像的象素,让其成为更高解析度的图像。如果硬件不支持基于硬件的批量处理,你也可以使用该选项。并且捕获为RGB格式。

 

注意:  如果你的硬件步支持基于硬件的批量处理(hardware-based decimation), it can capture samples at a higher rate than specified and use these additional samples to obtain color definitions that are more consistent with the original image. The additional samples are discarded after they are used, and the hardware passes samples to the capture driver at the specified rate。

 

如果指定了步进帧捕获, wStepCaptureAverageFrames 成员用于指定捕获一帧图像要使用的时间,它是一个采样的标准时间。以后捕获图像捕获平均时间都会基于这个时间。采用这种机制,降会减少在一个图像帧的随机数字化噪音。这个数据成员的标准值是5。

关于MCI的信息可以查看MSDN上的信息。

  

3.1.7高级捕获选项

 

这节描述在一个捕获操作中,你还可以进行的其他选择。

l         测量视频质量

l         用户初始化捕获

l         和调色板一起工作

l         在AVI文件中的嵌入信息块

l         用户数据消息(Messages)

 

测量视频质量

测量视频质量的一个方法是去限定在一个捕获操作期间丢掉的捕获图像帧的数字。当流捕获完成后,质量 = 丢掉的帧 / 所有的帧。如果这个数(百分数)大于wPercentDropForError的值,AVICap将发一个错误信息给错误回调函数。WPercentDropForError是CAPTUREPARMS数据结构体的一个数据成员。

通过WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)可以得到当前设定的丢掉帧的限定值。同样对wPercentDropForError进行修改,再把修改后的数据结构体发送给捕获窗体就可以完成对限定值的修改。WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureSetSetup), wPercentDropForErrorm默认值10 (10%)。

 

用户初始化捕获

    通过WM_CAP_GET_SEQUENCE_SETUP消息(capCaptureGetSetup宏)可以得到当前用户初始化捕获的状态值。该值存放在fMakeUserHitOKToCapture中。在开始一个捕获会话前,设置该值为TRUE,可以为用户提供精确的控制。系统为所有的音视频分配好数据缓存区后,AVICap会显示一个对话框。它让用户清除因为软件初始化导致的捕获延迟。如果你的应用程序为视频数据分配的数据缓存区很小,那么这个对话框可能就没的必要了。该值的默认值是FALSE。

 

和调色板一起工作

       最初,如果视频捕获格式需要一个调色板,那么捕获窗口将使用捕获驱动提供的调色板来代替。这个调色板可能由灰度值,或者可选的彩色值组成。使用WM_CAP_PAL_PASTE或者WM_CAP_PAL_OPEN消息(capPalettePaste或capPaletteOpen)可以获得一个现存的调色板去替换默认的调色板。你还可以创建一个自定义的调色板去替换默认的调色板,你要使用WM_CAP_PAL_AUTOCREATE 或者 WM_CAP_PAL_MANUALCREATE消息 ( capPaletteAuto 或 capPaletteManual )。当你替换了调色板后,捕获窗体和驱动程序将使用替换后的调色板,直到你创建或打开其他的调色板为止。

 

WM_CAP_PAL_AUTOCREATE 或者 WM_CAP_PAL_MANUALCREATE 消息将创建一个基于当前视频输入最优化的调色板。这个自定义的调色板将为视频提供一个最好的颜色逼真度,因为这个调色板的颜色是基于这个视频的。捕获窗口创建一个采样颜色的3维柱状图。它会减小真实颜色和渐近色间的值。

 

在发送WM_CAP_PAL_AUTOCREATE消息时, 你必须指定AVICap采样的帧数以及调色板的颜色尺寸。在指定帧数时,要保证帧数足够大以保证所有的视频颜色可以被采样收集到。

    使用WM_CAP_PAL_MANUALCREATE消息可以对当前帧进行采样。通过该消息,进行几次手动选择帧采样操作,你可以创建自己的调色板,它包含了你想要的颜色信息。

 

一个调色板可以包含256种颜色。如果你要合并调色板,或者在视频队列中同时在显示其他视频或图像。你可以去使用一个小的颜色集合,这样不同图像或视频的颜色就可以共存了。

使用WM_CAP_PAL_SAVE消息(capPaletteSave),可以保促一个新的调色板。通过WM_CAP_PAL_OPEN消息还可以得到当前的调色板。你可以在调色板处理前保存一个调色板,或者为其他应用程序使用去保存一个调色板。

 

使用WM_CAP_PAL_PASTE可以把剪贴板中的调色板粘贴到捕获窗口中。捕获窗口通过这个调色板到捕获驱动。其他程序可以拷贝调色板到剪贴板中。你也可以把调色板粘贴到剪贴板中。使用WM_CAP_ENDIT_COPY消息(capEditCopy)。它将拷贝视频缓存区(包括调色板)到剪贴区。

在AVI文件中的嵌入信息块

你可以在一个AVI文件中插入信息块,比如文本或者自定义的数据。通过使用下面的消息:WM_CAP_FILE_SET_INFOCHUNK(capFileSetInfoChunk)。可以使用这个消息还可以清除掉一个AVI文件中的信息块。

 

用户数据消息

       通过使用WM_CAP_GET_USER_DATA和WM_CAP_SET_USER_DATA消息可以关联数据到一个捕获窗体。(capGetUserData 和 capSetUserData宏)。使用…Get…消息可以得到一个LONG数据值,可以通过_Set_消息去设置该值。

 

 

3.1.8 AVICap回调函数

       你的应用程序可以为一个捕获窗口注册一些回调函数,它们可以告诉你的应用程序一些变化。比如捕获状态发生变化了,或者有错误发生了,音视频缓存区可使用了。下面的消息设置回调函数。

消           息

说           明

WM_CAP_SET_CALLBACK_CAPCONTROL

CapSetCallbackOnCapControl 宏

在应用程序中指定回调函数用于控制捕获的开始和结束。

WM_CAP_SET_CALLBACK_ERROR

CapSetCallbackOnError宏

在应用程序中指定回调函数,当出错的时候就调用它。

WM_CAP_SET_CALLBACK_FRAME

CapSetCallbackOnFrame宏

在应用程序中指定回调函数,当预览图像帧被捕获了的时候就调用它。

WM_CAP_SET_CALLBACK_STATUS

CapSetCallbackOnStatus宏

在应用程序中指定回调函数,当状态(status)改变的时候就调用它。

WM_CAP_SET_CALLBACK_VIDEOSTREAM

CapSetCallbackOnVideoStream宏

在应用程序中指定回调函数,在流捕获期间,当一个新的视频缓存区可用的时候就调用它。

WM_CAP_SET_CALLBACK_WAVESTREAM

CapSetCallbackOnWaveStream宏

在应用程序中指定回调函数,在流捕获期间,当一个新的音频缓存区可用的时候就调用它。

WM_CAP_SET_CALLBACK_YIELD

CapSetCallbackOnYield宏

在应用程序中指定回调函数,在流捕获期间Yielding(产生?)

 

精确捕获控制

捕获窗口可以提供捕获回调函数,这个回调函数可以对流捕获的开始和结束时刻进行精确的控制。在捕获驱动程序(capture driver)完成所有缓存区分配和其他捕获准备后,捕获驱动程序就发送第一个消息给回调处理程序,把nState参数设置为:

CONTROLCALLBACK_PREROLL

这个消息告诉应用程序将要开启视频源了。(这个回调函数指定nState为它的第二个参数)回调函数将在开始时刻产生返回值。返回值为TRUE那么将继续捕获。为FALSE就中断捕获。一旦捕获开始,这个回调函数将频繁的调用,把nState设置为:

CONTROLCALLBACK_CAPTURING

将允许应用程序通过返回false去结束捕获。

 

错 误

       捕获窗口使用错误通知消息去告诉你的应用程序,发生了AVICap错误,比如磁盘空间已经用完了,尝试对一个只读文件进行写操作,不能访问硬件,掉帧太多。错误通知内容报价一个消息ID和一个格式化的文本字符(用来显示)。你的应用程序可以通过使用这个消息ID去过滤错误通报,还可以让该错误信息不显示给用户。消息ID为0表示一个新操作正在开始并且这个回调函数会清除掉所有的显示的错误信息。

 

帧(Frame)

       A capture window uses frame callback notification messages to notify your application when a new video frame is available. The capture window enables these callback notifications only if the preview rate is nonzero and streaming capture is not in progress.

 

状态回调函数

当视频捕获向磁盘写数据,或者在其他较长的操作期间,捕获窗口可以发送消息给状态回调函数通知你正在处理该操作的应用程序。状态信息包括一个消息ID和和一个格式化的文本字符(用来显示)。你的应用程序可以通过使用消息ID去过滤通报,还可以限制该信息是否显示给用户。在捕获操作期间,发给回调函数的第一个消息总是ID_CAP_GEGIN,最后一个总是ID_CAP_END。消息ID为0表示,一个新操作正在进行并且回调函数将清除当前状态。

 

视频流

       在流捕获期间,应用程序可以使用视频流回调函数去处理一个捕获的视频帧。视频窗体只能在每次向磁盘写数据帧前,调用视频流回调函数。

 

音频流

在流捕获期间,应用程序可以使用音频流回调函数去处理音频缓存区。视频窗体只能在每次向磁盘写数据帧前,调用音频流回调函数。

 

Yield 回调函数

应用程序在流捕获期间可以使用Yield回调函数。(Yield回调函数一般是由一个消息循环组成,可以调用PeekMessage,TranslateMessage,DispatchMessage)。捕获窗口在每次捕获视频帧时至少调用一次Yield回调函数。但是具体要调用多少次由帧率来决定。

 

关闭回调函数

你可以暂时或永久关闭所有的回调函数的功能,在发送消息设置回调函数的时候,用NULL替换调回调函数就可以了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值