天天看點

DirectShow--過濾器圖表(Filter Graph)和它的元件關于 DirectShow 過濾器(Filters) 關于過濾器圖表管理器 (Filter Graph Manager) 在過濾器圖表中如何加入硬體裝置

該文用于介紹 DirectShow 的主要元件。這些元件可用于開發 DirectShow 應用程式或者用于開發自己的過濾器元件。

關于 DirectShow 過濾器(Filters)

DirectShow 使用一個标準的體系結構,它的每個處理程序都是由一個 COM 對象來完成。這個 COM 對象就叫 過濾器 (Filters) 。 DirectShow 提供了一套标準的過濾器用于應用程式使用,并且開發人員可以寫自己的過濾器開擴充 DirectShow 功能。為了示例,這裡列舉了播放一個 AVI 檔案需要的步驟以及所需的過濾器:

  • 從檔案讀取原始資料。 (File Source filter)
  • 檢查 AVI 頭,并把資料流解析為音頻流和視訊流 (AVI Splitter filter)
  • 對視訊解碼 ( 多個解碼過濾器 , 依賴與壓縮格式 ).
  • 顯示視訊圖像 (Video Renderer filter)
  • 發送音頻資料到聲霸卡 (Default DirectSound Device filter).

下圖顯示了這些過濾器:

DirectShow--過濾器圖表(Filter Graph)和它的元件關于 DirectShow 過濾器(Filters) 關于過濾器圖表管理器 (Filter Graph Manager) 在過濾器圖表中如何加入硬體裝置

就像圖中顯示一樣,每個過濾器都被連結到一個或多個其他過濾器上。過濾器間的連結也是 COM 對象,被稱為針腳 (pins) 。過濾器使用針腳把資料從一個過濾器移動到另一個過濾器。圖中箭頭顯示了資料流動的方向。在 DirectShow 中,這些整個一套過濾器,就稱作過濾器圖表。

過濾器有三個可能的狀态:運作,停止,和暫停。當一個過濾器在運作的時候,它就處理資料。當它停止的時候,它就停止資料處理。暫停狀态用于暫停。過濾器圖表中所有過濾器的狀态都是同步的。是以,整個過濾器圖表的狀态也被看作是運作,停止,或暫停。

過濾器可以被分為如下幾類:

  • 源 ( source ) 過濾器。用于把資料引入圖表。資料可能來源于一個檔案,網絡,照相機 … 每個源過濾器處理不同類型的資料源。
  • 轉換( transform )過濾器,該過濾器對輸入資料進行處理,然後建立一個輸出資料流。
  • 輸出( Renderer )過濾器,該過濾器位于整個過濾器連結的最後。它接收輸入資料并把資料輸出給最終使用者。
  • 分離( splitter )過濾器,該過濾器将把一個輸入資料流分離為兩個或多個資料流。
  • 混合( mux )過濾器,該過濾器将把多個輸入數量流混合成一個單一的資料流。

上面的分類也不是絕對的,比如,一個 ASF Reader 過濾器可以看作是一個源過濾器,又可以當作一個分離過濾器。

所有過濾器都使用 IBaseFilter 接口,所有的針腳都使用 IPin 接口。

關于過濾器圖表管理器 (Filter Graph Manager)

過濾器圖表其實就是一個 COM 對象,它用于控制過濾器圖表中的過濾器。它可以實作功能如下:

狀态設定

過濾器的狀态改變必須通過一個特殊的指令來觸發。是以,應用程式不能直接發送狀态改變指令給過濾器。應用程式把要發送的指令發送給過濾器圖表管理器,圖表管理器會把該指令轉發給指定的過濾器。

引用時鐘

圖表中的過濾器都使用相同的時鐘,這被稱為引用時鐘。引用時鐘可以確定所有流同步。輸出的音視訊顯示的時鐘,被稱為顯示時鐘。相對于引用時鐘,顯示時鐘就是标準的。過濾器圖表管理器通常選擇聲霸卡或系統時鐘作為應用時鐘。

圖示事件

過濾器圖表管理器使用一個事件隊列來通知應用程式,在過濾器圖表中發生的事件。這個結構類似于 Windows 的消息循環。

圖表方法

過濾器圖表管理器提供了一些方法,可以向過濾器圖表添加過濾器,實作過濾器間的連結和斷開過濾器連結。過濾器圖表管理器不對過濾器間資料的移動進行處理。這些工作都是由過濾器通過它們的針腳自己去完成。這些處理通常在一個獨立的線程中完成。

在過濾器圖表中如何加入硬體裝置

這裡介紹 Microsoft® DirectShow® 如何加入音視訊硬體。

Wrapper Filters

所有 DirectShow 過濾器都是使用者模式的軟體元件。為了把核心模式下的硬體裝置 ( 比如視訊捕獲卡 ) 加入到 DirectShow 的過濾器圖表中,就必須把裝置當作一個使用者模式過濾器來描述。這個功能就是通過一些 DirectShow 提供的叫“ Wrapper ”的過濾器來實作。這些過濾器包括音頻捕獲過濾器, VFW 捕獲過濾器, TV Tuner 過濾器,電視音頻過濾器, Analog Video Crossbar 過濾器。 DirectShow 同樣提供了一個叫 KsProxy 的過濾器,它能夠描述任何 WDM 的裝置。

Wrapper 過濾器通過 COM 接口來描述裝置的性能。應用程式通過這些接口把資訊發送給過濾器,過濾器把消息翻譯轉換後調用裝置的驅動程式,再把資訊傳遞給硬體裝置。同樣裝置可以把資訊回報給應用程式。 TV Tuner, TV Audio, Analog Video Crossbar, 和 KsProxy 過濾器通過 IksPropertySet 接口支援自定義驅動程式的屬性。 VFW 捕獲過濾器和音頻捕獲過濾器不能使用該方法來擴充。

對于應用程式開發人員來講, wrapper 過濾器允許程式象控制其他 DirectShow 過濾器一樣來控制硬體裝置。而不需要特别要求的程式設計來實作。

VFW 裝置

VFW 捕獲過濾器支援早期的 VFW 捕獲卡。

音頻捕獲和混合裝置 ( 聲霸卡 )

新的聲霸卡都有 Mic 和其他裝置的輸入端口。有些卡還有闆載的混音性能。在 DirectShow 中,通過音頻捕獲過濾器來處理聲霸卡的輸入和混音性能。通過使用系統裝置調用器可以找到你系統中的每一張聲霸卡。運作 GraphEdit 來浏覽你系統中的聲霸卡并從音頻捕獲裝置類中選擇你要的聲霸卡。在那裡你看到所有的音頻捕獲過濾器。

WDM 流裝置

新的硬體解碼器和捕獲卡都遵循 WDM 規範。 WDM 視訊卡能支援 VFW 不能提供的性能。

DirectShow 提供了一個 KsProxy 過濾器 (ksproxy.ax) 來支援 WDM 流裝置。 KsProxy 被稱為 ( 瑞士軍刀過濾器 ) “ Swiss Army Knife filter ”,因為它可以作許多不同的事情。該過濾器針腳數量和過濾器 COM 接口的數量依賴于裝置驅動程式的性能。在過濾器圖表中的 KsProxy 過濾器基本上不會用“ KsProxy ”名字出現,它通常使用具體裝置的名字 (Friendly Name), 這些名字可以在系統資料庫中找到。運作 GraphEdit 可以浏覽你系統中的 WDM 裝置,還可以從 WDM 類形裝置中,選擇你想要的裝置。如果你的系統上隻有一個 WDM 卡,這個卡上可能會有多個裝置。每個裝置都被描述為一個獨立的過濾器,這些過濾器都是一個真正的 KsProxy 裝置。

應用程式使用系統裝置查詢器( System Device Enumerator )來查到系統中的 WDM 裝置名稱 (Moniker) 對象。調用 Moniker 對象的 BindToObject 方法來建立 KsProxy 執行個體。由于 KsProxy 可以描述所有的 WDM 裝置,是以它必須查詢裝置驅動程式來判斷該裝置支援什麼樣的功能屬性。屬性集是一個用于 WDM 驅動程式和一些使用者模式過濾器(比如 MPEG-2 軟解壓器)的資料結構集合。 KsProxy 會自我配置然後通過 COM 接口去比對裝置的屬性集。硬體開發商可通過插件模式來擴充 KsProxy ,以實作其特定的功能。這些細節對于應用程式都是隐藏的,你的程式通過 KsProxy 來控制硬體裝置,這個時候,硬體裝置被當作一個 DirectShow 過濾器來處理。

核心流( Kernel Streaming )

WDM 裝置支援核心流,即資料流動在核心模式下進行,而不會進入到使用者模式。在核心模式下,資料可以高速流動,而不會占用 CPU 的處理率。基于 WDM 的過濾器可以使用核心流,在硬體裝置間去直接移動資料,而不必把資料先拷貝到系統記憶體,然後再拷貝到目标裝置中。

站在應用程式的角度,我們來看資料的流動。資料是從一個過濾器(使用者模式過濾器)移動到另一個過濾器(使用者模式過濾器),其實資料真實的移動基本上都沒有在使用者模式下進行,而是在核心模式下進行的。當然也有例外,如果你要捕獲一個視訊資料并儲存在檔案中,這樣,資料會從核心模式(裝置)移動到使用者模式下(檔案)。即使在這種情況下,也不必為它配置設定系統記憶體實作拷貝。

---------------------------------------------------------------------------------

閱讀我的相關文章:

《 DirectShow 應用程式快速入門》

《如何列舉你系統已經安裝的裝置(視訊壓縮裝置,視訊捕獲裝置 ... )》

《 WDM 視訊捕獲介紹 》

《談談使用 VFW 在 Windows 下程式設計控制攝像頭 一》

《談談使用 VFW 在 Windows 下程式設計控制攝像頭 二》

《談談視訊壓縮管理器( VCM ) Video Compress Manager 》

---------------------------------------------------------------------------------

歡迎來我的部落格 : http://blog.csdn.net/suntaoznz 看更多的文章 !

繼續閱讀