现在从摄像头接收到了一帧h.264数据 存储在了缓存 p 中,现在我想使用vfw将p中存储的内容解码为bmp,应该怎样做?

解决方案 »

  1.   

    BITMAPINFO     bminfoOrigin;     //压缩前图片的BITMAPINFO结构        
    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);