我看了以前的帖子,然后仿照duwenyong(啸海)给的例子写了一段代码,但是总是出错,我跟踪了一下,就在下面这句有问题了
pData = (unsigned char *)AVIStreamGetFrame(pg,mFrame);
好像pData里面没有得到数据啊。然后
myfile.Write(pData,cx*cy*3);就有问题了。pData是这样定义的
unsigned char *pData.而且已经给它分配过空间了。
这是为什么啊?老板催着要,大家帮忙啊!

解决方案 »

  1.   

    这是部分代码:
    BOOL CAcitveMovie::aviRead(int mFrame)
    {
    CAviCreate(TotalFileName);
    PGETFRAME pg = AVIStreamGetFrameOpen(pavi,&(m_pBMI->bmiHeader));
    pData = (unsigned char *)AVIStreamGetFrame(pg,mFrame);
    CFile mypdata; CClientDC dc(this);
    CRect rect;
    GetClientRect(&rect);
    StretchDIBits(HDC(dc),0,500,rect.right,rect.bottom,0,0,cx,cy,pData,(BITMAPINFO*)
              m_pBMI,DIB_RGB_COLORS,SRCCOPY);
    fileinfo = new BITMAPFILEHEADER;
    CFile myfile;
    myfile.Open("e:\\123.bmp",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
    myfile.Write(fileinfo,sizeof(BITMAPFILEHEADER));
    myfile.Write(m_pBMI,sizeof(BITMAPINFOHEADER));
    //执行到下面这句就出错了
    myfile.Write(pData,cx*cy*3+sizeof(BITMAPINFOHEADER));
    myfile.Close();
    AVIStreamGetFrameClose(pg);
    AVIFileRelease(pfile); return TRUE;
    }
    void CAcitveMovie::CAviCreate(CString &string)
    {
    HRESULT hr;
    pfi = new AVIFILEINFO;
    AVIFileInit();
    hr = AVIFileOpen(&pfile,string,OF_READ,NULL);
    hr = AVIFileInfo(pfile,pfi,sizeof(AVIFILEINFO));
    cx = pfi->dwWidth;
    cy = pfi->dwHeight;
    hr = AVIFileGetStream(pfile,&pavi,streamtypeVIDEO,0);
    AVIStreamInfo(pavi,&psi,sizeof(AVISTREAMINFO)); m_pBMI = new BITMAPINFO;
    m_pBMI->bmiHeader.biBitCount = 24;
    m_pBMI->bmiHeader.biClrImportant = 0;
    m_pBMI->bmiHeader.biClrUsed=0;
    m_pBMI->bmiHeader.biCompression=0;
    m_pBMI->bmiHeader.biHeight=cy;
    m_pBMI->bmiHeader.biWidth=cx;
    m_pBMI->bmiHeader.biPlanes=1;
    m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    m_pBMI->bmiHeader.biSizeImage=((cx*24+31)/32*4)*cy;
    m_pBMI->bmiHeader.biXPelsPerMeter=0;
    m_pBMI->bmiHeader.biYPelsPerMeter=0;
    handle=GlobalAlloc(GHND,((long)((cx*24+31)/32*4)*cy));
    pData=(BYTE *)GlobalLock(handle);
    }
      

  2.   

    我又来啦,请问相应的AVI解码器,你的系统有没有装呀?是VFW,不是DSHOW filter,你留个信箱,我发你例子,OK?
      

  3.   

    [email protected]
    thank u!
    我应该没有装什么avi解码器,我是从别人的avi文件中要得到bmp图象。
      

  4.   

    那不是程序的错呀,你直接去运行那个程序绝对可以用,不要在VC下用。因为那个工程从我电脑上拷过去,工程设置中的EXE目录要改一下嘛。菜单"project"->“setting"->"debug"->execuete.....下面那串EXE目录删掉就OK了。
      

  5.   

    看了源程序,用那个类写了,已经搞定了,谢谢!最关键的问题居然是别人给我的那个avi文件是没有压缩过的,sigh!