#if !defined(AFX_VIDEOCODEC_H_INCLUDED) #define AFX_VIDEOCODEC_H_INCLUDED /* 常用的编码器压缩比,程序使用M263编码 0x64697663,1684633187,Cinepak Codec by Radius 76032 >> 1860 0x32335649,842225225,Intel Indeo(R) Video R3.2 76032 >> 475 0x56555949,1448433993,Intel IYUV codec 76032 >> 38016 放弃这个,压缩比太低 0x4356534d,1129730893,Microsoft Video 1 76032 >> 3202 0x3336324d,859189837,Microsoft H.263 Video Codec 76032 >> 663 对分辩率有要求 0x33564d57,861293911,Microsoft Windows Media Video 9 76032 >> 196 0x3234504d,842289229,Microsoft MPEG-4 Video Codec V2 76032 >> 349 M263只支持176*144 352*288 (352*288 24彩的试验只支持biPlanes = 1) 一段可以用的上的代码 // 列举本机安装的解码器(CODEC) int EnumCodecs(int *fccHandler, char *strName) { static int i = 0; int nRet = 1; HIC hIC; ICINFO icInfo; if (fccHandler == NULL) return 0; if(!ICInfo(ICTYPE_VIDEO, i, &icInfo)) { i = 0; return 0; } hIC = ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY); if (hIC) { ICGetInfo(hIC, &icInfo, sizeof(icInfo)); *fccHandler = icInfo.fccHandler; //由于得到的szDescription是UNICODE双字节字串,所以要转换为ASCII的 if (strName != NULL) wcstombs(strName, icInfo.szDescription, 256); } else nRet = -1; ICClose(hIC); i++; return nRet; } Usage: int fccHandler; char strName[MAX_PATH]; while(EnumCodecs(&fccHandler, strName)) { printf("0x%x,%s\n", fccHandler, strName); } */ class CVideoCodec { COMPVARS m_cv; HIC m_hIC; BITMAPINFO* m_lpbmiInput; BITMAPINFO m_bmiOutput; public: bool InitCompressor(BITMAPINFO* lpbmi, DWORD fccHandler) { if (lpbmi == NULL) return false; m_lpbmiInput = lpbmi; ZeroMemory(&m_cv, sizeof(m_cv)); m_cv.cbSize = sizeof(m_cv); m_cv.dwFlags = ICMF_COMPVARS_VALID; m_cv.hic = m_hIC; m_cv.fccType = ICTYPE_VIDEO; m_cv.fccHandler = fccHandler; m_cv.lpbiOut = NULL; m_cv.lKey = 10; m_cv.lDataRate = 6; m_cv.lQ = ICQUALITY_HIGH; m_hIC = ICOpen(ICTYPE_VIDEO, m_cv.fccHandler, ICMODE_COMPRESS | ICMODE_DECOMPRESS); if (m_hIC == NULL) { return false; } ICCompressGetFormat(m_hIC, m_lpbmiInput, &m_bmiOutput); // 向编码器发送验证 ICSendMessage(m_hIC, 0x60c9, 0xf7329ace, 0xacdeaea2); m_cv.hic = m_hIC; m_cv.dwFlags = ICMF_COMPVARS_VALID; if (!ICSeqCompressFrameStart(&m_cv, m_lpbmiInput)) { return false; } ICDecompressBegin(m_hIC, &m_bmiOutput , m_lpbmiInput); return true; } bool DecodeVideoData(BYTE *pin, int len, BYTE* pout, int *lenr,DWORD flag) { if(!pin || !pout ||!m_hIC) return false; if (ICDecompress(m_hIC, flag, &m_bmiOutput.bmiHeader, pin, &m_lpbmiInput->bmiHeader, pout) != ICERR_OK) return false; if (lenr) *lenr = m_lpbmiInput->bmiHeader.biSizeImage; return true; } bool EncodeVideoData(BYTE* pin, int len, BYTE* pout, int* lenr, bool* pKey) { BYTE *p; long s = 1; BOOL k = true; if ( !pin || !pout || len != (int)m_lpbmiInput->bmiHeader.biSizeImage || !m_hIC) return false; p = (BYTE*)ICSeqCompressFrame(&m_cv, 0, pin, &k, &s); if (!p) return false; if (lenr) *lenr = s; if (pKey) *pKey = k; CopyMemory(pout, p, s); return true; } CVideoCodec() { m_lpbmiInput = NULL; } virtual ~CVideoCodec() { // No init yet or init error if (m_hIC == NULL) return; ICDecompressEnd(m_hIC); ICSeqCompressFrameEnd(&m_cv); ICCompressorFree(&m_cv); ICClose(m_hIC); } }; #endif // !defined(AFX_VIDEOCODEC_H_INCLUDED)