1

ビットマップからaviファイルを作成するのに助けが必要です。問題は、最終的に破損したaviファイルを取得することです。HEX_Editorで読んだ場合、aviヘッダー全体は0です。

Borland C ++Builder6とWindows764ビットを使用しています

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を埋める方法、または使用している関数が正しいかどうかは正確にはわかりません...

PS:これは私の最初の投稿です。さらに情報が必要な場合はお知らせください。

4

1 に答える 1

1

少し前ですが、解決策は次のとおりです。

ストリーミングが終了したら、AVIStreamRelease()を使用してストリームを閉じる必要があります。その場合にのみ、ヘッダーが生成され、ファイルに書き込まれます。

于 2013-02-18T15:25:19.493 に答える