请教一下:我使用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这个函数中的参数要设置要注意,特别是要填入的位图信息参数数据部分