流媒體的處理,以其復(fù)雜性和技術(shù)性,一向廣受工業(yè)界的關(guān)注。特別伴隨著因特網(wǎng)的普及,流媒體在網(wǎng)絡(luò)上的廣泛應(yīng)用,怎樣使流媒體的處理變得簡(jiǎn)單而富有成效逐漸成為了焦點(diǎn)問題。選擇一種合適的應(yīng)用方案,事半功倍。此時(shí),微軟的DirectShow,給了我們一個(gè)不錯(cuò)的選擇。
DirectShow是微軟公司提供的一套在Windows平臺(tái)上進(jìn)行流媒體處理的開發(fā)包,與DirectX開發(fā)包一起發(fā)布。目前,DirectX最新版本為9.0。
那么,DirectShow能夠做些什么呢?且看,DirectShow為多媒體流的捕捉和回放提供了強(qiáng)有力的支持。運(yùn)用DirectShow,我們可以很方便地從支持WDM驅(qū)動(dòng)模型的采集卡上捕獲數(shù)據(jù),并且進(jìn)行相應(yīng)的后期處理乃至存儲(chǔ)到文件中。它廣泛地支持各種媒體格式,包括Asf、Mpeg、Avi、Dv、Mp3、Wave等等,使得多媒體數(shù)據(jù)的回放變得輕而易舉。另外,DirectShow還集成了DirectX其它部分(比如DirectDraw、DirectSound)的技術(shù),直接支持DVD的播放,視頻的非線性編輯,以及與數(shù)字?jǐn)z像機(jī)的數(shù)據(jù)交換。更值得一提的是,DirectShow提供的是一種開放式的開發(fā)環(huán)境,我們可以根據(jù)自己的需要定制自己的組件。
接下去,我們需要對(duì)DirectShow系統(tǒng)有個(gè)整體的印象。參見以下DirectShow的系統(tǒng)示意圖:
圖中央最大的一塊即是DirectShow系統(tǒng)。DirectShow使用一種叫Filter Graph的模型來(lái)管理整個(gè)數(shù)據(jù)流的處理過程;參與數(shù)據(jù)處理的各個(gè)功能模塊叫做Filter;各個(gè)Filter在Filter Graph中按一定的順序連接成一條“流水線”協(xié)同工作。大家可以看到,按照功能來(lái)分,F(xiàn)ilter大致分為三類:Source Filters、Transform Filters和Rendering Filters。Source Filters主要負(fù)責(zé)取得數(shù)據(jù),數(shù)據(jù)源可以是文件、因特網(wǎng)、或者計(jì)算機(jī)里的采集卡、數(shù)字?jǐn)z像機(jī)等,然后將數(shù)據(jù)往下傳輸;Transform Fitlers主要負(fù)責(zé)數(shù)據(jù)的格式轉(zhuǎn)換、傳輸;Rendering Filtes主要負(fù)責(zé)數(shù)據(jù)的最終去向,我們可以將數(shù)據(jù)送給聲卡、顯卡進(jìn)行多媒體的演示,也可以輸出到文件進(jìn)行存儲(chǔ)。值得注意的是,三個(gè)部分并不是都只有一個(gè)Filter去完成功能。恰恰相反,每個(gè)部分往往是有幾個(gè)Fitler協(xié)同工作的。比如,Transform Filters可能包含了一個(gè)Mpeg的解碼Filter、以及視頻色彩空間的轉(zhuǎn)換Filter、音頻采樣頻率轉(zhuǎn)換Filter等等。除了系統(tǒng)提供的大量Filter外,我們可以定制自己的Filter,以完成我們需要的功能。下圖是一條典型的Avi文件回放Filter Graph鏈路:
在DirectShow系統(tǒng)之上,我們看到的,即是我們的應(yīng)用程序(Application)。應(yīng)用程序要按照一定的意圖建立起相應(yīng)的Filter Graph,然后通過Filter Graph Manager來(lái)控制整個(gè)的數(shù)據(jù)處理過程。DirectShow能在Filter Graph運(yùn)行的時(shí)候接收到各種事件,并通過消息的方式發(fā)送到我們的應(yīng)用程序。這樣,就實(shí)現(xiàn)了應(yīng)用程序與DirectShow系統(tǒng)之間的交互。下圖給出了DirectShow應(yīng)用程序開發(fā)的一般過程:
以上簡(jiǎn)單介紹了DirectShow的系統(tǒng)結(jié)構(gòu),希望大家對(duì)這個(gè)強(qiáng)勁的應(yīng)用框架已經(jīng)有了大概的認(rèn)識(shí)。如果你有興趣,可以詳細(xì)研究DirectX的幫助文檔。DirectShow是一個(gè)強(qiáng)大的開發(fā)包;另外,它是基于COM的,因此要求程序員具有COM編程的一些基本知識(shí)。關(guān)于如何深入學(xué)習(xí)DirectShow應(yīng)用結(jié)構(gòu)以及開發(fā)自己的Filter,請(qǐng)參閱筆者的后續(xù)文章。筆者將從編程的角度,詳細(xì)講述來(lái)源于實(shí)際工作中的經(jīng)驗(yàn)之談。