2015-04-03 85 views
0

我正在使用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! 
    } 
} 

爲什麼在這種情況下返回的樣本緩衝區大小不是預期的大小?我該如何解決這個問題?

在此先感謝!

+0

我不認爲'pBuffer->的getSize()'編譯。 – wimh 2015-04-06 10:06:04

+0

你是對的Wimmel,我解決了它pBuffer-> GetSize() - > pSample-> GetSize() – skuallpa 2015-04-06 12:30:22

回答

1

示例抓取器回調將始終返回「正確」大小,因爲它與流式管道中使用的實際數據大小和格式相匹配。

如果看到不匹配,這意味着您的濾波器圖形拓撲結構與您所期望的不同。您需要查看圖表(尤其是using remote connection by GraphEdit),檢查介質類型並檢查其構建錯誤的原因。例如,您可能在連接引腳後應用您感興趣的格式,這太遲了。

參見:

+0

感謝羅馬,你是對的,問題是在我做的事情的順序。我太早連接了一個引腳。感謝您指出其他鏈接,他們肯定會對您有所幫助! – skuallpa 2015-04-06 12:31:56