2014-04-10 38 views
0

好吧,我一直在尋找一段時間,我目前很難過。我很感激任何幫助,我可以在這找到。將FFDShow編碼爲DirectShow圖形以進行去隔行掃描?

我有一個應用程序,打開多個過濾器圖形的多個攝像頭。它們中的每一個都是相同的,所以我只是要說明其中之一。高層次的想法是通過視頻採集卡讀取PAL視頻流,然後由我們的應用程序處理。該應用程序構建DirectShow視頻過濾器圖形。每個圖形都包含一個視頻源,一個樣本採集器過濾器和一個null呈現器過濾器。抓取的樣本然後用於顯示視頻中的各種靜止圖像,並使用OpenCV進行繪製和縮放。那麼,目前filter圖表看起來是這樣的:

[視頻來源] - > [/ *某些類型的編解碼器過濾器*的/] - > [樣品採集卡] - > [Null渲染]

我說「某種」,因爲我允許的DirectShow渲染它本身,使用

hr = pCaptureGraphs[i]->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pSourceFilters[i], pGrabberFilters[i], pNullRendFilters[i]); 

不過,我有交錯從PAL視頻未來的一個問題。使用FFDShow和GraphEditor應用程序,我構建了一個類似於上圖的圖形,但在SampleGrabber之前使用FFDShow過濾器,設置爲對視頻源執行立體去隔行掃描。或者,甚至更好的是,使用它來解碼來自視頻採集卡的視頻流並對其進行解交織。

我的問題是這樣的:我不知道如何在代碼中創建一個FFDShow過濾器。有沒有一種方法可以在代碼中添加過濾器,如果有的話,我該如何包含或鏈接到項目?或者,有沒有辦法將DirectShow配置爲使用FFDShow過濾器在調用RenderStream時執行去隔行掃描?

任何有關這個主題的幫助將不勝感激。

更新1:

好了,我發現電腦我開發上,在Windows 8.1的機器,不運行因某種原因的FFDShow過濾器,但目標機器上,Windows 7的機器,運行完全相同的代碼就好了。似乎那裏存在某種不兼容性。 :/

現在進入下一階段:去隔行。我設法隔離了Sample Grabber過濾器和它之前的過濾器(在這種情況下,是一個AVI解壓縮器),並且我已經將它們彼此斷開連接,然後在它們之間連接了FFDShow原始視頻過濾器。另一個FFDShow過濾器以某種方式混淆了圖形,即沒有從採樣器中讀取輸出,所以我將使用前一個過濾器。現在問題變成了,我如何激活視頻輸入的去隔行?我在GraphEdit程序中構建了同樣的圖形,並且隔行掃描消失了,所以我知道過濾器能夠做到。但是,我如何在代碼中啓用它?

更新2 /解決方案

我設法得到它的工作通過運行過濾圖形,然後選擇過濾器的托盤圖標,通過圖標上單擊鼠標右鍵設置隔行掃描菜單。這工作完美。感謝Roman R的幫助。

+0

您應該爲跟進開始一個新問題。這是問答網站。此外,您需要標記答案以指示未來訪問者的解決方案。 –

+0

酷,羅馬。我會在底部接受你的答案,然後添加更多關於我如何使其工作的信息。謝謝你的幫助。 – Scratch17

回答

1

您需要在代碼中創建FFDshow視頻解碼器的實例,例如,:

class __declspec(uuid("{04FE9017-F873-410E-871E-AB91661A4EF7}")) FfdshowVideoDecoder; 
CComPtr<IBaseFilter> pBaseFilter; 
HRESULT nResult = pBaseFilter.CoCreateInstance(__uuidof(FfdshowVideoDecoder)); 

然後你IGraphBuilder::AddFilter到過濾器圖形

然後你從這個實例查詢輸入/輸出IPin S和連接到其它適當的過濾器,類似於你會怎麼做它在GraphEdit中交互。如果您將此IBaseFilter用作中間過濾器,您也可以通過RenderStream完成此操作。

+0

我使用C++對於這一點,所以我的代碼看起來像 'HR = CoCreateInstance的(CLSID_FFDSHOW,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(無效**)pFFDShowfilters [I]);' 其中 'DEFINE_GUID(CLSID_FFDSHOW,0x04fe9017, 0xf873,0x410e,0x87,0x1e,0xab,0x91,0x66,0x1a,0x4e,0xf7);' 但是這不起作用:HRESULT錯誤地回來了。我錯過了什麼?我只需要創建過濾器。將它放在正確的位置不會成爲問題。 – Scratch17

+0

代碼是正確的。您可能會混淆Win32/x64代碼。 FFDshow需要安裝/可用來匹配代碼的位數。 –

+0

我嘗試安裝64位和32位,沒有運氣。有我需要鏈接的圖書館嗎? – Scratch17

相關問題