在MFC环境下如何获取视频文件(如avi或者mpeg)的第一帧,我想使用它的第一帧进行视频文件预览功能。请高手指点方向!谢谢

解决方案 »

  1.   

    1 MFC环境下,可以用DirectShow,不过,要保证安装了相应的codec,否则不能解码。至于DirectShow怎么用,那相当复杂,至少要学上两周才能进行这个问题
    2 使用AviFile函数,比如AviFileOpen,MSDN上有介绍,相对简单一些,不过估计也要一周才能熟练掌握。
      

  2.   

    将视频文件做为Source Filter,然后用GetCurrentimage就可以了。
      

  3.   

    以下抓视频文件第一帧并显示的代码 CString strFileName;
    CFileDialog fd(TRUE);
    if (fd.DoModal()==IDOK)
    {
    IMediaDet* pDet=NULL;
    CoCreateInstance(CLSID_MediaDet,NULL,CLSCTX_INPROC_SERVER,IID_IMediaDet,(void**)&pDet);
    CComBSTR filename(fd.GetFileName());
    pDet->put_Filename(filename);
    CRect rect;
    m_Movie.GetClientRect(&rect);
    LONG widht=rect.Width(),hight=rect.Height(),buffsize=0;//大小可自己定义
    pDet->GetBitmapBits(0/*这里可以设置任何时间,这里的0表示第一帧*/,&buffsize,NULL,widht,hight);
    if (widht==0||hight==0)
    {
    AfxMessageBox(TEXT("hb is NULL"));
    }
    CHAR* buff=new CHAR[buffsize];
    pDet->GetBitmapBits(0,0,buff,widht,hight);
    LPBITMAPINFOHEADER pBih=(LPBITMAPINFOHEADER)buff;
    HDC hdc=::GetDC(NULL);
    void* pData=buff+sizeof(BITMAPINFOHEADER); BITMAPINFO bi;
    ZeroMemory(&bi,sizeof(BITMAPINFO));
    CopyMemory(&(bi.bmiHeader),pBih,sizeof(BITMAPINFOHEADER));
    HBITMAP hb=::CreateDIBitmap(hdc,pBih,CBM_INIT,pData,&bi,DIB_RGB_COLORS);        CDC memDC;
    CDC* dc=m_Movie.GetDC();//m_Movie是CStatic控件变量
    memDC.CreateCompatibleDC(dc);
    memDC.SelectObject(hb);
    dc->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,widht,hight,SRCCOPY);
    delete []buff;
    pDet->Release(); }
      

  4.   

    我要怎么才能给你们分数啊,谢谢。
    这个问题我解决了,基本上是使用directshow完成的。不过比较的麻烦