2012-12-27 66 views
2

如何以編程方式更改過濾器屬性?如何更改Directshow過濾器屬性C++

我使用的是過濾AAC encoder,我可以手動在濾膜上右擊改變其在grapheditbitrate並輸入bitrate值。

是否有可能通過代碼做同樣的事情?

請給我寶貴的建議,如果可能的話與代碼。

+0

@selbie我建立的圖形,你知道該怎麼辦呢?你有沒有任何示例代碼? –

+1

爲了幫助你,編號將很高興知道您正在使用的AAC編碼器。 – CPlusSharp

+0

@CPlusSharp它是「VSS AAC編碼器DMO」 –

回答

1

您的AAC編碼器將通過某些IID公開某些接口。確保你獲得了IID的接口,然後訪問其比特率,採樣率等附加功能。

2

您可以通過專用過濾器專用接口來完成此操作。您需要參閱過濾器文檔或SDK以獲取有關詳細信息(VSS Tech Support)。有時你可以從類型庫中獲得必要的信息。

參見:

+0

所以沒有像「枚舉所有選項」一樣的通用方式,基本上你必須顯示一個ISpecifyPropertyPages然後在此之後堅持過濾器的設置(參考:http://microsoft.public。 multimedia.directx.dshow.programming.narkive。com/ldOko8Js/ispecifypropertypages-saving-and-restoring-settings),還是必須引用一些第三方過濾器特定的接口? – rogerdpack

+1

沒有必要的過濾器接口公開通用屬性,特別是,命名。所以過濾器應該爲開發人員實現一些有意義的東西......並且它似乎與供應商有關。例如,有些人可能會實現'IPersistPropertyBag',但很少見。在大多數情況下,它只是一個過濾器特定的界面。 –

+0

感謝羅馬,你的stackoverflow響應是我今天理解dshow的唯一原因:) – rogerdpack

0

羅馬的答案相似,似乎有一個過濾器的 「特殊性質」 通常設置兩種方式和/或保存。

一個是顯示它的屬性頁面「對話框」(ISpecifyPropertyPages),然後允許用戶改變東西並關閉它,然後你得到它的IPersistStream接口,並保存它的「當前狀態」,然後你可以使用以後基本上將它的屬性設置回它們保存的內容(這是如何繪製的,參考:http://microsoft.public.multimedia.directx.dshow.programming.narkive.com/ldOko8Js/ispecifypropertypages-saving-and-restoring-settings)另外,可以通過在圖形對象本身上調用IPersistStream將「整個圖形」序列化爲文件。請參閱https://stackoverflow.com/a/11781370/32453

另一種方法是知道「它到底是什麼類型的特殊過濾器」,並將其轉換爲您知道的特定接口,來自第三方,可能會暴露獲取器和設置器等,如Windows SDK中的「avisynth」過濾器directshow示例公開了ISynth interface

另請參閱here其中列出了幾種更明顯的方式... here也似乎相關。 IPersist本身也有多個從它繼承的接口,請參閱註釋here。根據我對dshow設備的經驗,他們通常僅實現IPersist和IPersistStream(和IAMSpecificPropertyPages),儘管您也可以爲其他常用接口保存值(如IAMVideoProcAmp),然後手動重新設置屬性...

更新:不幸的是,雖然許多過濾器實現IPersistStream接口,似乎很少有人真正使用它的有用的東西......