我编写了一个应用程序,它使用 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。
有任何想法吗?
干杯亨德里克