VFW.h宏解析 (详细的参考VFW.H)
作者:岳东卫 转载请写明转载出处......
VFW库是微软推出的支持视频处理的一组库,我们利用VFW可以开发出各种各样的视频处理程序 。 开发实时语音视频系统的时候 一般用TCP/IP传输控制命令 一般用UDP传输数据
下面都是一些宏操作 ,对应的消息自己MSDN去 。。。。
capCreateCaptureWindow //这个宏如果我们在一个窗体上显示视频那么调用 其实是发送了一个响应的消息我们可以在MSDN中查到
capDriverConnect(hw,0) ; //链接到指定设备驱动 将采集窗口和摄像头驱动相连接 这个驱动列表可以枚举出来通过 capGetDriverDescription 函数 ,默认就一个摄像头所因为0
capPreviewRate( hw, 55 ); //设置Preview模式的显示速率 设置预览模式
capPreview( hw, TRUE ); //进入预览模式系统捕获视频并且显示在捕获窗口之上 capOverlay模式是覆盖模式需要特定硬件支持
以上操作就在一个窗体上面显示出来了视频摄像头的窗口 注意 hw是父窗体 下面是对视频流的具体操作
BOOL capDriverDisconnect(hwnd) ;//断开设备驱动和捕获窗体的联系 也就是断开视频连接
BOOL capCaptureSequence(hwnd );//将捕获到的视频存入到驱动器目录下的 CAPTURE.avi中
BOOL capCaptureAbort( hwnd );//放弃当前视频捕获的操作 在录制视频之后必须调用这个关闭 视频否则AVI文件将不能播放
BOOL capCaptureStop(hwnd ); //停止当前视频捕获操纵
BOOL capCaptureSequenceNoFile( hwnd ); //这个宏捕获的视频流并不存储在文件中 我们可以注册回调函数来处理捕获到的数据,每一帧数据被捕获的时候都会调用capSetCallbackOnVideoStream设置的回调函数
我们在基于网络的视频语音通信中,可以对其进行缓冲 当缓冲区满了直接发送给对方。 这个减去了中间存储在磁盘上的环节
BOOL capGrabFrame(hwnd );//捕获单帧并且 从捕获驱动并且显示在捕获窗体上 。 我们调用一次便捕获一次 并且显示一次
capGetDriverDescription 可以枚举系统的摄像头 设备
BOOL capDlgVideoSource(hwnd); //打开一个视频设置 用户可以设置视频 就像QQ中 设置视频一样
BOOL capDlgVideoFormat(hwnd ); //打开视频格式设置的对话框 用户可以设置 视频的分辨率等等
BOOL capFileSaveDIB( hwnd, szName ); //捕获当前帧到一张 bmp位图可以使其他指定的格式 可以捕获视频图像
BOOL capGetStatus( hwnd, s, wSize );//获得一个捕获窗体的信息 CAPSTATUS 结构体 具体应用时候 看MSDN
capCaptureGetSetup();//获得视频流的一个设置 。具体MSDN 比如我们可以fCaptureAudio 修改为FALSE取消声音的录制
capCaptureSetSetup() ;//设置一个视频流的设置信息 具体MSDN CAPTUREPARMS 捕获结构体 具体应用时可以设置捕获帧的时间间隔
capFileSetCaptureFile 这个宏是改变默认的捕获视频的存储路径 具体去看vfw.h的消息 实际上是发送消息的 这个消息指定文件名;它不实际创建文件,分配空间,也不能打开文件 应该在不惑之前设置
(capFileFGetCaptureFile 可以获得当前设置的 捕获视频文件的 存储路径
capFileSaveAs 果用户想保存捕获数据,把数据存到另外一个文件中。可以使用WM_CAP_FILE_SAVEAS消息(capFileSaveAs宏) 。这个消息不能改变捕获文件的名称和内容。你必须去指定新建的文件名,因为捕获文件将保留原来的文件名称。
使用WM_CAP_SEUENCE_NOFILE消息(capCaptureSequenceNoFile宏),可以不向磁盘文件写入数据。该消息仅在配合回调函数时有用,它允许你的应用程序直接使用音视频数据。例如,在视频会议中,应用程序使用该消息区获得视频流。回调函数将传输捕获的图像传送给远程的计算机。
BOOL capDlgVideoCompression(hwnd ); //让用户选择压缩程序的一个对话框 compressor
BOOL capSetUserData(hwnd, lUser ); //关联一个标识到捕获窗口
capDriverGetName 获得驱动器的名字
capDriverGetVersion获得驱动器的版本
capDriverGetCaps 这个宏填充CAPDRIVERCAPS结构体 返回设备驱动的性能
DWORD capGetVideoFormat(hwnd, psVideoFormat,wSize); //可以获得当前捕获窗体的一个捕获位图的位图信息 填充 BITMAPINFO结构体
capSetVideoFormat设置视频格式
capGetAudioFormat获得音频格式信息
capSetAudioFormat设置音频格式信息
capGrabFrame 手动捕获帧 调用一次捕获一次 图像,预览模式是自动捕获 帧 .捕获操作会触发capSetCallbackOnFrame设置的回调函数 实际上只要是捕获视频 都会调用这个 回调函数
capGetMCIDeviceName获得当前使用的设备
capSetMCIDeviceName设置当期要使用的设备
捕获过程中用到的回调函数 关闭直接设置NULL
capSetCallbackOnError //当发生错误的时候 系统调用这个函数设置的回调函数 处理 在程序的一开始 我们就应该设置错误处理回调函数
capSetCallbackOnStatus //当捕获窗口发生改变的时候 会调用这个函数设置的回调函数
capSetCallbackOnVideoStream //当捕获到视频流的时候 调用这个函数设置的回调函数 当视频文件写入到磁盘之前调用 capCaptureSequence 才会调用
capSetCallbackOnWaveStream //当捕获到音频流的时候调用这个函数 设置的回调函数 当视频文件写入到磁盘之前调用 capCaptureSequence才会调用
capSetCallbackOnYield //可以有选择的设置产量回调函数 当捕获到每一帧的时候 至少调用一次 MSDN上的介绍 似乎不大重要。。。详细MSDN
capSetCallbackOnFrame//没获得一帧一帧的数据 就会调用我们设置的回调函数格式和上面capSetCallbackOnWaveStream 都一样 其实 这个回调函数就是数据的入口 ,每次当capGrabFrameNoStop 或者capGrabFrame,
或者我们直接将捕获窗体和视频连接的时候 捕获到一帧图像都会进入这个 回调函数进行处理,回调函数的VIDEOHDR 参数就是 包含的 每张图像的数据缓冲
用到的结构体
在利用AVICap编程时,应该熟悉与视频捕获相关的结构,下面对常用的四个结构作一简要介绍,对于前三个结构都有对应的函数来设置和获得结构包含的信息:
(1)CAPSTATUS:定义了捕获窗口的当前状态,如图像的宽、高等; capGetStatus 宏用到获取捕获窗口的状态
(2)CAPDRIVERCAPS:定义了捕获驱动器的能力,如有无视频叠加能力、有无控制视频源、视频格式的对话框等; capDriverGetCaps 使用 获得驱动设备性能
(3)CAPTUREPARMS:包含控制视频流捕获过程的参数,如捕获帧频、指定键盘或鼠标键以终止捕获、捕获时间限制等; capCaptureGetSetup capCaptureSetSetup 宏使用
(4)VIDEOHDR:定义了视频数据块的头信息,在编写回调函数时常用到其数据成员lpData(指向数据缓存的指针)和dwBufferLength(数据缓存的大小)。 capVideoStreamCallback 视频流回调方法中用到
由 capSetCallbackOnVideoStream注册 ,在 capCaptureSequenceNoFile下直接读取缓冲区 可以提高实时性,在实时语音视频中用到。