DirectX、Directshow介紹(轉載收藏)
來源:互聯網
上載者:User
1
、
DirectX
是什麼DirectX(簡稱:DX)是微軟推出的一套基於Windows系統的多媒體應用程式介面APIs函式。在開發中,DX分為兩個部分,一個是運行庫,通過DX編譯出來的程式必須要有運行庫的支援,另外一個是開發庫,也就是常說的SDK,這部分是在編譯DX程式中是必需的。DirectX是一種圖形應用程式介面(API),簡單的說它是一個輔助軟體,一個提高系統效能的加速軟體,微軟建立開發的。他的意思不難理解,Direct是直接的意思,X是很多東西,加在一起就是一組具有共性的東西,這個共性就是直接。微軟定義它為“硬體裝置無關性”。DirectX 是微軟開發的圖形及媒體加速介面,只有安裝了它,系統中軟體才能比較直接的利用硬體加速資源(高速訪問硬體),目前該軟體最高版本為9.0c 在Windows作業系統的體系構架中,在核心與硬體之間有一層抽象層,專門對硬體進行屏蔽抽象,所以使用者不再被允許對硬體進行直接存取。這樣做以後,大大地提高了作業系統的抗破壞性和抗幹擾性,但這樣以來,使硬體操作的效率大打折扣,許多新硬體的新特性無法直接使用,這對多媒體和遊戲的發展顯然是一種障礙。DirectX是微軟公司提供的一套優秀的API(APIs),用於聯絡應用程式和硬體自身,它對發展Windows平台下的多媒體應用程式和電腦遊戲起到了關鍵的作用。DirectX組件包括:DirectDraw、DirectSound、DirectPlay、Direct3D、DirectInput、DirectSetup、AutoPlay等。
總之,DirectX的主要好處有兩個:為軟體開發人員提供與硬體的無關性;為硬體開發提供策略。為得到最新的版本,應該從最新的Microsoft Platform SDK中將DirectX安裝到系統中。 可以在http://www.microsoft.com/msdn網站或者MSDN光碟片中找到platform SDK。預設情況下,Microsoft Platform SDK被安裝到預設磁碟機根目錄下的/MSSDK目錄中。DirectX 的標頭檔安裝在/MSSDK/INCLUDE目錄中,Lib檔案安裝在/MSSDK/LIB目錄中。Platform SDK包含了一些非常好的DirectX例子和文檔。早期發布的DirectX 文檔非常粗略而且有些是錯誤的,現在的版本已經極大地改正了這一問題。最好要熟悉這些文檔。 所幸的是,不必一次就處理DirectX的全部功能。DirectX是一套可以分別使用的組件。實際上,在編程概念中,DirectX的不同部分互相沒有聯絡。它們僅僅是具有相同的設計風格和目標:使Windows的遊戲編程變得容易。 使用DirectX組件的程式有什麼特殊的地方嗎?根本沒有。使用DirectX組件的程式是基於Win32的程式,它們使用普通Win32 API集,並且可以訪問所有可以獲得的作業系統工具。實際上,DirectX既可以用於GUI程式,也可以用於控制台程式。可以直接用Petzold-style SDK編程開發程式,也可以用基本類庫,如MFC。總的說,唯一的要求是大多數DirectX組件在程式中需要HWND,所以至少要有一個視窗。
2
、
DirectX 9.0
家族的所有成員
DirectX Graphics:整合了以前的DirectDraw 和Direct3D技術。DirectDraw主要負責2D加速,以實現對顯卡記憶體和系統記憶體的直接操作;Direct3D主要提供三維繪圖硬體介面,它是開發三維DirectX遊戲的基礎。
DirectInput:主要支援輸入服務(包括滑鼠、鍵盤、遊戲杆等),同時支援輸出裝置。
DirectPlay:主要提供多人網路遊戲的通訊、組織功能。
DirectSetup:主要提供自動安裝DirectX組件的API功能。
DirectMusic:主要支援MIDI音樂合成和播放功能。
DirectSound:主要提供音頻捕捉、回放、音效處理、硬體加速、直接裝置訪問等功能。
DirectShow:為Windows平台上處理各種格式的媒體檔案的回放、音視頻採集等高效能要求的多媒體應用,提供了完整的解決方案。
DirectX Media Objects:DirectShow Filter 的簡化模型,提供更方便的流資料處理方案。
3
、
DirectX
的作用DirectX軟體開發包是微軟公司提供的一套Windows操作平台上的開發高效能圖形、聲音、輸入、輸出和網路遊戲的編程介面。它提供了硬體裝置無關性。
4
、
DirectShow
的由來及介紹DirectShow是從DirectX6.0中的DirectX Media 發展而來的,它整合了DirectX家族中其他成員(DirectDraw、DirectSound等)的技術。DirectX Media Objects是從DirectX8.1的DirectShow中分離出來的,成為了另一種高效率的流資料處理解決方案。 Microsoft DirectShow是一個基於Microsoft Windows平台的媒體流結構。它支援各種格式,包括進階流模式(ASF)、MPEG 格式(MPEG)、音訊視訊交錯格式(AVI)、音頻動態壓縮第三層(MP3)和WAV音效檔。它支援Windows驅動模式(WDM)裝置的捕捉,以及早期Widows裝置的視頻。DirectShow結合了其它的DirectX技術。當視頻和音訊硬體加速可用時,它能夠自動檢測並進行使用,同時也支援沒有硬體加速的系統。 DirectShow媒體重放、格式轉換和捕捉的任務變得簡單。同時,它為需要自訂的解決方案的應用程式提供了對底層流量控制結構的訪問。您也可以建立自己的DirectShow組件,來支援新的格式或自訂效果。 使用DirectShow的應用程式類型包括DVD播放器、視頻編輯應用程式、AVI到ASF的轉換器、MP3播放器和數位視訊捕捉應用程式。 DirectShow是基於元件物件模型(COM)的。要做一個DirectShow的應用程式,您必須瞭解COM用戶端編程。對於大多數應用程式,您不需要實現您自己的COM對象。DirectShow提供了您所需要的組件。(如果您想寫自己的組件擴充DirectShow,則必須以COM對象的方式來實現。)
5
、程式開發包的選擇請問在Mirosoft DirectX首頁上的下載串連有如下:它們有什麼區別:l DirectX 9.0 SDK Update - (April 2005)l DirectX 9.0 SDK Update - (April 2005) Symbol Filesl DirectX 9.0c Redistributable for Software Developers - (April 2005)l DirectX 9.0c End-User Runtime--------------------------------------------------------------------------------l DirectX 9.0 SDK Update - (April 2005) - 就是通常說的DXSDKl DirectX 9.0 SDK Update - (April 2005) Symbol Files - 調試時用的符號檔案l DirectX 9.0c Redistributable for Software Developers - (April 2005) - 能夠隨你的程式一起發行的部分l DirectX 9.0c End-User Runtime - 普通使用者安裝的DX
6
、如何把
DirectX
關聯到
VC
中?我們要進行DirectX程式的編譯就必須要有DirectX SDK庫檔案,此檔案可以到微軟或者本站擷取,然後通過VC設定將其關聯。下面說明了在VC6和VS.Net下的安裝方法。VC6(英文版):選擇菜單Tools->Options,開啟Options對話方塊,選擇Directions標籤頁,選擇Include files項,在裡面添加DirectX標頭檔的檔案夾路徑目錄,同樣,在Library files項中添加DirectX標頭檔的檔案夾路徑目錄。VS.Net(中文版):選擇菜單"工具->選項",開啟選項對話方塊,開啟Projects標籤頁,分別選擇"包含檔案"和"庫檔案"進行相應的路徑添加即可。註:VC在進行編譯時間,會根據排列順序來進行庫檔案選取,假設有兩個相同名字的庫,VC會優先使用排列在前面的庫檔案。DirectShow應用程式至少串連庫檔案Strmiids.lib和Quartz.lib。前者定義了SirectShow標準的CLSID和IID,後者定義了匯出函數AMGetErrorText(如果應用程式中沒有使用到這個函數,也可以不串連這個庫)。 DirectShow應用程式都應該包含Dshow.h檔案,但常常用Streams.h檔案來代替它。如果包含了Streams.h,則一般庫檔案還要串連strmbasd.lib、uuid.lib和winmm.lib。
7
、
DirectShow
開發環境的配置(1)使用VC嚮導產生一個具體項目,如Win32 Dynamic-Link;(2)包含標頭檔streams.h;(3)在VC的菜單中選擇Project|Settings|C/C++,在彈出的對話方塊中的Category中選擇Code generation,然後在Calling convention中選擇_stdcall;(4)使用多線程語言執行階段程式庫,即在VC的菜單中選擇Project|Settings|C/C++,在彈出的對話方塊中的Category中選擇Code generation,然後在Use run-time library中,Debug版選擇Debug Multithreaded,Release版選擇Multithreaded。(5)配置必要的連結庫檔案,即在VC的菜單中選擇Project|Settings|Link,在彈出的對話方塊中的Category中選擇General,然後在Object/library modules中輸入如下代碼: Debug版本 strmbasd.lib, msvcrtd.lib, winmm.lib Release版本 strmbase.lib, msvcrt.lib, winmm.lib並且選中Ignore all default libraries。DirectShow SDK建議,DirectShow應用程式應該至少串連庫檔案strmiids.lib和quartz.lib。前者定義了DirectShow標準的CLSID和IID,後者定義了匯出函數AMGetErrorText(如果應用程式中沒有使用到這個函數,也可以不串連這個庫)。如果程式裡包含了標頭檔streams.h,則一般庫檔案還要串連strmbasd.lib、uuid.lib、winmm.lib。(6)將DirectX SDK的Include和Lib目錄配置到VC的系統目錄中去,並且放在標準的VC目錄之前,以保證編譯器能夠拿到最新版本的源檔案。選擇Tools|Options|Directories,在彈出的對話方塊中的Show directories for中選擇Include files,配置如下(假設DirectX SDK安裝在D:/DXSDK目錄下,VC安裝在C:/Program Files下): D:/DXSDK/Include D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES D:/DXSDK/SAMPLES/C++/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,配置如下: D:/DXSDK/Lib D:/DXSDK/SAMPLES/C++/DIRECTSHOW/BASECLASSES/DEBUG D:/DXSDK/SAMPLES/C++/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(7)因為DirectShow應用程式是一種COM客戶程式,因此在調用任何COM函數之前調用CoInitialize()(或CoInitializeEx)函數進行COM庫的初始化(一般是在應用程式啟動的時候調用一次),在結束COM庫使用時調用CoUninitialize()函數進行反初始化(一般是在應用程式退出前調用一次)。
8
、
VC
編譯
DX
程式出現
"
無法解析的外部符號
"
是怎麼回事?這個錯誤經常出現在初學者要進行編譯DirectX程式的時候,主要是因為沒有將DX的庫檔案引用到工程中,這裡需要注意,我們將DX SDK的路徑設定到VC後,並不代表我們已設定好了DX SDK,在我們的DX工程中,我們還需要進行相應的設定作業,把我們所需要的庫檔案(DirectX SDK Library)加入到我們的工程中,要設定這個庫檔案有兩個方法,一個是在你工程的編譯選項中進行添加,另外一種可以通過代碼的方法來添加(推薦)。命令列:#pragma comment( lib,"xxx.lib" )這個是VC的編譯預先處理指令,將其加在代碼中即可。例如:#pragma comment( lib,"ddraw.lib" ) 這句的意思是將ddraw.lib庫加入到工程中進行編譯。註:此命令列不需要加分號(“;”)。
9
、
DirectShow SDK
基底類別庫 在DirectShow SDK基底類別庫中,除了Filter和Pin類外,還有很多工具類。有了這些類的支援,我們開發Filter組件或者DirectShow應用程式會更加輕鬆。這些類主要包括:CPullPin、COutputQueue、CSourceSeeking、CEnumPins、CEnumMedieTypes、CMemAllocator、CMediaSample、CBaseReferenceClock、CMediaType、CBaseProperyPage等。
10
、
DirectShow
的
COM
編程基礎 DirectX採用了COM標準,而DirectShow是一套完全基於COM的應用系統。 DirectShow應用程式實際上是一種COM組件的客戶程式,只是COM組件的“使用”問題。這些問題包括如何建立COM組件、如何得到組件對象上的解風口以及調用介面方法、如何管理組件對象(即需要熟悉COM的引用計數機制)等。 而對於Filter開發人員來說,需要掌握的COM知識就要多一點。因為Filter本身是一種COM組件,開發Filter牽涉到了COM組件的“實現”問題。
COM本身只是一種規範,而不是實現。但是當使用C++來實現時,COM組件就是一個C++類,而介面都是純虛類。COM規範規定,任何組件或介面都必須從IUnknown介面中繼承而來,每個組件都必須實現一個與支相對應的類工廠(Class Factory),類工廠也是一個COM組件,他實現了IClassFactory介面。在IClassFactory的介面函數CreateInstance中,才能使用new操作產生一個與之對應的COM組件類對象執行個體。
COM組件有3種類型:進程內組件、本地進程組件和遠程組件。Filter一般是一種進程內組件,以DLL的形式提供服務。 每個COM組件都使用一個GUID來唯一標識。當建立一個COM組件時,總是首先通過這個GUID調用CoGetClassObject來獲得建立這個組件對象的類工廠。然後調用類工廠的介面方法IClassFactory::CreateInstance,就能真正地建立GUID標示的組件對象了。 一個典型的自註冊COM組件DLL所必需的5個函數如下:l DllMain:DLL的入口函數(DirectShow實現的是DllEntryPoint);l DllGetClassObject:用於獲得類工廠指標;l DllCanUnloadNow:系統空閑時會調用這個函數,以確定是否可以卸載DLL;l DllRegisterServer:將COM組件註冊到註冊表中;l DllUnregisterServer:刪除註冊表中COM組件的註冊資訊。