DirectShow--過濾器圖表(Filter Graph)和它的組件

該文用於介紹 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).

下圖顯示了這些過濾器:

就像圖中顯示一樣,每個過濾器都被鏈接到一個或多個其他過濾器上。過濾器間的鏈接也是 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 看更多的文章 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章