Кодек XVID через vfw: не удается создать 8-битное видео в оттенках серого

Я написал приложение, которое записывает фильмы XVID с изображения с камеры в реальном времени, используя Video for Windows (VFW). Это прекрасно работает, если камера настроена на цвет. Когда я переключаю его в черно-белый режим (т.е. 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 могут отображаться без проблем.

Есть идеи?

ура Хендрик


person Hendrik    schedule 18.05.2012    source источник


Ответы (1)


Я провел еще несколько исследований и изучил исходный код xvidcore, который, к сожалению, ясно дает понять, что 8-битные источники оттенков серого не поддерживаются. Функция get_colorspace() в vfw/src/codec.c распознает только режимы RGB и YUV.

С кодеком divx ситуация наверное такая же, хотя исходники я не изучал.

Итак, ответ: выберите другой кодек или ограничьтесь цветным видео.

person Hendrik    schedule 21.05.2012