现在有很多序列图像(一秒钟有10-15帧),用什么方式能够把他们象视频一样播放,并且能够停止、暂停、快放(指定每秒播放帧速)、慢放(指定每秒播放帧速)、快进、快退。初步考虑,有两种方案,不知道是否可行。一、使用DirectShow的双缓冲区,但是不知道能否指定每秒播放的帧速。二、考虑将序列图像转成avi格式,然后播放。看看大家还有没有什么更好的方案,或者做过这方面的来谈谈有什么问题要注意。谢谢!!!

解决方案 »

  1.   

    我觉得编写代码用第一种方法比较快,但相对使用内存可能会比较多~
    可以双缓冲FLIP的时候加上SLEEP之类函数放慢~其实我以前也有想过楼主的问题~~
      

  2.   

    阿,没看清
    你用show?
    不是吧
    用draw就行
      

  3.   

    int canvasFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;
        result = DirectDrawCreateEx(NULL, (VOID**)&pDD7, IID_IDirectDraw7, NULL);    if (result != DD_OK)
    MessageBox("建立DirectDraw对象失败!");
    result = pDD7->SetCooperativeLevel(m_hWnd,DDSCL_EXCLUSIVE |
             DDSCL_FULLSCREEN|DDSCL_ALLOWREBOOT ); if(result !=DD_OK)
    MessageBox("设定程序协调层级失败!");
    result = pDD7->SetDisplayMode(640,480,16,0,DDSDM_STANDARDVGAMODE);  if(result !=DD_OK)
    MessageBox("设定屏幕显示模式失败!");
    memset(&desc,0,sizeof(desc));       
    desc.dwSize = sizeof(desc);           
    desc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    desc.dwBackBufferCount = 1;        
    desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;
    result = pDD7->CreateSurface(&desc,&pPSur,NULL); if(result !=DD_OK)
      MessageBox("建立主绘图页失败!");
    caps.dwCaps = DDSCAPS_BACKBUFFER;  
    result = pPSur->GetAttachedSurface(&caps,&pBBuf);  if(result !=DD_OK)
    MessageBox("连接后缓冲区失败!");
    memset(&desc,0,sizeof(desc));        
    desc.dwSize = sizeof(desc);
    desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; 
    desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN ;
    desc.dwWidth = 640; 
    desc.dwHeight = 480; 
    char file[10];
    char num[5];
    for(i=0;i<=7;i++)
    {
    result = pDD7->CreateSurface(&desc, &pOPla[i], NULL); 
    if(result !=DD_OK)
       MessageBox("建立幕后暂存区失败!");
    ColorKey(i); 
    sprintf( file , "b%d.bmp" , i );
    bitmap = (HBITMAP)::LoadImage(NULL,file,IMAGE_BITMAP,640,480,LR_LOADFROMFILE); 
    if(bitmap==NULL)
    MessageBox("无法载入位图!");
    ::SelectObject(hdc,bitmap);       
    pOPla[i]->GetDC( &hdc1 );          
    ::BitBlt( hdc1 , 0 , 0 , 640 , 480 , hdc , 0 , 0 , SRCCOPY );
        sprintf( num , "第 %d 张图" , i ); 
    ::TextOut(hdc1, 0, 0, num, lstrlen(num)); 
    pOPla[i]->ReleaseDC( hdc1 );     
    }
    SetTimer(1,500,NULL);  
    i=0;                   
    return 0;
    }void canvasFrame::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    CFrameWnd::OnChar(nChar, nRepCnt, nFlags);
    if( nChar== VK_ESCAPE )     
    PostMessage(WM_CLOSE ); 
    }void canvasFrame::OnTimer(UINT nIDEvent) 
    {
    CFrameWnd::OnTimer(nIDEvent);
    if(i==7)
    i=0;
    pBBuf->BltFast( 0 , 0 , pOPla[7], CRect(0,0,640,480) , DDBLTFAST_WAIT); 
    pBBuf->BltFast( 0 , 0 , pOPla[i], CRect(0,0,640,480) , DDBLTFAST_WAIT|DDBLTFAST_SRCCOLORKEY ); pPSur->Flip( NULL , DDFLIP_WAIT ); 
    i++;
    }
      

  4.   

    To zjlgigi(张无忌) :确实是有这个问题,但也只好先放下。
    To  wuliangge2001(还是不懂):谢谢!!是一个很好的方案,我先试试,在来回复!现在还有一个很烦的问题是,我要同时播放三路图像。正在想有什么好的方案。