2016-12-07 129 views
1

我嘗試在我的應用程序中使用Media Foundation(「MF」)上的Directshow(「DS」)替換代碼,並遇到一個問題 - 無法在網絡攝像機上使用MF設置所需的fps 。 MF允許我只設置30 fps。如果我嘗試設置25 fps,我總是在SetCurrentMediaType()上得到錯誤0xc00d5212。在DS中,我可以更改該參數。媒體基金會:無法更改攝像頭上的FPS

我的代碼:

ASSERT(m_pReader); //IMFSourceReader *m_pReader; 
IMFMediaType *pNativeType = NULL; 
IMFMediaType *pType = NULL; 
UINT32 w = 1280; 
UINT32 h = 720; 
UINT32 fps = 25; // or 30 

DWORD dwStreamIndex = MF_SOURCE_READER_FIRST_VIDEO_STREAM; 

// Find the native format of the stream. 
HRESULT hr = m_pReader->GetNativeMediaType(dwStreamIndex, 0, &pNativeType); 
if (FAILED(hr)) 
{ 
    //error 
} 

GUID majorType, subtype; 

// Find the major type. 
hr = pNativeType->GetGUID(MF_MT_MAJOR_TYPE, &majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Define the output type. 
hr = MFCreateMediaType(&pType); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Select a subtype. 
if (majorType == MFMediaType_Video) 
{ 
    subtype= MFVideoFormat_RGB24; 
} 
else 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, w, h); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_RATE, fps, 1); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = m_pReader->SetCurrentMediaType(dwStreamIndex, NULL, pType); 
if (FAILED(hr)) 
{// hr = 0xc00d5212 
    //!!!!!error - if fps == 25 
} 
return hr; 

感謝您的幫助。

回答

3

這可能是因爲相機不支持靈活的幀速率值,並且只能在支持的設置中使用,例如:10,15,20,24,30 fps。您應該能夠枚舉支持的媒體類型並選擇適合您的媒體類型 - 這些媒體類型通常包含幀速率選項。

儘管Media Foundation和DirectShow視頻捕獲最終會在相同的後端結束,但行爲可能存在差異。特別是,您正在使用Media Foundation更高級別的API,該API在內部與媒體源進行接口連接,並且可能發生幀速率導致0xC00D5212MF_E_TOPO_CODEC_NOT_FOUND「沒有找到合適的轉換來編碼或解碼內容」混淆,即使技術上是驅動程序可以在各自的模式下捕捉。

參見:

+0

嗨羅馬,我試了你的MF工具,並得到以下結果:我的攝像頭只能工作在1和30幀/秒。但是DS展示了另外一些東西--5,10,15,20,25和30 fps。爲什麼?或者一個網絡攝像頭只有30幀/秒,但DS可以在其他幀速率上分割該幀?這是真的嗎? –

+0

我認爲WDM驅動程序報告多個幀速率,但信息可能不完整並被MF層過濾掉。只是猜測 - 沒有足夠的信息來確定任何事情。 –

+0

嗨,我認爲這個限制與媒體基金會的UVC - USB Video Class - 驅動程序有關。它針對平臺WindowsStore,並針對USB攝像頭進行了優化,不僅可以獲取RGB和MJPEG格式的視頻,還可以使用硬件編碼器的H264和H265格式 - 因此會導致功能受限。爲了獲得更多的功能,你應該使用DShow或寫定時器,它將抓取具有所需幀速率的幀。 –

0

我添加了FPS控制仿計時器進入代碼。所以在開始時,我設置了30 fps,然後以fps爲單位跳過我的應用的一些幀。 謝謝你的幫助。