2011-09-13 67 views
1

我正在使用DirectShow.Net並試圖在類上實現ISampleGrabberCB。ISampleGrabber回調沒有被調用

爲了建立抓取的圖形,我按照這個清單:

  1. 創建SampleGrabber對象

  2. 定義的MediaType格式(AMMediaType:視頻,RGB,VideoInfo)和將其設置爲SampleGrabber對象。 HRESULT爲0,所以我認爲沒關係。

  3. 我用sampleGrabber.SetCallback(this,0)設置了回調。我傳遞「this」是因爲ISampleGrabber是在類中實現和定義的;第二個參數是0,因爲我想調用SampleCB方法。

  4. 最後,我將過濾器添加到圖中。 HRESULT再次爲0.

但是ISampleGrabber.SampleCB方法未被調用。

你對這種不正當行爲的原因有什麼想法嗎?

[編輯]

我發現了這是怎麼回事了!但我仍然需要一些幫助。我擁有的網絡攝像機都會返回YUY2子視頻格式。如上所述,我使用的代碼強制MediaType爲RGB24。在運行時我可以看到HResult爲0,因此沒關係。但是因爲它們「不兼容」,所以不會調用示例回調。如果我刪除了子類型顯式定義,則回調被擊中。然而我收到的框架是YUY2;它不是有效的位圖,因此它看起來「損壞」,「失真」。

在這一點上,我想知道我是如何成功地強制RGB24格式或如何將視頻幀轉換爲RGB24格式。

我在谷歌上花了相當多的時間試圖找到一個有效的答案,但我沒有運氣。

有什麼想法?

乾杯。 Gianluca。

+1

我們可以看到一些代碼嗎? – Goz

+0

@Goz:代碼非常豐富,可以分成幾個功能。你想看什麼部分? –

+0

根據您的編輯情況,可能會很高興看到連接濾鏡的部分 – Goz

回答

0

您需要添加一個YUY2 RGB轉換器。

查找Color Converter DSP將輸入引腳設置爲YUY2並將輸出引腳設置爲RGB32。然後添加採樣器。

由於上述過濾器是DMO過濾器,因此您需要使用DirectShow DMO wrapper。該鏈接有一個使用它的好例子。

+0

感謝您的回答!當我在DirectShow上邁出第一步時,我不知道如何去做你說的話。您能否指出一些可以幫助我解決問題或提供一些片段的鏈接?提前致謝! –

+0

@Gianluca Colucci:不知道該怎麼做? – Goz

+0

我設法使它與:grpBuilder.RenderStream(PinCategory.Capture,MediaType.Video,this.capDev,null,(IBaseFilter)smpGrabber)。沒有它,抓取器沒有連接,我不明白它是如何工作的。更進一步,我有:hr = grpBuilder.RenderStream(PinCategory.Preview,MediaType.Video,this.capDev,null,Renderer);有用。但是在概念上是對的嗎? –

1

你從來沒有提到你在圖中連接Sample Grabber,這顯然是必不可少的。由於在某些時候,你有回調打擊,當然你可以用某種方式連接它,並且仍然以你連接的方式排除媒體管道故障,並且有效的過濾器圖形拓撲結構是你想要檢查的第一件事。

24位RGB子類型是一種媒體類型的「公分母」,因此您幾乎可以在樣本採集卡上找到它。爲了達到這個目的,你用主要類型和子類型初始化採樣卡格式。但是,您不需要在那裏進行格式化。解碼器到RGB 24將自動提供。總而言之,如果某件事不起作用,你想知道你最終得到的拓撲結構,並且Sample Grabber需要正確的初始化。

相關問題