各位谁知道怎么来显示AVI文件吗????就是说当我OPEN一个AVI文件时,我想显示出它的第一帧,接着在对其进行播放,谁有这方面的资料啊!!麻烦贡献一下!!谢谢拉!!!!!!!!
[email protected]!!

解决方案 »

  1.   

    #include "stdafx.h"
    #include "getframe.h"
    #include "getframeapi.h"
    #include <vfw.h>BOOL 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));    CString szFileInfo;
        szFileInfo.Format("Dimention: %dx%d\n"
                          "Length: %d frames\n"
                          "Max bytes per second: %d\n"
                          "Samples per second: %d\n"
                          "Streams: %d\n"
                          "File Type: %d", avi_info.dwWidth,
                                avi_info.dwHeight,
                                avi_info.dwLength,
                                avi_info.dwMaxBytesPerSec,
                                (DWORD) (avi_info.dwRate / avi_info.dwScale),
                                avi_info.dwStreams,
                                avi_info.szFileType);    AfxMessageBox(szFileInfo, MB_ICONINFORMATION | MB_OK);    PAVISTREAM pStream;
        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;
    }
    ///The only one function that I must describe more about is: CreateFromPackedDIBPointer(). This function takes a pointer returned from AVIStreamGetFrame() function and creates a bitmap from it. As you know, the AVIStreamGetFrame() returns a pointer to DIB information about the frame. We take this pointer and create a bitmap from it.BOOL CreateFromPackedDIBPointer(LPBYTE pDIB, int iFrame)
    {
        ASSERT(pDIB!=NULL);    //Creates a full-color (no palette) DIB from a pointer to a
        //full-color memory DIB    //get the BitmapInfoHeader
        BITMAPINFOHEADER bih;
        RtlMoveMemory(&bih.biSize, pDIB, sizeof(BITMAPINFOHEADER));    //now get the bitmap bits
        if (bih.biSizeImage < 1)
        {
            return FALSE;
        }    BYTE* Bits=new BYTE[bih.biSizeImage];    RtlMoveMemory(Bits, pDIB + sizeof(BITMAPINFOHEADER), bih.biSizeImage);    //and BitmapInfo variable-length UDT
        BYTE memBitmapInfo[40];
        RtlMoveMemory(memBitmapInfo, &bih, sizeof(bih));    BITMAPFILEHEADER bfh;
        bfh.bfType=19778;    //BM header
        bfh.bfSize=55 + bih.biSizeImage;
        bfh.bfReserved1=0;
        bfh.bfReserved2=0;
        bfh.bfOffBits=sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER); //54
        
        CString FileName;
        FileName.Format("Frame-%05d.bmp", iFrame);
        
        FILE* fp=fopen(FileName, "wb");
        if (fp!=NULL)
        {
            fwrite(&bfh, sizeof(bfh), 1, fp);
            fwrite(&memBitmapInfo, sizeof(memBitmapInfo), 1, fp);
            fwrite(Bits, bih.biSizeImage, 1, fp);
            fclose(fp);
        }
        else
        {
            TRACE0(_T("Error writing the bitmap file"));
            return FALSE;
        }    delete [] Bits;
        return TRUE;
    }
      

  2.   

    太平洋大哥很感谢你一直来对小弟的帮助!!你能不能把完整的CODE借我参考一下!
    我前面使用了你的那代码但是发现很多错误!!麻烦你把完整的代码借小弟参考一下!
    谢谢拉![email protected]
      

  3.   

    太平洋大哥 我昨天晚上研究了你的代码?我感觉你这个代码并不能在窗口中显示!
    我看了一些资料要显示VIDEO应该要调用DRAWDIB(),你怎么没有调用啊????
      

  4.   


    BOOL CGetframeDoc::OnOpenDocument(LPCTSTR lpszPathName) 
    {
    if (!CDocument::OnOpenDocument(lpszPathName))
    return FALSE;

    // TODO: Add your specialized creation code here
    ExtractAVIFrames(lpszPathName);

    return TRUE;
    }