我自己做了一个类用来打开AVI视频和提取AVI视频中的某一帧,我用的是多文档做的,第一次点击提取按钮能正常运行可是第二次提取时程序就会中断,如果我把第一次提取的关了,再次点击提取菜单就能正常提取,大家帮忙看一下怎么回事
void CEditAViView::OnNFrame() 
{
// TODO: Add your command handler code here
CNFrameNum numdlg;
if(numdlg.DoModal()==IDOK)
{
int n;
n=numdlg.m_Num;
        CEditAViDoc* pDoc = GetDocument();
CAVI *pAvi=pDoc->GetPAVI();
CSize size;
size.cx=pAvi->cx;
size.cy=pAvi->cy;
pAvi->AviRead(n);//这是提取某一帧的函数,程序到这就会出错// 一下是新建窗口然后显示提取的图像
    CMainFrame* pFrame = (CMainFrame *)(AfxGetApp()->m_pMainWnd);
    pFrame->SendMessage(WM_COMMAND, ID_FILE_NEW);
    CEditAViView* pView=(CEditAViView*)pFrame->MDIGetActive()->GetActiveView();
    CEditAViDoc* pDocNew=pView->GetDocument();
    CImgDib *dibNew=pDocNew->GetPDib(); 
    dibNew->ReplaceDib(size,24, pData);// 自己定义的显示图像和函数
    pView->OnInitialUpdate();
    pDocNew->SetModifiedFlag(TRUE);
    pDocNew->UpdateAllViews(pView);
delete pData;
}
//这是提取AVI中图像的函数
BOOL CAVI::AviRead(int mFrame)//将AVI文件的M帧数据读入PData缓冲区
{
   HRESULT hr;
    hr= AVIStreamRead( pavi, mFrame, 1, pData, cx*cy*3, NULL, NULL);

    if(hr==0)
        return TRUE;
    else
        return FALSE;
}

解决方案 »

  1.   

    就是每次调用AviRead函数中的pData时程序就会异常终止,pData是用来存储图像的数据部分,求大神帮忙看看,谢谢了
      

  2.   

    hr= AVIStreamRead( pavi, mFrame, 1, pData, cx*cy*3, NULL, NULL);
    然后:
    pData被你delete了。
    delete pData;
    而且这句有问题,pData是个array吧?应该:
    delete 【】pData;
      

  3.   

    回楼上,那个delete pData 是我后来加的,没有它程序还是出现一样的错误
      

  4.   

    还有就是 pData是一个数组,但是我出现的错误和delete pData没有关系,但是仍然谢谢你
      

  5.   

    我用的是多文档做的,第一次点击提取菜单按钮能正常运行,可是第二次提取时程序就会异常中断,如果我把第一次提取的图片的窗口关了,再次点击提取菜单就能正常提取,可是如果我不关闭第一次提取的窗口,程序就会异常终止,我调试发现就是pData的问题,可是我又不知道哪有问题,求各位大神给个解决的办法,谢谢了
      

  6.   

    pData像是一个全局变量(不好吧)。把与他有关的代码贴上来。
      

  7.   

    class CAvi //AVI类,处理AVI文件
    {
     public:
     int cy;//图象高
     int cx;//图象宽
     BYTE *pData;//寸储图象数据
     BITMAPINFO *m_pBMI;//位图文件信息头
     PAVISTREAM pavi;//AVI流
     PAVIFILE pfile;//AVI文件指针
     AVIFILEINFO * pfi; file://AVI信息
     BOOL AviRead(int mFrame);//读AVI文件的第mFrame帧
     CAvi();//标准构造函数
     CAviCreate(CString &string);//用文件名初始化AVI类的成员
     virtual ~CAvi();
    };
    //Cavi类文件实现部分;
    CAvi::CAvi()
    { AVIFileInit();//初始化AVI库
     cx=0;//定义图象宽、高、等成员
     cy=0;
     m_pBMI=NULL;
     pData=NULL;
     pfi=NULL;
    }
    CAvi::~CAvi()//析构、释放指针
    {
     // AVIFileClose(pfile);
     AVIFileExit();
     if(pData!=NULL)
      delete pData;
      pData=NULL; if(m_pBMI!=NULL)
      delete m_pBMI;
      m_pBMI=NULL;
      if(pfi!=NULL)
       delete pfi;
       pfi=NULL;
    }
    CAvi::CAviCreate(CString &string)//读文件初始化该类
    {
     HRESULT hr;
     pfi=new AVIFILEINFO;
     hr = AVIFileOpen(&pfile, // returned file pointer
     string, // file name
     OF_READ, // mode to open file with
     NULL);
     hr= AVIFileInfo(pfile, file://获取AVI信息,放入pfi中
     pfi,
     sizeof(AVIFILEINFO)
    );
    cx=pfi->dwWidth;//图象宽、高
    cy=pfi->dwHeight;
    hr=AVIFileGetStream(//将AVI变成视频流
    pfile,
    &pavi,
    streamtypeVIDEO,
    0//LONG lParam
    );
    m_pBMI=new BITMAPINFO;//定义BMP信息头
    m_pBMI->bmiHeader.biBitCount=24;
    m_pBMI->bmiHeader.biClrImportant=0;
    m_pBMI->bmiHeader.biClrUsed=0;
    m_pBMI->bmiHeader.biCompression=BI_RGB;
    m_pBMI->bmiHeader.biHeight=cy;
    m_pBMI->bmiHeader.biWidth=cx;
    m_pBMI->bmiHeader.biPlanes=1;
    m_pBMI->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    m_pBMI->bmiHeader.biXPelsPerMeter=0;
    m_pBMI->bmiHeader.biYPelsPerMeter=0;
    m_pBMI->bmiHeader.biSizeImage=cx*cy*3;
    pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区
    }
    BOOL CAvi::AviRead(int mFrame)//将AVI文件的M帧数据读入PData缓冲区
    {
    HRESULT hr;
    hr= AVIStreamRead( pavi,
    mFrame,
    1,
    pData,
    cx*cy*3,
    NULL,
    NULL
    );
    if(hr==0)
    return TRUE;
    else
    return FALSE;
    }
      

  8.   

    就这一句:
    pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区
    什么时候用?
      

  9.   

      我把源代码上传到资源里了叫“从AVI中提取图像中的某一帧(有错误)”,或者哪位能把邮箱留下我给你发邮箱里,谢谢了, 大概问题就是“我用的是多文档做的,第一次点击提取菜单按钮能正常运行,可是第二次提取时程序就会异常中断,如果我把第一次提取的图片的窗口关了,再次点击提取菜单就能正常提取,可是如果我不关闭第一次提取的窗口,程序就会异常终止,我调试发现就是pData的问题,可是我又不知道哪有问题,求各位大神给个解决的办法,谢谢了