Я работал над библиотекой захвата аудио/видео для Windows с использованием Media Foundation. Однако я столкнулся с проблемой, описанной in this post для некоторых веб-камер на Windows 8.1. Поэтому я решил использовать еще одну реализацию, используя Directshow для поддержки в своем приложении веб-камер, для которых драйверы еще не обновлены.IMediaSample, возвращенный Sample Grabber, имеет неожиданный размер буфера
Библиотека работает достаточно хорошо, но я заметил проблему с некоторыми веб-камерами, для которых возвращен образец (IMediaSample), не соответствует ожидаемому размеру в соответствии с форматом, который был установлен перед запуском камеры.
Например, у меня есть случай, когда формат имеет подтип MEDIASUBTYPE_RGB24 (3 байта на пиксель), а размер кадра - 640x480. BiSizeImage (от BITMAPINFOHEADER) хорошо подходит 640 * 480 * 3 = 921600 при применении формата. Метод IAMStreamConfig :: SetFormat() позволяет применить формат.
hr = pStreamConfig->SetFormat(pmt);
Я также установить формат с образцом Grabber интерфейса следующим образом:
hr = pSampleGrabberInterface->SetMediaType(pmt);
я применил формат перед началом графа.
Однако в обратном вызове (ISampleGrabberCB :: SampleCB) я получаю образец размером 230400 (который может быть буфером для фрейма размером 320x240 (320 * 240 * 3 = 230400)).
HRESULT MyClass::SampleCB(double sampleTime, IMediaSample *pSample)
{
unsigned char* pBuffer= 0;
HRESULT hr = pSample->GetPointer((unsigned char**) &pBuffer);
if(SUCCEEDED(hr) {
long bufSize = pSample->GetSize();
//bufSize = 230400
}
}
Я пытался исследовать тип носителя возвращаемые с помощью IMediaSample :: метод GetMediaType(), но тип носителя NULL, что означает, согласно the documentation of the GetMediaType method, что тип носителя не изменился (так что я предполагаю, это все еще тот тип мультимедиа, который я применил с помощью функции IAMStreamConfig :: SetFormat()).
HRESULT hr = pSample->GetMediaType(&pType);
if(SUCCEEDED(hr)) {
if(pType==NULL) {
//it enters here => the media type has not changed!
}
}
Почему размер буфера выборки не соответствует ожидаемому размеру в этом случае? Как я могу решить эту проблему?
Заранее благодарен!
Я не думаю, что 'pBuffer-> GETSIZE()' компилирует. – wimh
Вы правы Вимм, я исправил его pBuffer-> GetSize() -> pSample-> GetSize() – skuallpa