2015-04-03 3 views
0

Я работал над библиотекой захвата аудио/видео для 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! 
    } 
} 

Почему размер буфера выборки не соответствует ожидаемому размеру в этом случае? Как я могу решить эту проблему?

Заранее благодарен!

+0

Я не думаю, что 'pBuffer-> GETSIZE()' компилирует. – wimh

+0

Вы правы Вимм, я исправил его pBuffer-> GetSize() -> pSample-> GetSize() – skuallpa

ответ

1

Образец обратного вызова Grabber всегда будет возвращать «правильный» размер в том виде, в котором он соответствует фактическим размерам данных и форматам, используемым в потоковом конвейере.

Если вы видите несоответствие, это означает, что ваша топология фильтра-фильтра отличается от того, что вы ожидаете от него. Вам необходимо просмотреть график (например, using remote connection by GraphEdit), проверить типы носителей и проверить, почему он был построен неправильно. Например, вы можете применять форму своего интереса после подключения контактов, что слишком поздно.

Смотрите также:

+0

Спасибо, Роман, вы были правы, проблема была в том порядке, в котором я делал. Я слишком рано подключил булавку. И спасибо за указание на другие ссылки, они наверняка будут полезны! – skuallpa

Смежные вопросы