?? 轉載:directshow 學習筆記(1) 獨行客 天極blog.htm
字號:
style="TEXT-INDENT: 21pt"><STRONG>DirectSetup</STRONG>:主要提供自動安裝DirectX組件的API功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectMusic</STRONG>:主要支持MIDI音樂合成和播放功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectSound</STRONG>:主要提供音頻捕捉、回放、音效處理、硬件加速、直接設備訪問等功能。</DIV>
<DIV
style="TEXT-INDENT: 21pt"><STRONG>DirectShow</STRONG>:為Windows平臺上處理各種格式的媒體文件的回放、音視頻采集等高性能要求的多媒體應用,提供了完整的解決方案。</DIV>
<DIV style="TEXT-INDENT: 21pt"><STRONG>DirectX Media Objects</STRONG>:DirectShow
Filter 的簡化模型,提供更方便的流數據處理方案。</DIV>
<DIV style="TEXT-INDENT: 21pt"> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">3</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的作用</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">DirectX軟件開發包是微軟公司提供的一套Windows操作平臺上的開發高性能圖形、聲音、輸入、輸出和網絡游戲的編程接口。它提供了硬件設備無關性。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">4</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的由來及介紹</SPAN></STRONG></DIV>
<DIV style="TEXT-INDENT: 21pt">DirectShow是從DirectX6.0中的DirectX Media
發展而來的,它集成了DirectX家族中其他成員(DirectDraw、DirectSound等)的技術。DirectX Media
Objects是從DirectX8.1的DirectShow中分離出來的,成為了另一種高效率的流數據處理解決方案。</DIV>
<DIV> <SPAN>Microsoft DirectShow是一個基于Microsoft
Windows平臺的媒體流結構。它支持各種格式,包括高級流模式(ASF)、運動圖像專家組(MPEG)、音頻視頻交錯(AVI)、音頻動態壓縮第三層(MP3)和WAV聲音文件。它支持Windows驅動模式(WDM)設備的捕捉,以及早期Widows設備的視頻。DirectShow結合了其它的DirectX技術。當視頻和音頻的硬件加速可用時,它能夠自動檢測并進行使用,同時也支持沒有硬件加速的系統。</SPAN></DIV>
<DIV> <SPAN>DirectShow媒體重放、格式轉換和捕捉的任務變得簡單。同時,它為需要自定義的解決方案的應用程序提供了對底層流控制結構的訪問。您也可以創建自己的DirectShow組件,來支持新的格式或自定義效果。</SPAN></DIV>
<DIV> 使用<SPAN>DirectShow的應用程序類型包括DVD播放器、視頻編輯應用程序、AVI到ASF的轉換器、MP3播放器和數字視頻捕捉應用程序。</SPAN></DIV>
<DIV> <SPAN>DirectShow是基于組件對象模型(COM)的。要做一個DirectShow的應用程序,您必須了解COM客戶端編程。對于大多數應用程序,您不需要實現您自己的COM對象。DirectShow提供了您所需要的組件。(如果您想寫自己的組件擴展DirectShow,則必須以COM對象的方式來實現。)</SPAN></DIV>
<DIV><STRONG></STRONG> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">5</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、程序開發包的選擇</SPAN></STRONG></DIV>
<DIV style="MARGIN-LEFT: 21pt">請問在Mirosoft DirectX主頁上的下載連接有如下:</DIV>
<DIV style="MARGIN-LEFT: 21pt">它們有什么區別:</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005)</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) Symbol Files</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c Redistributable for Software Developers - (April
2005)</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c End-User Runtime</DIV>
<DIV
style="MARGIN-LEFT: 21pt">--------------------------------------------------------------------------------</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) - 就是通常說的DXSDK</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0 SDK Update - (April 2005) Symbol Files -
調試時用的符號文件</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c Redistributable for Software Developers - (April
2005) - 能夠隨你的程序一起發行的部分</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DirectX 9.0c End-User Runtime - 普通用戶安裝的DX</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">6</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、如何把</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">關聯到</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=VC
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/VC"><FONT
color=#0000ff>VC</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">中?</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">我們要進行DirectX程序的編譯就必須要有DirectX SDK庫文件,此文件可以到微軟或者本站獲取,然后通過VC設置將其關聯。下面說明了在VC6和VS.Net下的安裝方法。</DIV>
<DIV
style="TEXT-INDENT: 21pt">VC6(英文版):選擇菜單Tools->Options,打開Options對話框,選擇Directions標簽頁,選擇Include
files項,在里面添加DirectX頭文件的文件夾路徑目錄,同樣,在Library files項中添加DirectX頭文件的文件夾路徑目錄。</DIV>
<DIV
style="TEXT-INDENT: 21pt">VS.Net(中文版):選擇菜單"工具->選項",打開選項對話框,打開Projects標簽頁,分別選擇"包含文件"和"庫文件"進行相應的路徑添加即可。</DIV>
<DIV
style="TEXT-INDENT: 21pt">注:VC在進行編譯時,會根據排列順序來進行庫文件選取,假設有兩個相同名字的庫,VC會優先使用排列在前面的庫文件。</DIV>
<DIV
style="TEXT-INDENT: 21pt">DirectShow應用程序至少連接庫文件Strmiids.lib和Quartz.lib。前者定義了SirectShow標準的CLSID和IID,后者定義了導出函數AMGetErrorText(如果應用程序中沒有使用到這個函數,也可以不連接這個庫)。</DIV>
<DIV><SPAN>
DirectShow</SPAN>應用程序都應該包含Dshow.h文件,但常常用Streams.h文件來代替它。如果包含了Streams.h,則一般庫文件還要連接strmbasd.lib、uuid.lib和winmm.lib。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">7</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">開發環境的配置</SPAN></STRONG></DIV>
<DIV>(1)使用VC向導生成一個具體項目,如Win32 Dynamic-Link;</DIV>
<DIV> </DIV>
<DIV>(2)包含頭文件streams.h;</DIV>
<DIV> </DIV>
<DIV>(3)在VC的菜單中選擇Project|Settings|C/C++,在彈出的對話框中的Category中選擇Code
generation,然后在Calling convention中選擇_stdcall;</DIV>
<DIV> </DIV>
<DIV>(4)使用多線程語言運行時庫,即在VC的菜單中選擇Project|Settings|C/C++,在彈出的對話框中的Category中選擇Code
generation,然后在Use run-time library中,Debug版選擇Debug
Multithreaded,Release版選擇Multithreaded。</DIV>
<DIV> </DIV>
<DIV>(5)配置必要的鏈接庫文件,即在VC的菜單中選擇Project|Settings|Link,在彈出的對話框中的Category中選擇General,然后在Object/library
modules中輸入如下代碼:</DIV>
<DIV><SPAN> Debug</SPAN>版本<SPAN> strmbasd.lib,
msvcrtd.lib, winmm.lib</SPAN></DIV>
<DIV><SPAN> Release</SPAN>版本 strmbase.lib, msvcrt.lib,
winmm.lib</DIV>
<DIV>并且選中Ignore all default libraries。</DIV>
<DIV style="TEXT-INDENT: 21pt">DirectShow
SDK建議,DirectShow應用程序應該至少連接庫文件strmiids.lib和quartz.lib。前者定義了DirectShow標準的CLSID和IID,后者定義了導出函數AMGetErrorText(如果應用程序中沒有使用到這個函數,也可以不連接這個庫)。如果程序里包含了頭文件streams.h,則一般庫文件還要連接strmbasd.lib、uuid.lib、winmm.lib。</DIV>
<DIV style="TEXT-INDENT: 21pt"> </DIV>
<DIV>(6)將DirectX
SDK的Include和Lib目錄配置到VC的系統目錄中去,并且放在標準的VC目錄之前,以保證編譯器能夠拿到最新版本的源文件。選擇Tools|Options|Directories,在彈出的對話框中的Show
directories for中選擇Include files,配置如下(假設DirectX SDK安裝在D:\DXSDK目錄下,VC安裝在C:\Program
Files下):</DIV>
<DIV><SPAN> D:\DXSDK\Include</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES</SPAN></DIV>
<DIV><SPAN> D:\DXSDK\SAMPLES\C++\COMMON\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\MFC\INCLUDE</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\ATL\INCLUDE</SPAN></DIV>
<DIV> </DIV>
<DIV>再在Show directories for中選擇Library files,配置如下:</DIV>
<DIV><SPAN> D:\DXSDK\Lib</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\DEBUG</SPAN></DIV>
<DIV><SPAN>
D:\DXSDK\SAMPLES\C++\DIRECTSHOW\BASECLASSES\RELEASE</SPAN></DIV>
<DIV><SPAN> C:\PROGRAM FILES\MICROSOFT SDK\LIB</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\LIB</SPAN></DIV>
<DIV><SPAN> C:\Program Files\Microsoft Visual
Studio\VC98\MFC\LIB</SPAN></DIV>
<DIV> </DIV>
<DIV>(7)因為DirectShow應用程序是一種COM客戶程序,因此在調用任何COM函數之前調用CoInitialize()(或CoInitializeEx)函數進行COM庫的初始化(一般是在應用程序啟動的時候調用一次),在結束COM庫使用時調用CoUninitialize()函數進行反初始化(一般是在應用程序退出前調用一次)。</DIV>
<DIV> </DIV>
<DIV> </DIV>
<DIV align=left><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">8</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=VC
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/VC"><FONT
color=#0000ff>VC</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">編譯</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DX</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">程序出現</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">"</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">無法解析的外部符號</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">"</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">是怎么回事?</SPAN></STRONG></DIV>
<DIV
style="TEXT-INDENT: 21pt">這個錯誤經常出現在初學者要進行編譯DirectX程序的時候,主要是因為沒有將DX的庫文件引用到工程中,這里需要注意,我們將DX
SDK的路徑設置到VC后,并不代表我們已設置好了DX SDK,在我們的DX工程中,我們還需要進行相應的設置操作,把我們所需要的庫文件(DirectX SDK
Library)加入到我們的工程中,要設置這個庫文件有兩個方法,一個是在你工程的編譯選項中進行添加,另外一種可以通過代碼的方法來添加(推薦)。</DIV>
<DIV style="TEXT-INDENT: 21pt">命令行:#pragma comment( lib,"xxx.lib" )</DIV>
<DIV style="TEXT-INDENT: 21pt">這個是VC的編譯預處理指令,將其加在代碼中即可。</DIV>
<DIV style="TEXT-INDENT: 21pt">例如:#pragma comment( lib,"ddraw.lib"
) 這句的意思是將ddraw.lib庫加入到工程中進行編譯。</DIV>
<DIV style="TEXT-INDENT: 21pt">注:此命令行不需要加分號(“;”)。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">9</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow SDK</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">基類庫</SPAN></STRONG></DIV>
<DIV><SPAN> </SPAN>在DirectShow
SDK基類庫中,除了Filter和Pin類外,還有很多工具類。有了這些類的支持,我們開發Filter組件或者DirectShow應用程序會更加輕松。這些類主要包括:CPullPin、COutputQueue、CSourceSeeking、CEnumPins、CEnumMedieTypes、CMemAllocator、CMediaSample、CBaseReferenceClock、CMediaType、CBaseProperyPage等。</DIV>
<DIV> </DIV>
<DIV><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">10</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">、</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">DirectShow</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">的</SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue"><A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN></STRONG><STRONG><SPAN
style="FONT-SIZE: 12pt; COLOR: blue">編程基礎</SPAN></STRONG></DIV>
<DIV><SPAN>
DirectX</SPAN>采用了COM標準,而DirectShow是一套完全基于COM的應用系統。</DIV>
<DIV><SPAN>
DirectShow</SPAN>應用程序實際上是一種COM組件的客戶程序,只是COM組件的“使用”問題。這些問題包括如何創建COM組件、如何得到組件對象上的解風口以及調用接口方法、如何管理組件對象(即需要熟悉COM的引用計數機制)等。</DIV>
<DIV><SPAN>
</SPAN>而對于Filter開發人員來說,需要掌握的COM知識就要多一點。因為Filter本身是一種COM組件,開發Filter牽涉到了COM組件的“實現”問題。</DIV>
<DIV><SPAN> <A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN>本身只是一種規范,而不是實現。但是當使用C++來實現時,COM組件就是一個C++類,而接口都是純虛類。COM規范規定,任何組件或接口都必須從IUnknown接口中繼承而來,每個組件都必須實現一個與支相對應的類工廠(Class
Factory),類工廠也是一個COM組件,他實現了IClassFactory接口。在IClassFactory的接口函數CreateInstance中,才能使用new操作生成一個與之對應的COM組件類對象實例。</DIV>
<DIV><SPAN> <A title=""
href="http://blog.csdn.net/ZhangXinbin/archive/2006/09/06/COM"><FONT
color=#0000ff>COM</FONT></A></SPAN>組件有3種類型:進程內組件、本地進程組件和遠程組件。Filter一般是一種進程內組件,以DLL的形式提供服務。</DIV>
<DIV><SPAN>
</SPAN>每個COM組件都使用一個GUID來唯一標識。當創建一個COM組件時,總是首先通過這個GUID調用CoGetClassObject來獲得創建這個組件對象的類工廠。然后調用類工廠的接口方法IClassFactory::CreateInstance,就能真正地創建GUID標示的組件對象了。</DIV>
<DIV><SPAN>
</SPAN>一個典型的自注冊COM組件DLL所必需的5個函數如下:</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllMain:DLL的入口函數(DirectShow實現的是DllEntryPoint);</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllGetClassObject:用于獲得類工廠指針;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllCanUnloadNow:系統空閑時會調用這個函數,以確定是否可以卸載DLL;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllRegisterServer:將COM組件注冊到注冊表中;</DIV>
<DIV style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt"><SPAN>l<SPAN
style="FONT: 7pt 'Times New Roman'">
</SPAN></SPAN>DllUnregisterServer:刪除注冊表中COM組件的注冊信息。</DIV><BR>
<SCRIPT src="轉載:DirectShow 學習筆記(1) 獨行客 天極Blog.files/ding.js"
charset=gb2312></SCRIPT>
</DIV>
<DIV class=rightcom>作者:獨行客 閱讀(
<SCRIPT type=text/javascript> var myArray = getcount('1558777');document.write(myArray[0]);</SCRIPT>
) <A
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -