想把许多BMP文件按一帧帧写入内存中然后转换成AVI格式在播放出来,这个问题怎样能实现?请帮帮我,谢谢了!

解决方案 »

  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.   

    http://www.wischik.com/lu/programmer/avi_utils.html
    http://www.codeproject.com/audio/avigenerator.asp
      

  3.   

    http://www.codeproject.com/bitmap/createmovie.asp
      

  4.   

    哈哈,我怎么看见你到处溜达啊!!!!但是我要的BMP->AVI,可是我现在只实现拉AVI->BMP解决了一定会给分的拉~~~~~~~~~~~~~
      

  5.   

    //////////////////////////////////////////////////////////////
    //&ETH;&acute;AVI&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷
    void CSetOpenGLEnv::WriteAVIStream()
    {
    HRESULT hr; //&ETH;&acute;&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷
    hr = AVIStreamWrite(psCompressed, // &Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&Ouml;&cedil;&Otilde;&euml;
    (lPageNum-1) * 1, // &micro;±&Ccedil;°&Ouml;&iexcl;&micro;&Auml;&Ecirc;±&frac14;&auml;
    // &Ograve;ò&Icirc;&ordf;&frac14;&AElig;&Ecirc;&yacute;&acute;&Oacute;0&iquest;&ordf;&Ecirc;&frac14;&pound;&not;&para;&oslash;&Ocirc;&Uacute;WriteAVIHead()&Ouml;&ETH;m_PageNum&Ograve;&Ntilde;&frac14;&Oacute;1&pound;&not;&Euml;ù&Ograve;&Ocirc;&Otilde;&acirc;&Agrave;&iuml;&frac14;&otilde;1
    1, // &ETH;&acute;&Egrave;&euml;&micro;&Auml;&Ouml;&iexcl;&Ecirc;&yacute;
    (LPBYTE) alpbi + // &Ouml;&cedil;&Iuml;ò&Icirc;&raquo;&Iacute;&frac14;&Ouml;&iexcl;&micro;&Auml;&Ouml;&cedil;&Otilde;&euml;
    alpbi->biSize +
    alpbi->biClrUsed * sizeof(RGBQUAD),
    alpbi->biSizeImage, // &cedil;&Atilde;&Ouml;&iexcl;&Iacute;&frac14;&Iuml;ó&micro;&Auml;&acute;ó&ETH;&iexcl;
    AVIIF_KEYFRAME, // &cedil;&Atilde;&Ouml;&iexcl;×÷&Icirc;&ordf;&sup1;&Oslash;&frac14;ü&Ouml;&iexcl;
    NULL,
    NULL); //&Ouml;&iexcl;&frac14;&AElig;&Ecirc;&yacute;&AElig;÷&frac14;&Oacute;1
    lPageNum++; if (hr != AVIERR_OK) return;}
    //////////////////////////////////////////////////////////////
    //&ETH;&acute;AVI&Iacute;·&ETH;&Aring;&Iuml;&cent;
    void CSetOpenGLEnv::WriteAVIHead()
    {
    AVISTREAMINFO strhdr;
    AVICOMPRESSOPTIONS opts;
    AVICOMPRESSOPTIONS FAR * aopts[1] = {&opts};
    HRESULT hr; //&Ocirc;&Uacute;OnDraw()&Ouml;&ETH;×÷&Oacute;&Atilde;&pound;&not;±í&Ecirc;&frac34;&Iuml;&Acirc;&acute;&Icirc;&frac12;&laquo;&ETH;&acute;&Egrave;&euml;AVI&Icirc;&Auml;&frac14;&thorn;&Aacute;÷
    lPageNum++; //&Eacute;è&Ouml;&Atilde;AVI&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&ETH;&Aring;&Iuml;&cent;
    memset(&strhdr, 0, sizeof(strhdr));
    strhdr.fccType                = streamtypeVIDEO; //&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&ETH;&Aring;&Iuml;&cent;
    strhdr.fccHandler             = 0;
    strhdr.dwScale                = 1; //±&auml;±&Egrave;
    strhdr.dwRate                 = Avi_Rate; //AVI&sup2;&yen;·&Aring;&Euml;&Ugrave;&para;&Egrave;&pound;&not;&Ocirc;&Uacute;&frac12;&ccedil;&Atilde;&aelig;&Ouml;&ETH;&Ecirc;&auml;&Egrave;&euml;
    strhdr.dwSuggestedBufferSize  = alpbi->biSizeImage;
    SetRect(&strhdr.rcFrame, 0, 0, //&Ecirc;&auml;&Egrave;&euml;AVI&Atilde;&iquest;&Ouml;&iexcl;&Iacute;&frac14;&Iuml;ó&micro;&Auml;&sup3;&szlig;&acute;&ccedil;
        (int) alpbi->biWidth,
        (int) alpbi->biHeight); //&frac12;¨&Aacute;&cent;AVI&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&Icirc;&Auml;&frac14;&thorn;
    hr = AVIFileCreateStream(pfile,     // &Icirc;&Auml;&frac14;&thorn;&Ouml;&cedil;&Otilde;&euml;
             &ps, // &Aacute;÷&Ouml;&cedil;&Otilde;&euml;
             &strhdr); // &Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&Iacute;·&ETH;&Aring;&Iuml;&cent;
    if (hr != AVIERR_OK) VideoRecordEnd(); //&Eacute;è&Ouml;&Atilde;AVI&Ntilde;&iexcl;&Iuml;&icirc;&pound;&not;&Ntilde;&iexcl;&Ocirc;&ntilde;&Ntilde;&sup1;&Euml;&otilde;&Agrave;à&ETH;&Iacute;
    memset(&opts, 0, sizeof(opts)); //&Oacute;&Eacute;&Oacute;&Uacute;&cedil;&Atilde;&ordm;&macr;&Ecirc;&yacute;&sup2;&raquo;&Auml;&Uuml;&Ocirc;&Uacute;&Ograve;&Ntilde;&AElig;&ocirc;&para;&macr;&para;¨&Ecirc;±&AElig;÷Timer&Iuml;&Acirc;×÷&Oacute;&Atilde;&pound;&not;&Ouml;&raquo;&Auml;&Uuml;&Ocirc;&Uacute;&AElig;&ocirc;&para;&macr;&para;¨&Ecirc;±&AElig;÷&Ccedil;°&Ecirc;&sup1;&Oacute;&Atilde;&pound;&not;·&ntilde;&Ocirc;ò&Auml;&Uacute;&acute;&aelig;&sup3;&aring;&Iacute;&raquo;
    //&Ograve;ò&acute;&Euml;&Otilde;&acirc;&Agrave;&iuml;&sup2;&raquo;&micro;÷&Oacute;&Atilde;&cedil;&Atilde;&ordm;&macr;&Ecirc;&yacute;&pound;&not;&Ecirc;&Oacute;&AElig;&micro;&Ntilde;&sup1;&Euml;&otilde;&sup2;&Eacute;&Oacute;&Atilde;&Egrave;±&Ecirc;&iexcl;&Ouml;&micro;&pound;&not;&Icirc;&ordf;·&Ccedil;&Ntilde;&sup1;&Euml;&otilde;&Ecirc;&Oacute;&AElig;&micro;
    //if (!AVISaveOptions(NULL, 0, 1, &ps, (LPAVICOMPRESSOPTIONS FAR *) &aopts))
    //    OnVideoRecordEnd(); //&Ntilde;&sup1;&Euml;&otilde;&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷
    hr = AVIMakeCompressedStream(&psCompressed, ps, &opts, NULL);
    if (hr != AVIERR_OK) VideoRecordEnd(); //&Eacute;è&Ouml;&Atilde;&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&cedil;&ntilde;&Ecirc;&frac12;
    hr = AVIStreamSetFormat(psCompressed, 0,
           alpbi,
           alpbi->biSize +  
           alpbi->biClrUsed * sizeof(RGBQUAD));
    if (hr != AVIERR_OK) VideoRecordEnd();
    }//////////////////////////////////////////////////////////////
    //&Iacute;&pound;&Ouml;&sup1;&Acirc;&frac14;&Ouml;&AElig;AVI
    void CSetOpenGLEnv::VideoRecordEnd() 
    {
    //&Acirc;&frac14;&Iuml;&ntilde;&frac12;á&Ecirc;&oslash;±ê&Ouml;&frac34;
    bVideoRecord = FALSE;
    // lPageNum  = 0;
    //&Eacute;&frac34;&sup3;&yacute;&Ograve;&Ntilde;&Eacute;ê&Ccedil;&euml;&micro;&Auml;&Auml;&Uacute;&acute;&aelig;&Ouml;&cedil;&Otilde;&euml;
    delete pBitmap;
    delete pMemDC;
    pBitmap = NULL;
    pMemDC  = NULL;
    // &sup1;&Oslash;±&Otilde;AVI&Ecirc;&Oacute;&AElig;&micro;&Aacute;÷&Ouml;&cedil;&Otilde;&euml;
    if (ps) AVIStreamClose(ps);
    if (psCompressed) AVIStreamClose(psCompressed);
    //&sup1;&Oslash;±&Otilde;AVI&Icirc;&Auml;&frac14;&thorn;&Ouml;&cedil;&Otilde;&euml;
    if (pfile) AVIFileClose(pfile);
    //&Iacute;&Euml;&sup3;&ouml;AVI&Icirc;&Auml;&frac14;&thorn;
    AVIFileExit();
    }//////////////////////////////////////////////
      

  6.   

    2005年9月的某天晚上,我用了两个多小时帮别人写了一个类似功能的程序,只不过对方要求是将bmp/jpeg等转换程mpeg格式的VCD文件,当时得了4000RMB