DirectShow組件及其在媒體播放器設(shè)計(jì)中的應(yīng)用
《DirectShow組件及其在媒體播放器設(shè)計(jì)中的應(yīng)用》由會(huì)員分享,可在線閱讀,更多相關(guān)《DirectShow組件及其在媒體播放器設(shè)計(jì)中的應(yīng)用(8頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、DirectShow組件及其在媒體播放器設(shè)計(jì)中的應(yīng)用 [日期:2006-05-22] 來源: 作者: [字體:大 中 小] 唐蕓 王煜堅(jiān) 吳鎮(zhèn)揚(yáng) 摘要:DirectShow技術(shù)是DirectX推出的建立在DirectDraw和DirectSound組件基礎(chǔ)之上的多媒體應(yīng)用程序開發(fā)工具包,它提供對(duì)多媒體數(shù)據(jù)流的高質(zhì)量捕獲和回放,代表著未來多媒體應(yīng)用程序開發(fā)的方向。詳細(xì)介紹了DirectShow的系統(tǒng)組成,并討論了利用DirectShow在Visual C++ 6.0平臺(tái)上開發(fā)簡單媒體播放器的關(guān)鍵步驟。 關(guān)鍵字:DirectShow;COM;過濾器;引腳;過濾器圖表管理器
2、 1 DirectX簡介 DirectX是Microsoft公司為游戲和其他高性能多媒體應(yīng)用所提供的一套底層應(yīng)用程序編程接口。這些接口包括對(duì)二維和三維圖形,聲效和音樂,輸入設(shè)備以及多玩家網(wǎng)絡(luò)游戲等的支持。目前DirectX的最高版本是DirectX 9.0。 1.1 DirectX的組成 DirectX 9.0由下列組件構(gòu)成: (1)DirectX Graphics:該組件組合DirectX舊版本中的DirectDraw和Direct3D兩個(gè)組件,使其成為一個(gè)適用于所有圖形程序的單獨(dú)的應(yīng)用程序接口。其中的Direct3D擴(kuò)展(D3DX)應(yīng)用程序庫簡化了多數(shù)圖形程序的工作。 (2)
3、DirectInput:支持各種輸入設(shè)備,完全支持力反饋技術(shù)。 (3)DirectPlay:支持多玩家網(wǎng)絡(luò)游戲。 (4)DirectSound:支持用于播放和捕獲音頻波形的高性能音頻應(yīng)用軟件的開發(fā)。 (5)DirectMusic:為音樂音軌以及基于波表、MIDI(Musical Instrument Devices Interface)或其他由DirectMusic Producer創(chuàng)作的非音樂音軌,提供了一套完整的解決方案。 (6)DirectShow:提供對(duì)多媒體數(shù)據(jù)流的高質(zhì)量捕獲和回放。 (7)DirectSetup:一個(gè)簡單的應(yīng)用程序接口,提供DirectX組件的自動(dòng)安裝。
4、 (8)DirectX Media Objects:提供對(duì)數(shù)據(jù)流對(duì)象的讀寫支持,包括視頻和音頻的編解碼器及其效果。 1.2 COM簡介 DirectX的功能都是以COM組件的形式提供的。COM是組件對(duì)象模型(Component Object Model)的簡寫,它是一種協(xié)議,是對(duì)象連接和嵌入(Object Linking and Embedding)的基礎(chǔ)。COM通常以動(dòng)態(tài)鏈接庫(DLL)的形式存在,它是建立在二進(jìn)制規(guī)范上的對(duì)象。COM定義并實(shí)現(xiàn)了軟部件(如應(yīng)用程序、數(shù)據(jù)對(duì)象、控件及服務(wù))機(jī)制,并把他們統(tǒng)稱為“對(duì)象”。每個(gè)軟部件對(duì)象由數(shù)據(jù)以及訪問數(shù)據(jù)的函數(shù)組成,訪問軟部件對(duì)象數(shù)據(jù)的函數(shù)集合
5、稱為“接口”。在應(yīng)用程序看來COM是一個(gè)黑箱,可調(diào)用COM提供的方法但不知道它的具體實(shí)現(xiàn)。在使用DirectShow編程時(shí),用戶創(chuàng)建的自定義組件必須以COM形式實(shí)現(xiàn),所以必須知道如何實(shí)現(xiàn)COM,而一般的應(yīng)用程序只需要了解COM的接口和用法就可以了。 2 DirectShow的系統(tǒng)組成 DirectShow技術(shù)是建立在DirectDraw和DirectSound組件基礎(chǔ)之上的,它通過DirectDraw對(duì)顯卡進(jìn)行控制以顯示視頻,通過DirectSound對(duì)聲卡進(jìn)行控制以播放聲音。 DirectShow可提供高質(zhì)量的多媒體流的捕獲和回放功能;支持多種媒體格式,包括ASF(Advanced Sy
6、stems Format),MPEG(Motion Picture Experts Group),AVI(Audio-Video Interleaved),MP3(MPEG Audio Layer-3)和WAV聲音文件;可以從硬件上捕獲媒體數(shù)據(jù)流;可以自動(dòng)檢測并使用視頻和音頻加速硬件。因此,DirectShow可以充分發(fā)揮媒體的性能,提高運(yùn)行速度,可以簡化媒體播放、媒體間的格式轉(zhuǎn)換和媒體捕獲等工作。同時(shí),它還具有極大的可擴(kuò)展性和靈活性,可以由用戶自己創(chuàng)建組件,并將這個(gè)組件加入DirectShow結(jié)構(gòu)中以支持新的格式或特殊的效果。 應(yīng)用程序與DirectShow組件以及DirectShow所支
7、持的軟硬件之間的關(guān)系如圖1所示。 圖1 DirectShow系統(tǒng)框圖 2.1 過濾器(filter) 由圖1可以看到,過濾器是DirectShow最基本的組成元件。過濾器是一個(gè)COM組件,是完成DirectShow處理過程的基本單元。DirectShow提供了一組標(biāo)準(zhǔn)的過濾器供應(yīng)用程序使用,程序開發(fā)者也可以創(chuàng)建自定義的過濾器來擴(kuò)充DirectShow的功能,但必須是以COM形式建立的。DirectX為用戶提供了DirectShow基類庫(DirectShow Base Class Library),用戶自定義的過濾器都可以從基類庫提供的基類和接口派生出來。 過濾器主要分為以下幾
8、種類型: (1)源過濾器(source filter):源過濾器引入數(shù)據(jù)到過濾器圖表中,數(shù)據(jù)來源可以是文件、網(wǎng)絡(luò)、照相機(jī)等。不同的源過濾器處理不同類型的數(shù)據(jù)源。 (2)變換過濾器(transform filter):變換過濾器的工作是獲取輸入流,處理數(shù)據(jù),并生成輸出流。變換過濾器對(duì)數(shù)據(jù)的處理包括編解碼、格式轉(zhuǎn)換、壓縮解壓縮等。 (3)提交過濾器(renderer filter):提交過濾器在過濾器圖表里處于最后一級(jí),它們接收數(shù)據(jù)并把數(shù)據(jù)提交給外設(shè)。 (4)分割過濾器(splitter filter):分割過濾器把輸入流分割成多個(gè)輸出。例如,AVI分割過濾器把一個(gè)AVI格式的字節(jié)
9、流分割成視頻流和音頻流。 (5)混合過濾器(mux filter):混合過濾器把多個(gè)輸入組合成一個(gè)單獨(dú)的數(shù)據(jù)流。例如,AVI混合過濾器把視頻流和音頻流合成一個(gè)AVI格式的字節(jié)流。 過濾器的這些分類并不是絕對(duì)的,例如一個(gè)ASF讀過濾器(ASF Reader filter)既是一個(gè)源過濾器又是一個(gè)分割過濾器。 在DirectShow里,一組過濾器稱為一個(gè)過濾器圖表(filter graph)。過濾器圖表用來連接過濾器以控制媒體流,它也可以將數(shù)據(jù)返回給應(yīng)用程序,并搜索所支持的過濾器。過濾器有三種可能的狀態(tài):運(yùn)行、停止和暫停。暫停是一種中間狀態(tài),停止?fàn)顟B(tài)到運(yùn)行狀態(tài)必定經(jīng)過暫停狀態(tài)。暫??梢岳?/p>
10、解為數(shù)據(jù)就緒狀態(tài),是為了快速切換到運(yùn)行狀態(tài)而設(shè)計(jì)的。在暫停狀態(tài)下,數(shù)據(jù)線程是啟動(dòng)的,但被提交過濾器阻塞了。通常情況下,過濾器圖表中所有過濾器的狀態(tài)是一致的。 2.2 引腳(pin) 過濾器可以和一個(gè)或多個(gè)過濾器相連,連接的接口也是COM形式的,稱為引腳。過濾器利用引腳在各個(gè)過濾器間傳輸數(shù)據(jù)。每個(gè)引腳都是從Ipin這個(gè)COM對(duì)象派生出來的。每個(gè)引腳都是過濾器的私有對(duì)象,過濾器可以動(dòng)態(tài)的創(chuàng)建引腳,銷毀引腳,自由控制引腳的生存時(shí)間。引腳可以分為輸入引腳(Input pin)和輸出引腳(Output pin)兩種類型,兩個(gè)相連的引腳必須是不同種類的,即輸入引腳只能和輸出引腳相連,且連接的方向總是從
11、輸出引腳指向輸入引腳。 過濾器之間的連接(也就是引腳之間的連接),實(shí)際上是連接雙方媒體類型(Media Type)協(xié)商的過程。連接的大致過程為:如果調(diào)用連接函數(shù)時(shí)已經(jīng)指定了完整的媒體類型,則用這個(gè)媒體類型進(jìn)行連接,成功與否都結(jié)束連接過程;如果沒有指定或不完全指定了媒體類型,則進(jìn)入下面的枚舉過程——枚舉欲連接的輸入引腳上所有的媒體類型,逐一用這些媒體類型與輸出引腳進(jìn)行連接(如果連接函數(shù)提供了不完全媒體類型,則要先將每個(gè)枚舉出來的媒體類型與它進(jìn)行匹配檢查),如果輸出引腳也接受這種媒體類型,則引腳之間的連接宣告成功;如果所有輸入引腳上枚舉的媒體類型,輸出引腳都不支持,則枚舉輸出引腳上的所有媒體類型
12、,并逐一用這些媒體類型與輸入引腳進(jìn)行連接,如果輸入引腳接受其中的一種媒體類型,則引腳之間的連接宣告成功;如果輸出引腳上的所有媒體類型,輸入引腳都不支持,則這兩個(gè)引腳之間的連接過程宣告失敗。過濾器與引腳連接如圖2所示。 圖2 過濾器和引腳連接示意圖 2.3 媒體類型(Media Type) 媒體類型是描述數(shù)字媒體格式的一種通用的可擴(kuò)展方式。兩個(gè)過濾器相連時(shí),必須使用一致的媒體類型,否則這兩個(gè)過濾器就不能相連。媒體類型能識(shí)別上一級(jí)過濾器傳送給下一級(jí)過濾器的數(shù)據(jù)類型,并對(duì)數(shù)據(jù)進(jìn)行分類。 實(shí)際在很多應(yīng)用程序中,用戶根本不需要擔(dān)心媒體類型的問題,DirectShow會(huì)處理好所有的細(xì)節(jié)
13、。但有些應(yīng)用程序需要對(duì)媒體類型進(jìn)行操作。媒體類型一般可以有兩種表示:AM_MEDIA_TYPE和CMediaType。前者是一個(gè)結(jié)構(gòu),后者是從這個(gè)結(jié)構(gòu)繼承過來的類。 每個(gè)AM_MEDIA_TYPE由三部分組成:Major type、Subtype和Format type。這三個(gè)部分都使用GUID(全局唯一標(biāo)識(shí)符)來唯一標(biāo)示。Major type主要定性描述一種媒體類型,這種媒體類型可以是視頻、音頻、比特?cái)?shù)據(jù)流或MIDI數(shù)據(jù)等等;Subtype進(jìn)一步細(xì)化媒體類型,如果是視頻的話可以進(jìn)一步指定是RGB-24,還是RGB-32,或是UYVY等等;Format type則用一個(gè)結(jié)構(gòu)更進(jìn)一步細(xì)化媒體類
14、型。 如果媒體類型的三個(gè)部分都指定了某個(gè)具體的GUID值,則稱這個(gè)媒體類型是完全指定的;如果媒體類型的三個(gè)部分中有任何一個(gè)值是GUID_NULL,則稱這個(gè)媒體類型是不完全指定的。GUID_NULL具有通配符的作用。 2.4 過濾器圖表管理器(Filter Graph Manager) DirectShow通過過濾器圖表管理器來控制過濾器圖表中的過濾器。過濾器圖表管理器是COM 形式的,它的功能有:協(xié)調(diào)過濾器間的狀態(tài)轉(zhuǎn)變;建立參考時(shí)鐘;把事件(event)傳送給應(yīng)用程序;為應(yīng)用程序提供建立過濾器圖表的方法。 一些常用的過濾器圖表管理器接口如下: IGraphBuilder:為應(yīng)用程序
15、提供創(chuàng)建過濾器圖表的方法。 IMediaControl:提供控制過濾器圖表中多媒體數(shù)據(jù)流的方法,包括運(yùn)行、暫停和停止。IMediaEventEx:繼承自IMediaEvent接口,處理過濾器圖表的事件。 IVideoWindow:用于設(shè)置多媒體播放器窗口的屬性,應(yīng)用程序可以用它來設(shè)置窗口的所有者、位置和尺寸等屬性。 IBasicAudio:用于控制音頻流的音量和平衡。 IBasicVideo:用于設(shè)置視頻特性,如視頻顯示的目的區(qū)域和源區(qū)域。 IMediaSeeking:提供搜索數(shù)據(jù)流位置和設(shè)置播放速率的方法。 IMediaPosition:用于尋找數(shù)據(jù)流的位置。 IVideoFr
16、ameStep:用于步進(jìn)播放視頻流,可使DirectShow應(yīng)用程序,包括DVD播放器一次只播放一幀視頻。 2.5 過濾器圖表中的數(shù)據(jù)流動(dòng) 當(dāng)用戶要?jiǎng)?chuàng)建自定義的過濾器時(shí),就需要了解媒體數(shù)據(jù)是如何在過濾器圖表中傳輸?shù)?。為了在過濾器圖表中傳送媒體數(shù)據(jù),DirectShow過濾器需要支持一些協(xié)議,稱之為傳輸協(xié)議(transport)。相連的過濾器必須支持同樣的傳輸協(xié)議,否則不能交換媒體數(shù)據(jù)。 大多數(shù)的DirectShow過濾器把媒體數(shù)據(jù)保存在主存儲(chǔ)器中,并通過引腳把數(shù)據(jù)提交給其它的過濾器,這種傳輸稱為局部存儲(chǔ)器傳輸(local memory transport)。雖然局部存儲(chǔ)器傳輸在Dir
17、ectShow中最常用,但并不是所有的過濾器都使用它。例如,有些過濾器通過硬件傳送媒體數(shù)據(jù),引腳只是用來提交控制信息,如IOverlay接口。 DirectShow為局部存儲(chǔ)器傳輸定義了兩種機(jī)制:推模式(push model)和拉模式(pull model)。在推模式中,源過濾器生成數(shù)據(jù)并提交給下一級(jí)過濾器。下一級(jí)過濾器被動(dòng)的接收數(shù)據(jù),完成處理后再傳送給再下一級(jí)過濾器。在拉模式中,源過濾器與一個(gè)分析過濾器相連。分析過濾器向源過濾器請(qǐng)求數(shù)據(jù)后,源過濾器才傳送數(shù)據(jù)以響應(yīng)請(qǐng)求。推模式使用的是IMemInputPin接口,拉模式使用IAsyncReader接口,推模式比拉模式要更常用。 3 利
18、用DirectShow開發(fā)簡單媒體播放器 本節(jié)介紹基于DirectShow開發(fā)簡單媒體播放器的關(guān)鍵步驟。 3.1 初始化DirectShow 由于DirectShow的組件都是以COM形式存在的,因此首先要調(diào)用CoInitializeEx函數(shù)來初始化COM庫,嵌入所有的動(dòng)態(tài)鏈接庫和資源。否則,所有對(duì)QueryInterface的調(diào)用都會(huì)失敗。 3.2 創(chuàng)建過濾器圖表管理器接口 首先申明并初始化所需的接口: // DirectShow interfaces IGraphBuilder *pGB = NULL; IMediaControl *pMC = NULL; IMe
19、diaEventEx *pME = NULL; IVideoWindow *pVW = NULL; IBasicAudio *pBA = NULL; IBasicVideo *pBV = NULL; IMediaSeeking *pMS = NULL; IMediaPosition *pMP = NULL; IVideoFrameStep *pFS = NULL; 然后實(shí)例化一個(gè)過濾器圖表管理器,并查詢各接口: // Get the interface for DirectShows GraphBuilder CoCreateInstance(CLSID_FilterG
20、raph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB); // QueryInterface for DirectShow interfaces pGB->QueryInterface(IID_IMediaControl, (void **)&pMC); pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME); pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS); pGB->QueryI
21、nterface(IID_IMediaPosition, (void **)&pMP); // Query for video interfaces, which may not be relevant for audio files pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW); pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV); // Query for audio interfaces, which may not be relevant for video-o
22、nly files pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA); 3.3 創(chuàng)建過濾器圖表 應(yīng)用DirectShow創(chuàng)建過濾器圖表時(shí),用戶完全不需要操心系統(tǒng)使用了哪一類過濾器以及過濾器是怎樣連接的。只要調(diào)用IGraphBuilder::RenderFile函數(shù),就可以建成一個(gè)完整的過濾器圖表。 // Have the graph builder construct its the appropriate graph automatically pGB->RenderFile(wFile, NULL); 創(chuàng)建成功后,過濾器
23、圖表就可以用來播放多媒體文件了。DirectShow調(diào)用IMediaControl::Run函數(shù)來播放媒體文件。 // Run the graph to play the media file pMC->Run(); 3.4 使用DirectShow的事件響應(yīng)機(jī)制 DirectShow的事件響應(yīng)機(jī)制是過濾器圖表管理器與用戶進(jìn)行交互的接口,DirectShow處理的可以是一些事先可以預(yù)期的事件,比如數(shù)據(jù)流的結(jié)束;也可以是一些無法預(yù)期的錯(cuò)誤。有的事件可以由過濾器圖表管理器自己處理,但如果過濾器圖表管理器自己無法處理這些事件,它就把事件的通知放在事件隊(duì)列里。用戶程序就可以通過IMedi
24、aEventEx接口得到事件,并對(duì)它做出相應(yīng)的處理。 3.5 清除DirectShow 在程序結(jié)束時(shí)必須調(diào)用Release函數(shù)釋放DirectShow的接口指針,并調(diào)用CoUninitialize函數(shù)來卸載COM庫,釋放所有的動(dòng)態(tài)鏈接庫和資源。 4 結(jié)束語 應(yīng)用DirectX的組件DirectShow進(jìn)行多媒體應(yīng)用程序的開發(fā)需了解多方面的知識(shí),但在很多應(yīng)用中利用DirectShow的特性可以減少工作量并能獲得非常高的運(yùn)行效率。在Visual C++ 6.0的開發(fā)環(huán)境中利用DirectShow開發(fā)的簡單媒體播放器,具有隨機(jī)播放、暫停和調(diào)整播放速率等功能,且可以播放多種媒體文件,播放效果非常流暢。因此,基于DirectShow開發(fā)多媒體應(yīng)用程序的方法簡單高效,是一種值得推薦的方法。 [參考文獻(xiàn)] [1] Microsoft DirectX 9.0 SDK[Z]. , 2002. [2] [美]Dale Rogerson. COM技術(shù)內(nèi)幕[M]. 北京: 清華大學(xué)出版社, 1998 [3] [美]Robert Dunlop, Dale Shepherd, Mark Martin. DirectX 7 速成教程[M]. 北京: 機(jī)械工業(yè)出版社, 2002.
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 川渝旅游日記成都重慶城市介紹推薦景點(diǎn)美食推薦
- XX國有企業(yè)黨委書記個(gè)人述責(zé)述廉報(bào)告及2025年重點(diǎn)工作計(jì)劃
- 世界濕地日濕地的含義及價(jià)值
- 20XX年春節(jié)節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)人到場心到崗
- 大唐女子圖鑒唐朝服飾之美器物之美繪畫之美生活之美
- 節(jié)后開工第一課輕松掌握各要點(diǎn)節(jié)后常見的八大危險(xiǎn)
- 廈門城市旅游介紹廈門景點(diǎn)介紹廈門美食展示
- 節(jié)后開工第一課復(fù)工復(fù)產(chǎn)十注意節(jié)后復(fù)工十檢查
- 傳統(tǒng)文化百善孝為先孝道培訓(xùn)
- 深圳城市旅游介紹景點(diǎn)推薦美食探索
- 節(jié)后復(fù)工安全生產(chǎn)培訓(xùn)勿忘安全本心人人講安全個(gè)個(gè)會(huì)應(yīng)急
- 預(yù)防性維修管理
- 常見閥門類型及特點(diǎn)
- 設(shè)備預(yù)防性維修
- 2.乳化液泵工理論考試試題含答案