0

Video for Windows(VFW)を使用して、ライブカメラ画像からXVIDムービーを記録するアプリケーションを作成しました。カメラがカラーに設定されている場合、これは正常に機能します。白黒モード(つまり、8ビットグレースケール)に切り替えると、関数AVIStreamSetFormatはAVIERR_BADFORMATを返します。

私のコードからの抜粋:

BITMAPINFO *bmi = image->bitmapInfo();

AVISTREAMINFO info;
::ZeroMemory(&info,sizeof(AVISTREAMINFO));
info.fccType               = streamtypeVIDEO;
info.dwScale               = 1000;
info.dwRate                = int(framesPerSecond * 1000);
info.dwSuggestedBufferSize = image->bufferSize();
SetRect(&info.rcFrame, 0, 0, image->width(), image->height());

AVICOMPRESSOPTIONS options;
::ZeroMemory(&options, sizeof(options))
options.fccType = streamtypeVIDEO;
options.fccHandler = mmioFOURCC('X','V','I','D');
options.dwFlags = AVICOMPRESSF_VALID | AVICOMPRESSF_KEYFRAMES;

info.fccHandler = options.fccHandler;
AVIFileCreateStream(pfile, &pavi, &info);

options.dwKeyFrameEvery = 1;
options.dwQuality = -1;
options.dwInterleaveEvery = 0;

HRESULT result = AVIMakeCompressedStream(&pcompressed, pavi, &options, NULL);

size_t bmisize = bmi->bmiHeader.biSize + bmi->bmiHeader.biClrUsed*sizeof(RGBQUAD);
result = AVIStreamSetFormat(pcompressed, 0, &bmi->bmiHeader, bmisize);

上記のように、このコードは24ビットDIBで機能しますが、8ビットインデックス付きDIBでは機能しません。8ビットDIBは問題なく表示できます。

何か案は?

ヘンドリックを応援します

4

1 に答える 1

0

私はさらに調査を行い、xvidcoreソースコードを調べましたが、残念ながら、8ビットのグレースケールソースがサポートされていないことが非常に明確になっています。vfw / src / codec.cの関数get_colorspace()は、RGBモードとYUVモードのみを認識します。

私はソースを研究していませんが、状況はおそらくdivxコーデックと同じです。

したがって、答えは次のとおりです。別のコーデックを選択するか、カラービデオに制限します。

于 2012-05-21T08:29:19.767 に答える