我正在使用Media Foundation開發Windows音頻/視頻捕獲庫。但是,我遇到了Windows 8.1上某些網絡攝像頭描述的問題in this post。因此,我決定使用Directshow來實現另一個實現,以在我的應用程序中支持驅動程序尚未更新的網絡攝像頭。Sample Grabber返回的IMediaSample具有意想不到的緩衝區大小
該庫工作得很好,但我注意到一些網絡攝像機的樣本(IMediaSample)返回的問題根據啓動攝像機之前設置的格式沒有達到預期的大小。
例如,我有這種情況,其格式集的子類型爲MEDIASUBTYPE_RGB24(每個像素3個字節),幀大小爲640x480。當應用格式時,biSizeImage(來自BITMAPINFOHEADER)的分辨率爲640 * 480 * 3 = 921600。 IAMStreamConfig :: SetFormat()方法成功應用該格式。
hr = pStreamConfig->SetFormat(pmt);
我還設置了格式的樣品採集卡接口如下:
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 2015-04-06 10:06:04
你是對的Wimmel,我解決了它pBuffer-> GetSize() - > pSample-> GetSize() – skuallpa 2015-04-06 12:30:22