XVID编解码器通过vfw:创建灰度8位视频失败

时间:2012-05-18 14:21:42

标签: video-encoding vfw

我编写了一个应用程序,使用Video for Windows(VFW)从实时摄像机图像记录XVID电影。如果相机设置为彩色,这可以正常工作。当我将其切换到b& w模式(即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。

有什么想法吗?

欢呼声 亨德里克

1 个答案:

答案 0 :(得分:0)

我已经做了一些研究并研究了xvidcore源代码,遗憾的是,很明显不支持8位灰度源。 vfw / src / codec.c中的函数get_colorspace()仅识别RGB和YUV模式。

虽然我没有研究过这些来源,但divx编解码器的情况可能与此类似。

所以答案是:选择不同的编解码器或限制为彩色视频。