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

问题描述:

我已经编写了一个应用程序,使用Video for Windows(VFW)从实时相机图像中记录XVID电影。如果相机设置为彩色,这可以正常工作。当我切换到w模式(即8位灰度)时,AVIStreamSetFormat函数返回AVIERR_BADFORMAT。从我的代码通过vfw XVID编解码器:创建灰度8位视频失败

摘录:

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可以毫无问题地显示出来。

任何想法?

欢呼 亨德里克

我已经做了一些调查研究,并调查了xvidcore下的源代码,这使得很不幸它很清楚,8位灰度来源不被支持。 vfw/src/codec.c中的函数get_colorspace()只能识别RGB和YUV模式。

这种情况可能与divx编解码器一样,虽然我还没有研究过这些资源。

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