编写的一个播放avi文件的程序,但为什么播放的速度特别慢,很卡,不知是那里的问题,请各位大虾帮忙看看,谢谢
相关的程序部分如下:
void CMyView::Onplay() //>
{
if(no<len0)
{
SetTimer(1,20,NULL);
 
}
}void CMyView::OnTimer(UINT nIDEvent) 
{
// TODO: Add your message handler code here and/or call default

playavi(no);
if(stop0==1) return;
 no++;
CFormView::OnTimer(nIDEvent);
}
void CMyView::playavi(int a)//单步AVI
{ if(name.Right(3)=="avi")
bi1=m_avi.AviRead(no);
else
{m_list.GetText(no,name);
 m_list.SetCurSel(no);
 file0(name);//调文件
}
xianshi();
CString cc;
cc.Format("%s 第%d祯",name,no);
CMainFrame* pMain = (CMainFrame*)AfxGetApp()->m_pMainWnd ;
pMain->m_wndStatusBar.SetPaneText(1,cc);
}void CMyView::xianshi()
{ CClientDC dc(this);
if (bi1==NULL) {return;}
hdd = DrawDibOpen(); if(!hdd) return;  //打开DrawDib
DrawDibDraw(hdd,dc.m_hDC,90,2,rect.Width()-95,rect.Height()-8,//bi1->biWidth,//bi1->biHeight,
bi1,NULL,0,0,bi1->biWidth,bi1->biHeight,0);
DrawDibClose(hdd);
}void CMyView::file0(CString cc)
{ len0=0;
if(cc.Right(3)=="tml")
{bi1=m_avi.LoadTml(cc);
 goto aa;
}
if(cc.Right(3)=="avi")
{if(m_avi.pData!=NULL) m_avi.AviExit();
 no=0;//起始祯
 name=cc;//取当前文件名
 len0=m_avi.AviOpen(cc);//打开AVI文件,返回祯数
 bi1=m_avi.AviRead(no);
 return;
}
else
bi1=m_avi.LoadBmp(cc);
aa: len0=m_list.GetCount();
return;
}
请各位大虾帮忙指点,谢谢!!!!!

解决方案 »

  1.   

    用Timer来控制的?
    是每过20ms就画一次?
      

  2.   

    可以用MS提供的Media组件来做哦.
    如果一定要自己去实现播放的话,
    有如下建议:
    人对动画能接受的频率是每秒36张图片,如此你可以计算一下计时器大概取多少间隔比较合适.
    如果计时器间隔太小,会严重浪费CPU,当然可能会卡撒.
      

  3.   

    看了下你的代码,不知道m_avi是怎么处理相关数据的
    但是首先你不应该用GDI函数在界面上画位图。
    其次,即使这样用,你也没有使用能够提高效率的处理方式。
    再次,你的timer控制有问题
      

  4.   

    我是想做重avi中提取出每帧图像存为bmp文件,能后将一系列bmp文件做成一个视频文件。但在打开一个avi文件时,播放速度很慢,比较卡,所以在获得这些比较慢的图片后,再将它们合成一个avi视频时,播放速度就很慢,所以我想是不是由于在提取每帧图像时播放的太慢,以致提取的图片太而造成的问题吗?大虾们能不能给出更详细的指点,谢谢了。
      

  5.   

    avi中提取出每帧图像存为bmp很损内存
      

  6.   

    “我是想做重avi中提取出每帧图像存为bmp文件,能后将一系列bmp文件做成一个视频文件”avi->bmp->avi???不明白你这样有什么意义,再有avi格式是公开的,其写的过程和速度没关系,所以你说的“比较卡,所以在获得这些比较慢的图片后”不会有问题,估计是写的时候不对