1. 關於directshow
1.2 vc開發環境的配置
(假設directx sdk8.1安裝在c:\dxsdk目錄下。)
1. 編譯基類源**,至少生成兩個靜態庫檔案
開啟c:\ dxsdk\samples\**********\directshow\baseclasses\baseclasses.dsw,debug版本生成strmbasd.lib,release版本生成strmbase.lib。
2. 配置vc的編譯環境:include目錄和lib目錄。執行vc的選單命令tools | options…,在隨後彈出的對話方塊中進入directories一頁,在show directories for一項選擇include files,然後配置如下:(注意,務必將directx sdk的目錄放在標準的vc目錄之前。)
c:\dxsdk\include
c:\ dxsdk\samples\**********\directshow\baseclasses
c:\ dxsdk\samples\**********\common\include
c:\program files\microsoft visual studio\vc98\include
c:\program files\microsoft visual studio\vc98\mfc\include
c:\program files\microsoft visual studio\vc98\atl\include
再在show directories for一項選擇library files,配置如下:
c:\dxsdk\lib
c:\ dxsdk\samples\**********\directshow\baseclasses \debug
c:\ dxsdk\samples\**********\directshow\baseclasses \release
c:\program files\microsoft sdk\lib
c:\program files\microsoft visual studio\vc98\lib
c:\program files\microsoft visual studio\vc98\mfc\lib
3. 配置directshow應用程式開發專案需要連線的庫檔案。
執行vc的選單命令project | settings…,在隨後彈出的對話方塊中進入link一頁,在object/library modules一項,debug版輸入strmbasd.lib msvcrtd.lib winmm.lib,release版本輸入strmbase.lib msvcrt.lib winmm.lib。ignore default libraries. (in microsoft® visual c++® 6.0, choose settings from the project menu. click the link tab and check ignore all default libraries.)
4. 如果安裝的directx sdk的版本是9.0以前的,請確認在編譯應用程式的debug版本之前已經定義了debug巨集。執行vc的選單命令project | settings…,在隨後彈出的對話方塊中進入c/c++一頁,在category一項選擇preprocessor,然後確認preprocessor definitions中有debug(如果沒有就自己加上)。
另外,應用程式在呼叫任何com庫函式之前,務必呼叫coinitialize或coinitializeex進行com庫的初始化(一般只需在程式啟動的時候呼叫一次);在結束所有com操作之後,呼叫couninitialize進行反初始化(一般在程式退出之前呼叫一次)。而當程式中有多個執行緒都要使用com庫函式時,則每個執行緒都要進行初始化和反初始化。總之,要保證couninitialize和coinitialize(或coinitializeex)呼叫的一一配對。
2 directshow 的組成構架
任何用directshow開發的應用程式,都必須建立多個濾波器並進行恰當的連線,於是資料流就可以從源濾波器經傳送到 render filter 輸出,被使用者所使用。這些濾波器的集合就叫做濾波器圖(filter graph) 。圖2 就是乙個 filter graph的例子。
圖2 乙個典型的濾波器圖
2.3 pin
pin就是兩個濾波器相連的介面。每乙個 pin 都是從ipin這個 com物件派生出來的。每個 pin 都是濾波器私有物件,濾波器可以動態地建立 pin,銷毀 pin,自由地控制 pin的生存時間。pin 可以分為兩類:輸入 pin 和輸出 pin。兩個相連的 pin必須是不同種類的,就是輸入pin只能同輸出 pin 相連。資料就從相連的 pin 中流動,從上一級濾波器到下一級濾波器。兩個濾波器的pin 相連的時候,有乙個協商的過程,兩者必須統一資料流的型別、快取的大小、資料傳送的機制等。如果協商沒有統一,這兩個濾波器就無法連線。
2.4 多**資料樣本和多**資料型別
兩個濾波器相連時,它們必須使用相同的資料型別。這樣能保證下一級濾波器可以處理從上一級濾波器得到的資料。濾波器之間傳輸的資料也是經過了com封裝,稱為多**資料樣本(media type) ,使用了mediasample 或 imediasample2 介面。在實際資料中,還包含了時間戳以求得同步。
2.5 時鐘(clock)
3.1 comlibrary的呼叫
由於directshow filter 都是以com的形式存在的,因此使用者使用directshow filter 開發自己的應用程式的時候必須在開始時初始化 comlibrary,呼叫 coinitialize 函式嵌入所有的動態鏈結庫和資源。而且在程式結束的時候呼叫 couninitialize 函式釋放所有的動態鏈結庫和資源。
3.2 filter graph manager介面
directshow的事件響應機制是filter graph manager與使用者進行互動的介面,directshow可以處理的可以是一些事先可以預期的事件,比如資料流的結束;也可以是一些無法預期的錯誤。有的事件可以由 filter graph manager自己處理,但如果 filter graph manager 自己無法處理這些事件,它就把事件的通知放在事件佇列裡。使用者程式就可以通過 imediaevent 介面得到事件,並對它作出響應。
DirectShow系統初級指南
if succeeded hr pfilter release 而對於dmo的直接使用,以下幾點是要特別注意的。1.在處理資料之前,必須為每條輸入輸出stream設定media type optional stream除外 2.從dmo從獲取的media type未必包含format塊,但是在給dm...
DirectShow系統初級指南
if succeeded hr pfilter release 而對於dmo的直接使用,以下幾點是要特別注意的。1.在處理資料之前,必須為每條輸入輸出stream設定media type optional stream除外 2.從dmo從獲取的media type未必包含format塊,但是在給dm...
系統裝置的列舉(DirectShow)
directshow 對系統中不可預知性硬體提供了良好的支援,其方法是使用系統列舉,系統列舉的一般過程如下所示 1 使用cocreateinstance函式建立系統列舉器組建物件 clsid為clsid systemdeviceenum 並獲得icreatedevenum介面 2 使用介面方法icr...