现在从摄像头接收到了一帧h.264数据 存储在了缓存 p 中,现在我想使用vfw将p中存储的内容解码为bmp,应该怎样做?
解决方案 »
- 在网络上可以找到Visual C++ 2008 中文的入门教程吗?
- 请教MFC的一个简单压键盘程序找不到文件“Debug/Ch5Demo1.pch”?
- 使用BoundsChecker 的问题!!!!!!
- 如何用同一进程打开多个关联文件?
- CoCreateInstance之后调用COM对象的方法编译不能通过,请问怎么解决??????????????????
- 怎样让每次输入的数据追加到listctrol控件的末尾!
- 请教画扇形的算法
- 请问,用户点击文件列表时OnFileOpen()里的语句并没执行,怎么办?
- 如何C++封装一个打码机的驱动 打码机驱动里有2个dll文件,需要封装成OCX
- 再用VS2015打开arduino工程时显示错误,ARM平台的编译器不支持
- MFC多文档界面的CFormView类边框有下陷的视觉,如何去掉?
- 如何修改状态栏字体颜色
BITMAPINFO bminfoCode; //压缩后图片的BITMAPINFO结构
// 填压缩前图片的BITMAPINFO结构
ZeroMemory(&bminfoOrigin, sizeof(BITMAPINFO));
bminfoOrigin.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bminfoOrigin.bmiHeader.biCompression = BI_RGB;
bminfoOrigin.bmiHeader.biWidth = 518;
bminfoOrigin.bmiHeader.biHeight = 405;
bminfoOrigin.bmiHeader.biPlanes = 1;
bminfoOrigin.bmiHeader.biBitCount = 24;
bminfoOrigin.bmiHeader.biSizeImage = 0; //518*405*3;
bminfoOrigin.bmiHeader.biXPelsPerMeter = 0;
bminfoOrigin.bmiHeader.biYPelsPerMeter = 0;
bminfoOrigin.bmiHeader.biClrUsed = 0;
bminfoOrigin.bmiHeader.biClrImportant = 0;
ZeroMemory(&bminfoCode, sizeof(BITMAPINFO));
BOOL bKeyFrame;
COMPVARS m_CV;
//初始化 COMPVARS
memset(&m_CV,0,sizeof(COMPVARS));
m_CV.cbSize = sizeof(m_CV);
m_CV.dwFlags =ICMF_COMPVARS_VALID;
m_CV.fccType =ICTYPE_VIDEO;
m_CV.cbState =0;
m_CV.fccHandler =mmioFOURCC( 'd ', 'i ', 'v ', 'x ');
m_CV.lpbiOut =0;
m_CV.lKey=1;
m_CV.lDataRate =6;
m_CV.lQ =ICQUALITY_HIGH;
DWORD fcchandler=m_CV.fccHandler;
// 编码压缩
m_CV.hic = ICOpen(ICTYPE_VIDEO,fcchandler,ICMODE_COMPRESS);
if(!(m_CV.hic))
{
AfxMessageBox( "ICOpen Enc Error! ");
}
// ----------------- 单帧压缩ICCompress -------------------------
LONG msize=518*405*3;
char *lpout =new char[msize]; //输出缓冲
memset(lpout,0,sizeof(lpout));
DWORD dwCKID=0;
DWORD dFlags=AVIIF_KEYFRAME;
ICCompressGetFormat(m_CV.hic ,&bminfoOrigin,&bminfoCode);
DWORD dwSize = ICCompressGetFormatSize(m_CV.hic, &bminfoOrigin);
//ICSendMessage(m_CV.hic , 0x60c9, 0xf7329ace, 0xacdeaea2);
if(ICCompressBegin(m_CV.hic,&bminfoOrigin,&bminfoCode)!=ICERR_OK)//此处即出错
AfxMessageBox( "ICCompressBegin Enc Error! ");
if(ICCompress(m_CV.hic ,0,&bminfoCode.bmiHeader ,
lpout,&bminfoOrigin.bmiHeader ,
m_pData,0,&dFlags,0,0,0,NULL,NULL)!=ICERR_OK)
AfxMessageBox( "ICCompress Error! ");
ICCompressEnd(m_CV.hic);
ICClose(m_CV.hic);
//解码
HIC dehic;
dehic=ICOpen(ICTYPE_VIDEO,fcchandler,ICMODE_DECOMPRESS);
if(dehic==NULL)
AfxMessageBox( "ICOpen decompressor error ");
static BYTE Buf[518*405*10];
memset(Buf,0,sizeof(Buf));
ICDecompressGetFormat(dehic ,&bminfoCode,&bminfoOrigin);
if(ICDecompressBegin(dehic , &bminfoCode, &bminfoOrigin)!=ICERR_OK)
AfxMessageBox( "ICDecompressBegin Error! ");
if(ICDecompress(dehic ,0,
&(bminfoCode.bmiHeader ),lpout,&(bminfoOrigin.bmiHeader ),Buf)!=ICERR_OK)
AfxMessageBox( "ICDecompress Error! ");
ICDecompressEnd(dehic);
ICClose(dehic);
CDC* pDC = GetDC();
HDC hDC=pDC-> GetSafeHdc ();
::SetDIBitsToDevice(hDC,
0, 0, bminfoOrigin.bmiHeader.biWidth, bminfoOrigin.bmiHeader.biHeight,
0, 0, 0, bminfoOrigin.bmiHeader.biHeight,
Buf, &bminfoOrigin, DIB_RGB_COLORS);