本文介紹了使用DirectShow編程的基本技術和內容。讀過這部分後,您將可以編寫您的第一個DirectShow應用程式。
篩選器和篩選器表
DirectShow的構造塊是一個軟體組件,叫做篩選器。這個軟體組件在多媒體軟體流上執行一些操作。例如,DirectShow能夠:
- 讀取檔案
- 從視頻輸入裝置捕獲視頻
- 譯解不同的流格式,如MPEG-1視頻
- 將資料送給圖形卡或音效卡
篩選器接收輸入併產生輸出。例如,如果是一個篩選器解碼MPEG-1視頻,輸入的是MPEG-編碼流,輸出的是一個解壓縮的視訊框架序列。
在DirectShow中,一個應用程式執行的任何任務,都是通過串連篩選器鏈完成的,因此,一個篩選器的輸出就成了另一個篩選器的輸入。一組串連的篩選器叫做篩選器表。例如,顯示的就是播放一個AVI檔案的篩選器表。
源檔案篩選器從硬碟讀取AVI檔案。AVI分解器將檔案解析為兩個流,一個壓縮的視頻流和一個音頻流。AVI解壓縮器篩選器解碼視訊框架。視頻還原器篩選器使用DirectDraw或GDI向顯示器繪製幀。預設的DirectSound裝置篩選條件使用DirectSound播放音頻流。
應用程式不需要得知所有這些資料的流動。相反,篩選器是由一個進階組件叫做篩選器表管理器(Filter Graph Manager)來控制的。應用程式可以進行進階API調用,如Run(從表中移動資料)或Stop(停止資料流動)。如果您需要更多的針對流操作的控制,您可以直接通過COM介面訪問篩選器。篩選器表管理器也會嚮應用程式傳遞事件通知。
篩選器表管理器的另一個服務目標是:它為應用程式提供方法來產生篩選器表,將篩選器串連在一起。(DirectShow也提供各種協助對象來簡化這個過程。這些在文檔中有完整的介紹。)
編寫一個DirectShow應用程式
大體上來說,DirectShow應用程式完成的任務有三個。如下表所示:
1、應用程式建立一個篩選器表管理器的執行個體
2、應用程式使用篩選器表管理器產生一個篩選器表。表中具體的篩選器根據應用程式來確定。
3、應用程式使用篩選器表管理器來控制篩選器表和通過篩選器的流資料。在這個過程中,應用程式還要回應從篩選器表管理器發來的事件。
當處理完成,應用程式釋放表管理器和所有的篩選器。
DirectShow是基於COM的;篩選器表管理器和篩選器都是COM對象。在您開始DirectShow編程之前,需要對COM用戶端編程有個一般的瞭解。DirectX SDK文檔中的文章<使用COM>是對這個題目的一個很好的介紹。關於COM編程有許多書可以參考。