簡體   English   中英

DirectShow:如何更改過濾器屬性?

[英]DirectShow: how to change filter properties?

我正在開發一個幫助用戶配置他們的電視調諧器卡的應用程序。 基本上,用戶選擇一個設備,應用程序生成一個圖形文件 (.GRF)作為輸出。 但是,用戶應該能夠更改一些設置。 這些設置包括視頻標准(PAL、NTSC、SECAM)、視頻輸入(調諧器、復合、SVideo)等。

在 GraphEdit 中,這可以通過右鍵單擊所需的過濾器來完成,然后選擇“過濾器屬性...”。 但是,我不知道如何在代碼中實現相同的目標。

問題 1 :如何在代碼中更改 DirectShow 過濾器的屬性?

因為我使用ICaptureGraphBuilder2::RenderStream來構建我的圖形,所以我只保存對源過濾器和渲染器的引用。 我希望能夠更改的大多數屬性都可以在其他過濾器上找到,例如交叉過濾器,它是由 RenderStream 方法自動添加的。

問題 2 :如何獲取對圖表中其他過濾器的引用,以便更改它們的屬性?

注意:我不會使用FindFilterByName,因為我的應用程序應該與大多數電視調諧器卡一起使用,並且每張卡都有不同的名稱。

編輯:我找到了一種通過枚舉EnumFilters來獲取對這些過濾器的引用的方法。 然后我在每個過濾器上使用QueryFilterInfo來查找它的名稱。 這與使用 FindFilterByName 不同,因為我現在可以使用Contains來查找某些單詞(例如“Crossbar”)。 但是,我已經有一個示例,其中將交叉過濾器命名為 ("... Xbar"),因此我仍在尋找一種更通用的方法來執行此操作。 我希望我能按類別找到過濾器...

順便說一下,我目前正在使用DirectShow.Net 庫,但我相信該方法應該與 C++ 庫相同。 但是,我並不完全了解 C++ 語法,因此如果您打算發布(引用)代碼示例,如果它是在 C# 或 VB.NET 中,這將是一個很大的幫助。

解決方案:請參閱已接受的答案評論。 我需要將需要更改屬性的過濾器轉換為它們各自的界面。 例如,需要將 crossbar 過濾器投射IAMCrossbar 接口 使用此界面,我現在可以更改所有與交叉開關相關的屬性。

2 - EnumFilters是正確的方法。 您不應該相信名稱,因為它們只是為了對開發人員友好以便能夠輕松區分圖中的過濾器,但並不承諾它們具有全局持久性和一致性。 這同樣適用於引腳名稱。

1 - 在本機 API 中,您可以使用OleCreatePropertyFrame函數創建帶有屬性頁的 UI。 另請參閱顯示過濾器的屬性頁

我不認為 DirectShow.NET 有一個包裝器,所以你需要像這樣通過 P/Invoke 調用這個 API: C# : How to use directshow.net to show this dialog?

設置是特定於過濾器的,通常通過私有接口公開,因此沒有統一的訪問權限。 盡管如此,如果過濾器支持從流加載/保存到流,您可以以統一的方式立即保存/恢復設置。 GraphEdit 保存/加載 .GRF 文件的方式。

2 - 您是否嘗試查看過濾器 IMoniker 提供的 DeviceName? 我個人發現它對於將過濾器列入黑名單非常有用,而且您似乎可以通過其 IMoniker::DeviceName 了解一些有關設備類型的信息。 我不確定這是否足以滿足您的需求,但這可能是一個開始。

對於問題一,要“找到”自動插入的交叉過濾器,請使用 ICaptureGraphBuilder2::FindInterface 然后您可以顯示其本機屬性頁“gui popup”(請參閱​​ Roman 的回答)並允許用戶使用它來控制它,或者使用正常的crossbar 枚舉/選擇 API 以編程方式完成。

暫無
暫無

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

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