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,它还是很好用的,只是在处理运动图像时会出现一些马赛克,不知道如何处理,有人知道怎样解决的话,请留下方法。