且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

VFW.h宏解析 (视频开发必备) ----------纠结了2天憋出来的东西

更新时间:2022-08-13 08:26:48

 

                            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下直接读取缓冲区 可以提高实时性,在实时语音视频中用到。