VFW中VCM的基本操作过程及相关函数

 

 1、视频压缩的初始化:  
  void   CplaycapDlg::InitCompressor(void)  
  {  
  memset(&m_CV,0,sizeof(COMPVARS));  
  m_CV.dwFlags=ICMF_COMPVARS_VALID;  
  m_CV.cbSize=sizeof(m_CV);  
  m_CV.cbState=0;  
  m_CV.fccHandler=mmioFOURCC('d','i','v','x');

//注:如果是调用XIVD,则上面的参数设为mmioFOURCC('x','v','i','d');  


  m_CV.fccType=ICTYPE_VIDEO;  
  m_CV.hic=ICOpen(ICTYPE_VIDEO,mmioFOURCC('d','i','v','x'),ICMODE_COMPRESS);

 //注:如果是调用XIVD,则上面的参数设为mmioFOURCC('x','v','i','d');  

 
  m_CV.lDataRate=780;  
  m_CV.lFrame=0;  
  m_CV.lKey=15;  
  m_CV.lKeyCount=0;  
  m_CV.lpbiIn=NULL;  
  m_CV.lpBitsOut=NULL;  
  m_CV.lpBitsPrev=m_CV.lpState=NULL;  
  m_CV.lQ=ICQUALITY_DEFAULT;  
  if   (m_CV.hic!=NULL)  
  {   //获得压缩后数据的格式
  m_OutFormatSize=ICCompressGetFormatSize(m_CV.hic,&m_InInfo);  
  m_pOutInfo=(BITMAPINFO   *)new   BYTE[m_OutFormatSize];  
  ICCompressGetFormat(m_CV.hic,&m_InInfo,m_pOutInfo);  
  m_OutBufferSize=ICCompressGetSize(m_CV.hic,&m_InInfo,m_pOutInfo);

//准备编码器  
  if   (ICSeqCompressFrameStart(&m_CV,&m_InInfo))  
              AfxMessageBox("压缩初始化成功");  
  else  
              AfxMessageBox("压缩初始化失败");  
  if(ICDecompressBegin(m_CV.hic,m_pOutInfo,&m_InInfo)!=ICERR_OK)  
              AfxMessageBox("解压初始化失败!");  
  else  
              AfxMessageBox("解压初始化成功!");  
  }  
  }  
  2、VFW中视频采集中的回调函数(我用的是摄相头):  
  LRESULT   CALLBACK   CplaycapDlg::FrameCallBack(HWND   hWnd,LPVIDEOHDR   lpVHdr)  
  {   
             CplaycapDlg*   pDlg=(CplaycapDlg*)::AfxGetMainWnd();  
  pDlg->CompressFrame(lpVHdr);//压缩一帖视频数据
  return   TRUE;  
  }  
  3、视频压缩并解压  
  void   CplaycapDlg::CompressFrame(LPVIDEOHDR   lpVHdr)  
  {   
  BOOL   bKeyFrame;  
  m_OutActSize=this->m_InInfo.bmiHeader.biSizeImage;

//压缩数据
  BYTE*   Buf=(BYTE*)ICSeqCompressFrame(&m_CV,

                       0,

                       lpVHdr->lpData,

                      &bKeyFrame,

                      (long*)&m_OutActSize);   
    
  if(Buf!=NULL)  
  {  
  DWORD   Result;  

 //解压缩数据 
Result=ICDecompress(m_CV.hic,//解码器的句柄

           ICDECOMPRESS_HURRYUP,//压缩方式

           &m_InInfo.bmiHeader,//输入数据格式信息

           Buf,//输入数据缓冲区

           &m_pOutInfo->bmiHeader,//解压后数据的格式信息

           buff);//解压后的数据存入地址
  //if(Result==ICERR_OK)  
          AfxMessageBox("解压成功!");  
  //else  
      //AfxMessageBox("解压失败!");  
  CDC   *pdc=GetDC();  
  HDC   hdc=pdc->GetSafeHdc();  
  StretchDIBits(hdc,0,0,176,144,0,0,176,144,buff,&m_InInfo),DIB_RGB_COLORS,SRCCOPY);  
  }  
  }  
   
  ...............   
    
    
   应用VCM的基础是你的电脑上已安装相应的视频编解码器(如:divx,xvid)我在毕业设计中用的是xvid,它是公开源码,免费使用的;而divx自从4.0版以后就开始收费了。我找了一个5.0.2版的破解版,但没有使用成功,能编码,但解不出数据来!实在郁闷,后来无意中找到xvid codec,它还是很好用的,只是在处理运动图像时会出现一些马赛克,不知道如何处理,有人知道怎样解决的话,请留下方法。

 

 
 

你可能感兴趣的:(video,null,callback,byte,Codec,colors)