如何把VIDEOHDR中的数据显示出来

1、你是用VIDEO   FOR   WINDOWS得到的VIDEOHDR指针吗??  
   
  BOOL   CVideoCapView::FrameCallbackProc(HWND   hWnd,   LPVIDEOHDR   lpVHdr)  
  {  
   
  //     hWnd:               Application   main   window   handle  
  //     lpVHdr:           long   pointer   to   VideoHdr   struct   containing   captured  
  //                             frame   information  
  //typedef   struct   {  
  //LPBYTE   lpData;                                         指向缓冲区的指针  
  //DWORD   dwBufferLength;                           缓冲区的长度    
  //DWORD   dwBytesUsed;                                 缓冲区中使用的字节数  
  //DWORD   dwTimeCaptured;                           捕捉时间(毫秒)   与数据流中第一桢的捕捉时间有关  
  //DWORD   dwUser;                                           32位的特定客户区数据  
  //DWORD   dwFlags;                                         1、VHDR_DONE   由设备驱动器提供,表明设备驱动器已经完成缓冲,并将缓冲区数据返回给客户区  
  //                                                                     2、VHDR_PREPARED   表明缓冲区是否准备好以便使用      
  //                                                                     3、VHDR_INQUEUE       表明缓冲区已在设备的缓冲区队列中  
  //                                                                 4、VHDR_KEYFRAME     关键桢  
  //DWORD   dwReserved[4];                             保留字,常用做缓冲队列  
  //}   VIDEOHDR;  
  //  
   
          if   (!ghWndCap)  
                  return   FALSE;                           //若捕捉窗口未被建立返回FALSE  
          CVideoCapDoc   *   pDoc=GetDocument();  
          LPSTR   pDIB;                                         //指向DIB数据的指针  
        pDoc->datasize=lpVHdr->dwBufferLength;//在CVideoCapDoc类中定义的变量,表明缓冲区长度  
          pDoc->hImgData=(HDIB)::GlobalAlloc(GMEM_MOVEABLE   |   GMEM_ZEROINIT,pDoc->datasize);     //分配一端长度与缓冲区长度相等的内存用于存放DIB数据  
   
  if   (pDoc->hImgData   ==   0)  
  {  
  AfxMessageBox("memory   allocate   error",   MB_ICONINFORMATION   |   MB_OK,0);  
  return   FALSE;  
  }  
   
  pDIB=(LPSTR)::GlobalLock((HGLOBAL)   pDoc->hImgData);       //锁定内存(用pDIB指针指向刚刚分配的内存区域)  
  memcpy((char   *)pDIB,(char   *)lpVHdr->lpData,pDoc->datasize);     //将缓冲区中的数据拷贝到pDIB指向的内存区域  
  pDoc->bi=(LPBITMAPINFOHEADER)pDIB;                                                       //DIB文件头信息指针  
  pDoc->ImgHeight=pDoc->bi->biHeight;                                                     //DIB图像高度  
          pDoc->ImgWidth=pDoc->bi->biWidth;                                                         //DIB图像高度  
  pDoc->LineBytes=WIDTHBYTES(pDoc->ImgWidth*pDoc->bi->biBitCount);//DIB图像每行的字节数  
   
  pDoc->docsize.cx=(int)30*pDoc->LineBytes;  
  pDoc->docsize.cy=(int)16*pDoc->ImgHeight;  
   
  pDoc->UpdateAllViews(NULL,0,NULL);                                             //更新所有视  
  ::GlobalUnlock(pDoc->hImgData);                                             //解锁          
   
   
   
      //     wsprintf(gachBuffer,   TEXT("Preview   frame#   %ld   "),   gdwFrameNum++)   ;  
   
    //     ::SetWindowText(ghWndFrame,   (LPTSTR)gachBuffer)   ;  
          return   (LRESULT)   TRUE   ;  
  }  
  我在文档类里定义了DIB信息,  
  BITMAPFILEHEADER       bf;  
  LPBITMAPINFOHEADER       bi;  
                    CBitmap                   bm;  
  CSize                       docsize;  
  CString                   filename;  
  HBITMAP                 hBitmap;  
  HDIB                       hImgData;  
  DWORD                     NumColors;  
  DWORD                     LineBytes;  
  DWORD                     ImgWidth;  
  DWORD                     ImgHeight;  
  DWORD             palettesize;  
  DWORD                     datasize;  
  然后在视类的ONDRAW函数中处理显示DIB的东西,我想你这个应该是会的!!  
  2、你应该是使用VFW编程,应该知道回调函数的用法吧??  
  3、另外,我想问你一个问题,你用什么采集卡?什么摄像头??有没有出现过在建立视频窗与设备相连时发现设备正在被其他视频使用而无法使用该设备的问题,你能给点建议吗?期待着你的答复,如果你想进一步探讨,请和我联系。  
  Email:old-j@163.net,qq:17096205

 

转自:http://topic.csdn.net/t/20020418/12/656889.html

  • 0
    点赞
  • 0
    收藏
  • 1
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值