簡體   English   中英

將FFDShow編碼到DirectShow圖形中以進行去隔行處理?

[英]Coding an FFDShow into a DirectShow graph for deinterlacing?

好的,我已經逛了一會兒了,我現在很沮喪。 我很樂意為此提供任何幫助。

我有一個可以在多個過濾器圖上打開多個攝像機的應用程序。 它們中的每一個都是相同的,因此我僅說明其中之一。 高層次的想法是通過視頻采集卡讀取PAL視頻流,然后由我們的應用程序處理。 該應用程序將建立DirectShow視頻過濾器圖形。 每個圖形都包括一個視頻源,一個樣本采集器過濾器和一個空渲染器過濾器。 抓取的樣本然后用於顯示視頻中的各種靜止圖像,並使用OpenCV進行繪制和縮放。 因此,當前的過濾器圖形如下所示:

[視頻源]-> [/ *某種編解碼器過濾器* /]-> [樣本抓取器]-> [空渲染器]

我說“某種”是因為我允許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:

好的,所以我發現我在開發的PC(Windows 8.1計算機)由於某種原因未運行FFDShow篩選器,但是目標計算機(Windows 7計算機)運行的代碼完全相同。 似乎那里存在某種不兼容性。 :/

現在進入下一階段:逐行掃描。 我設法隔離了Sample Grabber過濾器和它之前的過濾器(在本例中為AVI解壓縮器),並已將它們彼此斷開,然后在它們之間連接了FFDShow原始視頻過濾器。 另一個FFDShow過濾器以某種方式弄亂了圖形,使得沒有從樣本采集器讀取任何輸出,因此我將使用前一個過濾器。 現在的問題是,如何激活視頻源的去隔行掃描? 我已經在GraphEdit程序中構建了相同的圖形,並且隔行掃描消失了,所以我知道過濾器可以做到這一點。 但是如何在代碼中啟用它呢?

更新2 /解決方案

通過運行過濾器圖,然后選擇過濾器的任務欄圖標,然后右鍵單擊該圖標,在菜單中設置了逐行掃描,我設法使其正常運行。 那很好。 感謝Roman R的幫助。

您需要使用代碼創建FFDshow Video Decoder的實例,例如:

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

然后將IGraphBuilder::AddFilter到過濾器圖形

然后,您可以從該實例中查詢輸入/輸出IPin ,並適當地連接到其他過濾器,類似於在GraphEdit中進行交互的方式。 如果您將此IBaseFilter用作中間過濾器,則也可以通過RenderStream完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM