DirectX组件之---DirectShow介绍
1. DirectShow介紹
??? DirectShow是一個(gè)windows平臺(tái)上的流媒體框架,提供了高質(zhì)量的多媒體流采集和回放功能。它支持多種多樣的媒體文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同時(shí)支持使用WDM驅(qū)動(dòng)或早期的VFW驅(qū)動(dòng)來(lái)進(jìn)行多媒體流的采集。DirectShow整合了其它的DirectX技術(shù),能自動(dòng)地偵測(cè)并使用可利用的音視頻硬件加速,也能支持沒(méi)有硬件加速的系統(tǒng)。
??? DirectShow大大簡(jiǎn)化了媒體回放、格式轉(zhuǎn)換和采集工作。但與此同時(shí),它也為用戶自定義的解決方案提供了底層流控制框架,從而使用戶可以自行創(chuàng)建支持新的文件格式或其它用途的DirectShow組件。
??? 以下是幾個(gè)使用DirectShow編寫的典型應(yīng)用:DVD播放器、視頻編輯應(yīng)用、AVI到ASF轉(zhuǎn)換器、MP3播放器和數(shù)字視頻采集應(yīng)用。
??? DirectShow是建立在組件對(duì)象模型(COM)上的,因此當(dāng)你編寫DirectShow應(yīng)用時(shí),你必須具備COM客戶端程序編寫的知識(shí)。對(duì)于大部分的應(yīng)用,你不需要實(shí)現(xiàn)自己的COM對(duì)象,DirectShow提供了大部分你需要的DirectShow組件,但是假如你需要編寫自己的DirectShow組件,你還需要具備編寫COM組件的知識(shí)。
1.1. DirectShow支持的格式
??? DirectShow是一個(gè)開(kāi)放的框架,因此只要有合適的filter來(lái)分析和解碼,它可以支持任何格式。DirectShow默認(rèn)支持以下的文件類型和壓縮格式:
??? 注:打*號(hào)的需要Windows Media Format SDK支持
??? 文件類型:
????? Windows Media? Audio (WMA)*
????? Windows Media? Video (WMV)*
????? Advanced Systems Format (ASF)*
????? Motion Picture Experts Group (MPEG)
????? Audio-Video Interleaved (AVI)
????? QuickTime (version 2 and lower)
????? WAV
????? AIFF
????? AU
????? SND
????? MIDI
??? 壓縮格式:
????? Windows Media Video*
????? ISO MPEG-4 video version 1.0*
????? Microsoft MPEG-4 version 3*
????? Sipro Labs ACELP*
????? Windows Media Audio*
????? MPEG Audio Layer-3 (MP3) (decompression only)
????? Digital Video (DV)
????? MPEG-1 (decompression only)
????? MJPEG
????? Cinepak
??? 微軟自己沒(méi)有提供MPEG2解碼器,一些可用的DirectShow MPEG2硬件或軟件解碼器是由第三方提供的。
1.2. 常見(jiàn)問(wèn)題集(摘錄)
1.2.1. 一般問(wèn)題
??? *DirectShow支持哪些操作系統(tǒng)?
????? DirectShow支持Windows9X、Windows2000、Windows Me和Windows XP。
???
??? *使用DirectShow需要多少COM知識(shí)?
????? 應(yīng)用程序開(kāi)發(fā)者只需要基本的COM組件知識(shí):實(shí)例化COM組件、調(diào)用接口、管理接口的引用計(jì)數(shù)。Filter開(kāi)發(fā)者則需要更多。
?????
??? *有與DirectShow兼容的硬件列表(HCL)嗎?
????? 沒(méi)有。如果硬件兼容DirectShow,DirectShow會(huì)使用它們,如果沒(méi)有兼容的硬件,DirectShow使用GDI繪制視頻,以及使用WaveOut系列多媒體API來(lái)播放音頻。
?????
??? *可以使用哪些語(yǔ)言來(lái)編寫DirectShow應(yīng)用?
????? DirectShow主要為C/C++開(kāi)發(fā)設(shè)計(jì)。Visual Basic只能使用其中的很小一部分??梢酝ㄟ^(guò)MS JScript或VB Script來(lái)支持基于腳本的DVD和TV應(yīng)用。也可能用Delphi來(lái)編寫,但SDK文檔不提供這方面的內(nèi)容。
?????
??? *DirectShow會(huì)通過(guò)托管代碼實(shí)現(xiàn)嗎?
????? 目前還沒(méi)有這個(gè)計(jì)劃。DirectX SDK提供了有限的使用音視頻回放類的托管回放功能,你可以使用COM interop創(chuàng)建托管代碼的DirectShow客戶端應(yīng)用,但是因?yàn)樾阅苌系脑?#xff0c;不推薦創(chuàng)建運(yùn)行在CLR上的filter。
??? *DirectShow開(kāi)發(fā)需要什么樣的編譯器?
????? 任何能夠產(chǎn)生COM對(duì)象的編譯器都可以。
?????
??? *DirectShow和DirectX的其它組件的關(guān)系
????? DirectShow和DirectX的其它組件在內(nèi)部進(jìn)行聯(lián)系。DirectShow在硬件的支持下使用DirectSound和DirectDraw。Video Renderer和Overlay Mixer使用DirectDraw 3和DirectDraw5表面(surfaces)。Video Mixing Renderer 7(只支持WINXP)使用DirectDraw7表面。Video Mixing Renderer 9使用最新的(目前是Directx9)Direct3D API函數(shù)。即便是某個(gè)應(yīng)用程序包含了DirectX其它組件,你也不必使用其它組件的API去編寫它。參考SDK的例子:Texture3D Sample。
?????
??? *DirectShow與ActiveMovie的關(guān)系?
????? ActiveMovie是DirectShow原來(lái)的名稱,現(xiàn)已不再使用,但是一部分API仍保留了"AM"的前綴,比如AM_MEDIA_TYPE和IAMVideoAccelerator。
?????
??? *DirectShow是限于多媒體應(yīng)用嗎?
????? DirectShow默認(rèn)包含的組件主要是為音視頻流設(shè)計(jì)的,但是,DirectShow框架已經(jīng)成功地用于其它數(shù)據(jù)流的解決方案中。
?????
??? *GraphEdit工具有源碼嗎?GraphEdit.exe是否可再發(fā)布?
????? 沒(méi)有源碼,不可再發(fā)布。
?????
??? *DMO可以代替DirectShow filter嗎?
????? 在編寫編碼器、解碼器、效果器應(yīng)用時(shí),鼓勵(lì)用DMO代替DirectShow filter。在其它的應(yīng)用中,使用DirectShow filter可能會(huì)比較合適。
?????
1.2.2. 程序編寫問(wèn)題
??? *如何設(shè)置編譯環(huán)境,需要哪些頭文件和庫(kù)?
????? 參考"設(shè)置編譯環(huán)境"章節(jié)
?????
??? *GraphEdit列示了很多沒(méi)有文檔支持的filter,它們都是些什么?
????? GraphEdit枚舉了所有作為filter類型注冊(cè)在系統(tǒng)中的filter,包括由第三方應(yīng)用程序安裝的filter,以及其它微軟技術(shù)如Windows Media或NetMeeting安裝的,另外,一些DirectShow filter被用來(lái)做硬編碼或硬解碼驅(qū)動(dòng)的外殼。Microsoft H.263 Video Codec用于NetMeeting,不再被DirectShow支持。
???
??? *如何知道DirectShow已經(jīng)被安裝?
????? 調(diào)用CoCreateInstance創(chuàng)建一個(gè)Filter Graph Manager實(shí)例,如果成功,表示DirectShow已經(jīng)被安裝,下面是一個(gè)例子:
| ????? IGraphBuilder *pGraph; ?????? HRESULT hr = CoCreateInstance(CLSID_FilterGraph, |
??????????
??? *如果不通過(guò)屬性設(shè)置頁(yè)來(lái)更改filter的設(shè)置?
????? 當(dāng)然是通過(guò)filter提供的接口羅。如果沒(méi)有提供,就沒(méi)有辦法啦
?????
??? *DirectShow能通知應(yīng)用程序當(dāng)前回放位置嗎?
????? 不提供回調(diào)來(lái)通知位置,需要使用一個(gè)計(jì)時(shí)器定時(shí)調(diào)用IMediaSeeking::GetCurrentPosition方法來(lái)得到當(dāng)前回放位置。
?????
??? *filter運(yùn)行在哪個(gè)特權(quán)級(jí)別下?
????? 運(yùn)行在Ring 3特權(quán)級(jí)別下,某些流控制驅(qū)動(dòng)(如音視頻采集驅(qū)動(dòng))運(yùn)行在Ring 0特權(quán)級(jí)別下。
?????
??? *需要一個(gè)Kernel調(diào)試器嗎?
????? 這依據(jù)具體的項(xiàng)目。安裝DirectX調(diào)試運(yùn)行時(shí)庫(kù)(DirectX debug runtime library)意味著安裝調(diào)試驅(qū)動(dòng)(Debug driver)和其它核心組件(kernel mode component),因此如果你的應(yīng)用程序在其中的某個(gè)組件中產(chǎn)生了一個(gè)調(diào)試斷言(debug assert),你的機(jī)器就會(huì)自動(dòng)重啟除非你擁有一個(gè)kernal調(diào)試器。
?????
??? *DEFINE_GUID宏是怎么工作的?
????? 使用DEFINE_GUID宏可以讓你通過(guò)包含同一個(gè)頭文件來(lái)定義GUID值而不必使用extern關(guān)鍵詞。比如,你的工程中有三個(gè)源文件:src1.cpp,src2.cpp,src3.cpp,它們都使用一個(gè)相同的GUID值,而為了保證一致性,這個(gè)GUID只能在你的工程中定義一次,這時(shí),其它的源文件必須定義外部引用來(lái)使用它。用了DEFINE_GUID,你可以使用在所有源文件中包含同一個(gè)頭文件,在頭文件中這樣定義GUID:
| ??? DEFINE_GUID(CLSID_MyObject, ???????? 0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00); |
??????????? 這個(gè)例子中GUID為0,實(shí)際編程中請(qǐng)用Guidgen工具來(lái)產(chǎn)生一個(gè)GUID,在其中的一個(gè)源文件中,在你的頭文件前包含initguid.h,如:
| // Src1.cpp#include #include "MyGuids.h"// Src2.cpp#include "MyGuids.h"
// Src3.cpp#include "MyGuids.h" |
?????
在沒(méi)有包含Initguid.h的地方,DEFINE_GUID宏創(chuàng)建外部引用來(lái)使用GUID值,在包含Initguid.h的地方,DEFINE_GUID重定義DEFINE_GUID宏以產(chǎn)生GUID的定義。
如是沒(méi)有在任何地方添加Initguid.h,你會(huì)得到一個(gè)鏈接錯(cuò)誤:"unresolved external symbol." ,如果同樣的GUID包含Initguid.h兩次,會(huì)得到編譯錯(cuò)誤"redefinition; multiple initialization."要解決這些問(wèn)題,請(qǐng)確認(rèn)Initguid.h只包含一次。同樣的,不要包含Initguid.h到預(yù)編譯頭文件中去,因?yàn)轭A(yù)編譯頭文件會(huì)被每個(gè)源文件包含。
總結(jié)
以上是生活随笔為你收集整理的DirectX组件之---DirectShow介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Taro+react开发(5)--tor
- 下一篇: 编写高质量可维护的代码:优雅命名