视频捕获相关的编程

来源:互联网 发布:js验证是否是数字 编辑:程序博客网 时间:2024/04/28 04:07
由于篇幅有限,下面仅介绍与视频捕获相关的编程。
  1、定义全局变量:
  HWND   ghWndCap   ;   //捕获窗的句柄
  CAPDRIVERCAPS   gCapDriverCaps   ;   //视频驱动器的能力
  CAPSTATUS   gCapStatus   ;   //捕获窗的状态
  2、处理WM_CREATE消息:
  //创建捕获窗,其中hWnd为主窗口句柄
  ghWndCap   =   capCreateCaptureWindow((LPSTR) "Capture   Window ",WS_CHILD   |   WS_VISIBLE,   0,   0,   300,240,   (HWND)   hWnd,   (int)   0);
  //登记三个回调函数,它们应被提前申明
  capSetCallbackOnError(ghWndCap,   (FARPROC)ErrorCallbackProc);   capSetCallbackOnStatus(ghWndCap,   (FARPROC)StatusCallbackProc);   capSetCallbackOnFrame(ghWndCap,   (FARPROC)FrameCallbackProc);
  capDriverConnect(ghWndCap,0);   //   将捕获窗同驱动器连接
  //获得驱动器的能力,相关的信息放在结构变量gCapDriverCaps中
  capDriverGetCaps(ghWndCap,&gCapDriverCaps,sizeof(CAPDRIVERCAPS))   ;
  3、处理WM_CLOSE消息:
  //取消所登记的三个回调函数
  capSetCallbackOnStatus(ghWndCap,   NULL);
  capSetCallbackOnError(ghWndCap,   NULL);
  capSetCallbackOnFrame(ghWndCap,   NULL);
  capCaptureAbort(ghWndCap);//停止捕获
  capDriverDisconnect(ghWndCap);   //将捕获窗同驱动器断开
  4、处理菜单项Preview:
  capPreviewRate(ghWndCap,   66);   //   设置Preview模式的显示速率
  capPreview(ghWndCap,   TRUE);   //启动Preview模式
  5、处理菜单项Overlay:
  if(gCapDriverCaps.fHasOverlay)   //检查驱动器是否有叠加能力
  capOverlay(ghWndCap,TRUE);   //启动Overlay模式
  6、处理菜单项Exit:
  SendMessage(hWnd,WM_CLOSE,wParam,lParam);
  7、分别处理Setting下的三个菜单项,它们可分别控制视频源、视频格式及显示:
  if   (gCapDriverCaps.fHasDlgVideoSource)
  capDlgVideoSource(ghWndCap);   //Video   source   对话框
  if   (gapDriverCaps.fHasDlgVideoFormat)
  capDlgVideoFormat(ghWndCap);   //   Video   format   对话框
  if   (CapDriverCaps.fHasDlgVideoDisplay)
  capDlgVideoDisplay(ghWndCap);   //   Video   display   对话框
  8、处理Video   Stream菜单项,它捕获视频流到一个.AVI文件:
  char   szCaptureFile[]   =   "MYCAP.AVI ";
  capFileSetCaptureFile(   ghWndCap,   szCaptureFile);   //指定捕获文件名
  capFileAlloc(   ghWndCap,   (1024L   *   1024L   *   5));   //为捕获文件分配存储空间
  capCaptureSequence(ghWndCap);   //开始捕获视频序列
  9、处理Single   Frame菜单项:
  capGrabFrame(ghWndCap);   //捕获单帧图像
  10、定义三个回调函数:
  LRESULT   CALLBACK   StatusCallbackProc(HWND   hWnd,   int   nID,   LPSTR   lpStatusText)
  {
  if   (!ghWndCap)   return   FALSE;
  //获得捕获窗的状态
  capGetStatus(ghWndCap,   &gCapStatus,   sizeof   (CAPSTATUS));
  //更新捕获窗的大小
  SetWindowPos(ghWndCap,   NULL,   0,   0,   gCapStatus.uiImageWidth,
  gCapStatus.uiImageHeight,   SWP_NOZORDER   |   SWP_NOMOVE);
  if   (nID   ==   0)   {   //   清除旧的状态信息
  SetWindowText(ghWndCap,   (LPSTR)   gachAppName);
  return   (LRESULT)   TRUE;
  }
  //   显示状态   ID   和状态文本
  wsprintf(gachBuffer,   "Status#   %d:   %s ",   nID,   lpStatusText);
  SetWindowText(ghWndCap,   (LPSTR)gachBuffer);
  return   (LRESULT)   TRUE;
  }
  LRESULT   CALLBACK   ErrorCallbackProc(HWND   hWnd,   int   nErrID,LPSTR   lpErrorText)
  {
  if   (!ghWndCap)
  return   FALSE;
  if   (nErrID   ==   0)
  return   TRUE;//   清除旧的错误
  wsprintf(gachBuffer,   "Error#   %d ",   nErrID);   //显示错误标识和文本
  MessageBox(hWnd,   lpErrorText,   gachBuffer,MB_OK   |   MB_ICONEXCLAMATION);
  return   (LRESULT)   TRUE;
  }
  LRESULT   CALLBACK   FrameCallbackProc(HWND   hWnd,   LPVIDEOHDR   lpVHdr)
  {
  if   (!ghWndCap)
  return   FALSE;
  //假设fp为一打开的.dat文件指针
  fwrite(fp,lpVHdr-> lpData,lpVHdr-> dwBufferLength,1);
  return   (LRESULT)   TRUE   ;
  }
  值得注意的是:应在.cpp文件中加入#include   一句,在Link设置中加入vfw32.lib。

上述的回调函数FrameCallbackProc是将视频数据直接从缓冲写入文件,也可利
用memcpy函数将视频数据直接拷贝到另一缓存。同理,可定义VideoStreamCallbackProc。
capSetCallbackOnVideoStream的使用比capSetCallbackOnFrame稍微复杂一些。在捕获过
程中,当一个新的视频缓冲可得时,系统就调用它所登记的回调函数。在缺省情况下,捕
获窗在捕获过程中不允许其它应用程序继续运行。为了取消这个限制,可以设置CAPTUREPARMS
的成员fYield为TRUE或建立一个Yield回调函数。为了解决潜在的重入(reentry)问题,可
在YieldCallbackProc中用PeekMessage过滤掉一些消息,例如鼠标消息。

你用google搜一下视频捕获   vfw   可以搜到很多

http://www.ccw.com.cn/htm/app/aprog/01_2_5_5.asp

http://www.xhstudio.net/show.asp?id=1433