当前位置: 代码迷 >> 多媒体/流媒体开发 >> 请问大侠:位图数据写入AVI,生成AVI文件里面没有AVI文件头数据。多谢
  详细解决方案

请问大侠:位图数据写入AVI,生成AVI文件里面没有AVI文件头数据。多谢

热度:6448   发布时间:2013-02-26 00:00:00.0
请教大侠:位图数据写入AVI,生成AVI文件里面没有AVI文件头数据。谢谢!
请教一下:我使用DIB创建AVI 生成的avi 中没有文件头数据,文件里有数据,但没有RIFF等信息
如何把avi文件头数据写入到avi文件中?谢谢大家!

C/C++ code
bool SaveToAVI(LPCSTR filename,LPCSTR avifilename){    void* pbmpbuffer =NULL;    //创建avi    LONG hr;          //存储avifile指针    PAVIFILE pfile =NULL;          //AVI流信息    AVISTREAMINFO strhdr;             PAVISTREAM ps =NULL;         //对bitmap信息头    BITMAPINFOHEADER bi;                  //bitmap信息头设置    bi.biSize=sizeof(BITMAPINFOHEADER);    bi.biWidth = image->getWidth();    bi.biHeight = image->getHeight();    bi.biPlanes=1;    bi.biCompression = BI_RGB;    bi.biSizeImage = 0x10000;    bi.biXPelsPerMeter = 0;    bi.biYPelsPerMeter = 0;    bi.biClrImportant = 0;    bi.biClrUsed = 0;         //只处理8位的位图    bi.biBitCount = 8;         //初始化    AVIFileInit();          // opens AVIFile library          //打开avi文件    hr = AVIFileOpen(&pfile, avifilename, OF_WRITE | OF_CREATE, 0L);     if (hr != 0){             // Handle failure.        return false;     }          //对AVISTREAMINFO 结构体变量strhdr进行设置    _fmemset(&strhdr, 0, sizeof(strhdr));    strhdr.fccType                = streamtypeVIDEO;// stream type 视频流    strhdr.fccHandler             = 0;    strhdr.dwScale                = 1;    strhdr.dwRate                 = 15;            // 15 fps    strhdr.dwSuggestedBufferSize  = bi.biSizeImage;    SetRect(&strhdr.rcFrame, 0, 0,            // rectangle for stream        (int) bi.biWidth,        int) bi.biHeight);    // Create a stream using AVIFileCreateStream. 创建视频流    hr = AVIFileCreateStream(pfile,            // file pointer        &ps,            // returned stream pointer        &strhdr);        // stream header    if (hr != AVIERR_OK) //Stream created OK? If not, close file.     {            AVIFileRelease(pfile);             return false;    }                 // Set format of new stream using AVIStreamSetFormat. 设置流格式    hr = AVIStreamSetFormat(ps, 0, &bi, sizeof(bi));     if (hr != 0) {         AVIStreamRelease(ps);         AVIFileRelease(pfile);         return false;     }                long imageframetotal = image->getFrameCount();                  //每一次循环,pbmpbuffer不同,即把不同的dib位图数据写入流中        for (int framenum = 0;framenum<imageframetotal;framenum++)        {                          //pbmpbuffer指针指向dib的图像数据,此空间分配大小为bi.biSizeImage                image->createWindowsDIB(pbmpbuffer, bi.biSizeImage, framenum, bi.biBitCount, 1, 1);                           //把pbmpbuffer所指向的数据写入avi流中            hr = AVIStreamWrite(ps, framenum, 1,pbmpbuffer,bi.biSizeImage, AVIIF_KEYFRAME, NULL, NULL);             pbmpbuffer = NULL;            if (hr != AVIERR_OK)            {                return false;            }        }                                    //关闭文件        AVIFileRelease(pfile);  // closes the file                   //退出        AVIFileExit();          // releases AVIFile library     }}


我生成的avi文件,前面全是0,没有RIFF等信息,在文件的末尾有数据,还望高手看看,谢谢!

我的avi文件:
00 00 00 00 00 00
00 00 00 00 00 00
直到2000h行才有数据

大伙帮我看看是哪出问题了?谢谢大家!

------解决方案--------------------------------------------------------
AVIFileCreateStream
AVIMakeCompressedStream
AVIStreamSetFormat
------解决方案--------------------------------------------------------
全部是0 是放不出来的哦~
------解决方案--------------------------------------------------------
检查一下这句:hr = AVIStreamSetFormat(ps, 0,alpbi,alpbi->biSize + alpbi->biClrUsed * sizeof(RGBQUAD));
看看问题会不会出在这里。

------解决方案--------------------------------------------------------
AVIStreamSetFormat这个函数中的参数要设置要注意,特别是要填入的位图信息参数数据部分
  相关解决方案