使用Video for Windows的Avi位图,C

我需要一些帮助创build一个AVI文件的位图。 问题是,最后我得到一个损坏的AVI文件。 如果我用HEX_Editor读取它的整个AVI头为0 …

我使用Borland C ++ Builder 6和Windows 7 64位

AVIINFO结构:

typedef struct { PAVISTREAM aviStream; PAVISTREAM aviStreamCompressed; PAVIFILE aviFile; AVISTREAMINFO avistInfo; AVICOMPRESSOPTIONS avistComprOpts; unsigned long framenumber; // which frame will be added next } AVIINFO, *PAVIINFO; 

pstBmpInfo已经像这样被填充了:

 biSize = 40 biWidth = 800 biHeight = 600 biPlanes = 1 biBitcount = 24 biSizeImage = 1440000 others are 0 int initAvi(AVIINFO *aviInfo, BMPINFOHEADER *pstBmpInfo) { /* AVIFile Library initialisieren */ AVIFileInit(); /* File erstellen */ if (AVIFileOpen(&(aviInfo->aviFile), "avistream.avi", OF_CREATE|OF_WRITE, NULL) != 0) { printf("Error creating AVIFile...\n%s\n", strerror(errno)); return -1; } memset(&(aviInfo->avistInfo), 0, sizeof(aviInfo->avistInfo)); memset(&(aviInfo->avistComprOpts), 0, sizeof(aviInfo->avistComprOpts)); /* AVISTREAMINFO Optionen setzen */ aviInfo->avistInfo.fccType = streamtypeVIDEO; aviInfo->avistInfo.fccHandler = mmioFOURCC('M','S','V','C'); aviInfo->avistInfo.dwRate = STREAM_FPS; // 10 aviInfo->avistInfo.dwScale = 1; aviInfo->avistInfo.dwSuggestedBufferSize = pstBmpInfo->biSizeImage; aviInfo->avistInfo.rcFrame.bottom = pstBmpInfo->biHeight; aviInfo->avistInfo.rcFrame.right = pstBmpInfo->biWidth; aviInfo->avistInfo.dwQuality = -1; // default quality /* Stream erstellen */ if (AVIFileCreateStream(aviInfo->aviFile ,&(aviInfo->aviStream), &(aviInfo->avistInfo)) != 0) { printf("Error creating Stream...\nErrorcode: %s\n", strerror(errno)); return -1; } /* AVICOMPRESSOPTIONS Optionen setzen */ aviInfo->avistComprOpts.fccType = streamtypeVIDEO; aviInfo->avistComprOpts.fccHandler = mmioFOURCC('M','S','V','C'); /* */ if (AVIMakeCompressedStream(&(aviInfo->aviStreamCompressed), aviInfo->aviStream, &(aviInfo->avistComprOpts), NULL) != AVIERR_OK) { printf("Error creating compressed Stream...\nErrorcode: %s\n", strerror(errno)); return -1; } /* Streamformat für Bitmaps */ if (AVIStreamSetFormat(aviInfo->aviStreamCompressed, 0, pstBmpInfo, sizeof(*pstBmpInfo)) != 0) { printf("Error setting new Streamformat...\nErrorcode: %s\n", strerror(errno)); return -1; } aviInfo->framenumber = 0; return 0; } 

这是我如何写入文件:

pucBitmapDataBuffer保持Bitmapdata

 . . . . if ((AVIStreamWrite(aviInfo->aviStreamCompressed, aviInfo->framenumber, 1, pucBitmapDataBuffer, sizeof(pucBitmapDataBuffer), AVIIF_KEYFRAME, NULL, NULL)) != 0) { streamErrorCnt++; printf("Could not write Data to Stream...\n%s", strerror(errno)); aviInfo->framenumber++; free(pucBitmapDataBuffer); fclose(FileSource); stDirEp = readdir(DirSource); continue; // get next BMP } else { streamErrorCnt = 0; aviInfo->framenumber++; } . . . . 

我不知道如何填充AVICOMPRESSOPTIONS,或者如果我使用的function是正确的… …

PS:这是我的第一个post,如果你需要更多的信息,请让我知道!

前一段时间,但这里是解决方案:

如果流式传输完成,则必须使用AVIStreamRelease()关闭流。 只有这样Header才会生成并写入文件。