程序代码如下:
void CFaceView::OnFileOpen() 
{
// TODO: Add your command handler code here
CFaceDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc); CString strFilter = "AVI Files (*.avi)|*.avi|All Files (*.*)|*.*||";
CFileDialog FileDlg(TRUE, NULL, NULL, 
   OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
   (LPCSTR)strFilter, this);
if (FileDlg.DoModal() == IDOK)
{
CString strFileName = FileDlg.GetPathName();
char szFileName[_MAX_PATH];
GetShortPathName((LPCSTR)strFileName, szFileName, _MAX_PATH); ExtractAVIFrames(strFileName);
Invalidate(TRUE);
}
}BOOL CFaceView::ExtractAVIFrames(CString szFileName)
{
    AVIFileInit();    PAVIFILE avi;
    int res=AVIFileOpen(&avi, szFileName, OF_READ, NULL);    if (res!=AVIERR_OK)
    {
        //an error occures        if (avi!=NULL)
            AVIFileRelease(avi);
        
        return FALSE;
    }    AVIFILEINFO avi_info;
    AVIFileInfo(avi, &avi_info, sizeof(AVIFILEINFO));    PAVISTREAM pStream;
//get avi stream
    res=AVIFileGetStream(avi, &pStream, streamtypeVIDEO /*video stream*/, 
                                               0 /*first stream*/);    if (res!=AVIERR_OK)
    {
        if (pStream!=NULL)
            AVIStreamRelease(pStream);        AVIFileExit();
        return FALSE;
    }    //do some task with the stream    int iNumFrames;
    int iFirstFrame;    iFirstFrame=AVIStreamStart(pStream);
    if (iFirstFrame==-1)
    {
        //Error getteing the frame inside the stream
        if (pStream!=NULL)
            AVIStreamRelease(pStream);        AVIFileExit();
        return FALSE;
    }    iNumFrames=AVIStreamLength(pStream);
    if (iNumFrames==-1)
    {
        //Error getteing the number of frames inside the stream        
        if (pStream!=NULL)
            AVIStreamRelease(pStream);
        
        AVIFileExit();
        return FALSE;
    }    //getting bitmap from frame    BITMAPINFOHEADER bih;
    ZeroMemory(&bih, sizeof(BITMAPINFOHEADER));    bih.biBitCount=24;    //24 bit per pixel    bih.biClrImportant=0;
    bih.biClrUsed = 0;
    bih.biCompression = BI_RGB;
    bih.biPlanes = 1;
    bih.biSize = 40;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;
    //calculate total size of RGBQUAD scanlines (DWORD aligned)    bih.biSizeImage = (((bih.biWidth * 3) + 3) & 0xFFFC) * bih.biHeight ;

    PGETFRAME pFrame;
    pFrame=AVIStreamGetFrameOpen(pStream, 
         NULL/*(BITMAPINFOHEADER*) AVIGETFRAMEF_BESTDISPLAYFMT*/ /*&bih*/);    //Get the first frame    int index=0;
   for (int i=iFirstFrame; i<iNumFrames; i++)
    {
        index= i-iFirstFrame;        BYTE* pDIB = (BYTE*) AVIStreamGetFrame(pFrame, index);      CreateFromPackedDIBPointer(pDIB, index);
    }
    AVIStreamGetFrameClose(pFrame);    //close the stream after finishing the task    if (pStream!=NULL)
        AVIStreamRelease(pStream);

    AVIFileExit();    return TRUE;
}有的avi文件可以读,但是有的不能读,不能读的问题出在AVIStreamGetFrameOpen这个函数上,这个函数返回为空,不知道是什么原因,请大家指教。

解决方案 »

  1.   

    应该是AVI文件本身的问题吧.你用Media Player播放器试一下.有可能存在文件格式或者版本方面的差异.
      

  2.   

    avi可以有很多编码格式,形成不同标准的avi文件,如mpeg2、mpeg4等不能播放,可能是解码器不支持
      

  3.   

    使用Windows media player是可以播放的,这个程序读有的avi文件是可以的,请高手帮忙啊,着急ing
      

  4.   

    avi只是一个复合系统,关键要看他复合进去的音视频格式,通常没有经过编码的视频楼主是可以直接得到图像的,经过编码(XVID, H264, MPEG等)的肯定要解码器才能得到图像。没有经过编码的一般文件很大,一分钟大概有几百M大。通常播放器是用directshow框架来播放的,楼主了解下directshow,用graphedit看一下就知道了。
      

  5.   

    “有的avi文件可以读,但是有的不能读,不能读的问题出在AVIStreamGetFrameOpen这个函数上,这个函数返回为空,不知道是什么原因,请大家指教。”在函数AVIStreamGetFrameOpen中,第二个参数不要用NULL