2011-11-18 38 views
1

我有一個使用DSPACK組件庫在Delphi 6中編寫的DirectShow變換過濾器。這是一個簡單的音頻混音器,每當嘗試新連接時都會創建一個新的輸入引腳。我說簡單,因爲一旦它的媒體格式被設置,所有連接到它的輸入引腳或單一輸出引腳的連接都被強制符合那個媒體格式。我手動構建過濾鏈,自己明確地建立所有引腳連接。我不使用任何「智能渲染」調用,除非有某種方式偶然觸發不需要的行爲(在我的情況下)。爲什麼DirectShow在與DirectShow變換過濾器建立多個輸入連接時拖入不必要的中間過濾器?

注:捕獲過濾器是一個標準的DirectShow過濾器外部的我的應用程序。我的推送源音頻過濾器和簡單的音頻混合器過濾器被用作私人的,未註冊的過濾器,並且在我的應用程序內部。

我有,只有當我試圖讓我的調音臺,它確實接受他們多輸入連接出現一個奇怪的問題。目前,我正嘗試將Capture Filter和我的自定義Push Source音頻濾鏡連接到我的混音器濾鏡。每當我嘗試這樣做,第二個上游過濾器連接失敗。無論我是先連接捕獲濾波器還是先連接推送源音頻濾波器,第二個上游濾波器連接總是失敗。

的第一個測試,我跑是嘗試剛捕獲篩選器連接到調音臺。這工作得很好。

第二次測試我跑是嘗試只是推源音頻過濾器連接到調音臺。這工作得很好。

但只要儘量做到既我得到一個「沒有中間過濾器的組合可以找到」錯誤。我花了幾個小時的時間深入挖掘媒體談判中來自圖形構建器的過濾器,然後發現問題所在。出於某種原因,過濾器圖形將古老的「Indeo(R)音頻軟件」編解碼器拖入鏈中。

我發現了這一點,因爲儘管該編解碼器確實有在符合我的過濾介質格式幾乎每一個方面(主要類型,子類型,格式類型,波格式參數),它有一個額外的2個字節它的結尾是pbFormat數據成員,這足以使等於測試失敗,因爲該測試通過比較每種媒體類型的cbFormat值來比較源和目標pbFormat區域之間的差異。 Indeo編解碼器的cbFormat值爲20,而我的過濾器的cbFormat值爲18,這是_tWAVEFORMATEX數據結構的大小。在某種程度上,Indeo pbFormat具有奇怪的尺寸是一件好事,因爲它的20個字節區域的前18個字節完全等於我調音臺過濾器支持的媒體類型的pbFormat區域。如果沒有這種異常情況,我從來不會知道古代編解碼器是在吸毒。我很驚訝它是毒品,因爲它知道漏洞和漏洞。什麼是最令人困惑的是,這是對我的混頻器濾波器的輸出,輸入引腳不是一個,和建立我的引腳連接時,我還沒有作出一個單一的下游連接尚未發生。

任何人都可以告訴我爲什麼DirectShow試圖拖動該編解碼器,儘管事實上兩個傳入過濾器,捕獲過濾器和推送源過濾器的媒體格式是相同的,並且不需要任何中間過濾器所有,因爲他們匹配我的調音臺過濾器的輸入引腳支持格式?我該如何解決這個問題?

此外,我注意到,即使在上述成功的單個過濾器附件測試中,我的混音器輸出引腳仍然在查詢媒體格式。爲什麼當我說的時候,在建立我的引腳連接的時候,我沒有連接任何東西到我的調音臺濾波器的輸出引腳上?

--------------------------- UPDATE:1 ---------------- ------------

據我瞭解,你完全可以通過使用IFilterGraph.ConnectDirect(避免「智能連接」的行爲),而不是IGraphBuilder.Connect()。我切換到DirectConnect(),並發現我的調音臺濾波器上的輸入引腳回到「已連接」狀態。這可能是導致圖形構建器在Indeo編解碼器過濾器中拖動的原因。現在我有了這個新的診斷信息,我將解決這個問題並用我的結果更新這篇文章。

+1

不必要濾波器被拖動,由於兩個原因:(1)暴露在過濾器上壞的媒體類型被連接,或fitler未能接受明確定義的媒體類型,和(2)壞/碎濾波器登記這樣如同出乎意料的高優點。所有與症狀有關的問題都是沿着這些路線的。 –

+0

好知道@Roman R.你有沒有發現一個工具,技術或試驗方法發掘並儘快追查這些類型的故障儘可能? –

+1

'GraphStudio'和'DirectShowSpy' - 這些是我的工具。當然,它也需要警惕地注意檢查媒體類型中的問題。 –

回答

0

---------------------------解決方案----------------- -----------

所有這些的根本問題是我重新使用從我連接到簡單音頻混音器濾波器的第一個目標/下游濾波器獲得的輸入引腳I,在我的應用程序代碼的頂部。換句話說,我的過濾器工作正常,但我沒有得到一個新的輸入引腳與每個上游過濾器,我試圖連接到它。一旦我開始這樣做,連接過程工作正常。我不知道爲什麼IGraphBuilder.Connect()接口背後的代碼嘗試引入Indeo編解碼器過濾器,可能與嘗試連接到已連接的輸入引腳有關,但它確實如此。對於我的需求,我喜歡嚴格控制該IFilterGraph.ConnectDirect()提供,因爲它消除了在IGraphBuilder智能連接代碼的任何干擾,但我可以看到當視頻濾波器涉足它可能成爲有用的。