我自己做了一个类用来打开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;
}
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;
}
然后:
pData被你delete了。
delete pData;
而且这句有问题,pData是个array吧?应该:
delete 【】pData;
{
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;
}
pData=(BYTE*)new char[cx*cy*3];//根据AVI中BMP图象的信息定义缓冲区
什么时候用?
”