摘 要: 分析了DirectShow技術(shù)的結(jié)構(gòu)和原理,采用DirectShow開(kāi)發(fā)了視頻廣播系統(tǒng),并介紹了其軟件設(shè)計(jì)方案和實(shí)現(xiàn)方法。
關(guān)鍵詞: DirectShow 視頻廣播
1 視頻廣播系統(tǒng)的結(jié)構(gòu)
視頻廣播系統(tǒng)為用戶提供實(shí)時(shí)語(yǔ)音和視頻數(shù)據(jù),服務(wù)方式類似于傳統(tǒng)的有線電視網(wǎng)。視頻廣播系統(tǒng)由三部分組成:廣播服務(wù)器、轉(zhuǎn)發(fā)服務(wù)器和客戶端。廣播服務(wù)器負(fù)責(zé)音視頻數(shù)據(jù)的采集、壓縮和發(fā)送。轉(zhuǎn)發(fā)服務(wù)器負(fù)責(zé)轉(zhuǎn)發(fā)音視頻數(shù)據(jù)??蛻舳素?fù)責(zé)音視頻數(shù)據(jù)的接收、解碼和回放。典型的視頻廣播系統(tǒng)結(jié)構(gòu)如圖1所示。

2 DirectShow程序設(shè)計(jì)原理
微軟的DirectShow技術(shù)是在Windows平臺(tái)下開(kāi)發(fā)流媒體程序的有效方法。DirectShow將流媒體處理劃分為若干個(gè)連續(xù)的步驟。這些步驟包括音視頻數(shù)據(jù)的采集、傳輸、分離、合并、編碼、解碼和回放等。一個(gè)具體的流媒體處理過(guò)程可以由其中的幾個(gè)步驟組成。濾波器(Filter)是DirectShow中最基本的單元,不同的濾波器實(shí)現(xiàn)不同的功能,可以處理一個(gè)或多個(gè)步驟。DirectShow定義了一系列的濾波器,每個(gè)濾波器需要實(shí)現(xiàn)若干個(gè)接口。開(kāi)發(fā)人員可以創(chuàng)建自己的濾波器,也可以使用微軟或第三方提供的濾波器。應(yīng)用程序連接若干個(gè)濾波器進(jìn)行指定的流媒體處理。數(shù)據(jù)可以在不同的濾波器間傳輸,傳輸方向一般是單向的。如果數(shù)據(jù)從濾波器A傳向?yàn)V波器B,則稱濾波器A為上游濾波器,濾波器B為下游濾波器。傳輸?shù)臄?shù)據(jù)加有時(shí)間戳,用來(lái)同步音視頻數(shù)據(jù)的回放。在DirectShow中,濾波器可以分為3類。
(1)源濾波器(Source Filter):從數(shù)據(jù)源獲取原始數(shù)據(jù)。不同的源濾波器可以處理一類或多類數(shù)據(jù)源,包括本地文件、網(wǎng)絡(luò)和數(shù)據(jù)采集卡等。
(2)變換濾波器(Transform Filter):從上游濾波器接收數(shù)據(jù),處理后提交給下游濾波器。變換濾波器可以進(jìn)行數(shù)據(jù)的壓縮解壓、復(fù)合分離或者其他處理。
(3)終端濾波器(Render Filter):對(duì)數(shù)據(jù)進(jìn)行最后的處理,可以顯示視頻、回放音頻、保存數(shù)據(jù)或者將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)等。
利用DirectShow開(kāi)發(fā)流媒體程序的框架如圖2所示。

3 系統(tǒng)設(shè)計(jì)
視頻廣播系統(tǒng)的軟件設(shè)計(jì)有2種方案可供選擇:(1)不使用DirectShow,在服務(wù)器端采用VFW或設(shè)備廠商提供的二次開(kāi)發(fā)包采集數(shù)據(jù),在客戶端采用GDI或DirectDraw顯示。(2)采用DirectShow的設(shè)計(jì)方案。服務(wù)器軟件設(shè)計(jì)中包括源濾波器以采集視頻,變換濾波器用于壓縮視頻,終端濾波器用于發(fā)送壓縮數(shù)據(jù);客戶端軟件設(shè)計(jì)也相應(yīng)地包括源濾波器以接收網(wǎng)絡(luò)數(shù)據(jù),變換濾波器用于解壓視頻數(shù)據(jù),終端濾波器用于顯示視頻。
采用VFW進(jìn)行視頻捕獲效率較低,捕獲幀率只能達(dá)到15幀/秒。而采用設(shè)備廠商提供的二次開(kāi)發(fā)包雖然可以獲取較高的效率,但不同廠商提供的開(kāi)發(fā)包風(fēng)格各異,使用不同設(shè)備時(shí)需要重復(fù)編寫代碼。DirectShow方法可以達(dá)到較高的效率,同時(shí)在DirectShow中對(duì)硬件設(shè)備進(jìn)行了封裝,開(kāi)發(fā)人員不需要重復(fù)編寫代碼。由于DirectShow已經(jīng)在流媒體程序設(shè)計(jì)中得到普及,網(wǎng)絡(luò)上有大量第三方提供的編解碼濾波器,因此基于DirectShow設(shè)計(jì)的系統(tǒng)能夠直接使用這些濾波器,從而縮短開(kāi)發(fā)時(shí)間。同時(shí)因?yàn)橛休^多的編碼方式可以選擇,所以系統(tǒng)能夠適應(yīng)更多的應(yīng)用環(huán)境。此外,DirectShow在處理視頻數(shù)據(jù)回放時(shí),盡可能采用DirectDraw技術(shù),可有效地利用用戶的顯卡設(shè)備??梢?jiàn),采用DirectShow設(shè)計(jì)的系統(tǒng)容易升級(jí)和維護(hù),程序具有較好的性能。
4 系統(tǒng)實(shí)現(xiàn)中的關(guān)鍵技術(shù)
(1)視頻捕獲
視頻廣播的數(shù)據(jù)可能來(lái)自視頻采集卡、USB攝像頭或者TV卡等輸入設(shè)備,因此服務(wù)器軟件需要在不同的硬件平臺(tái)上工作。DirectShow使用一類特殊的源濾波器對(duì)硬件設(shè)備進(jìn)行封裝。這類濾波器工作在用戶模式下,使用方法與普通的濾波器相同,在內(nèi)部完成與硬件驅(qū)動(dòng)程序的交互,實(shí)現(xiàn)內(nèi)核模式和用戶模式間的數(shù)據(jù)交換。DirectShow支持多類設(shè)備,如VFW Capture Filter封裝早期的VFW視頻采集設(shè)備,KsProxy Filter封裝WDM驅(qū)動(dòng)硬件等。服務(wù)器軟件啟動(dòng)時(shí)通過(guò)DirectShow提供的設(shè)備枚舉功能(Enumerating Devices)查詢已安裝的所有視頻采集設(shè)備,不同的設(shè)備選擇不同的捕獲濾波器進(jìn)行數(shù)據(jù)采集。如果采集設(shè)備使用WDM驅(qū)動(dòng)模式,在捕捉濾波器上游還需要尋找是否存在其他特定的濾波器,支持硬件提供的附加功能。如使用PV143四路采集卡時(shí),在捕獲濾波器的上游需要一個(gè)流十字濾波器(Crossbar Filter),對(duì)視頻輸入端口進(jìn)行選擇。
(2)圖標(biāo)的實(shí)現(xiàn)
某些場(chǎng)合需要在客戶端的解碼圖像中加入圖標(biāo)(如公司或?qū)W校的標(biāo)志)和文本(如重要通知)。這時(shí)可以在解碼濾波器和顯示濾波器間添加一個(gè)變換濾波器處理圖標(biāo)和文本。DirectShow中的變換濾波器有2種工作方式:Copy模式和InPlace模式。在Copy模式下,濾波器接收上游濾波器提供的數(shù)據(jù),處理后拷貝到自己的緩沖區(qū),然后將新緩沖區(qū)發(fā)送到下游濾波器。在InPlace模式下,濾波器處理完所接收數(shù)據(jù)后直接發(fā)送到下游的濾波器。由于多媒體數(shù)據(jù)量較大,數(shù)據(jù)拷貝會(huì)消耗較多時(shí)間,因此在設(shè)計(jì)變換濾波器時(shí)應(yīng)首先考慮InPlace模式。但在某些場(chǎng)合,如設(shè)計(jì)編解碼濾波器,只能采用Copy模式。
圖標(biāo)文本濾波器放置在解碼濾波器和顯示濾波器之間,輸入數(shù)據(jù)是RGB或YUV格式的未壓縮圖像,直接修改其中部分?jǐn)?shù)據(jù)就可在圖像中顯示圖標(biāo)或文本,因此采用InPlace模式設(shè)計(jì)濾波器即可。DirectShow自帶一個(gè)InPalce的變換濾波器Sample Grabber Filter。Sample Grabber Filter提供一個(gè)ISampleGrabber的接口。ISampleGrabber需要自定義一個(gè)ISampleGrabberCB接口,實(shí)現(xiàn)其中的BufferCB或SampleCB函數(shù),然后通過(guò)ISampleGrabber接口的SetCallback函數(shù)選取ISampleGrabberCB接口設(shè)置回調(diào)函數(shù)。SetCallback的調(diào)用方法為:HRESULT SetCallback(ISampleGrabberCB*pCallback,long WhichMethodToCallback)。參數(shù)WhichMethodToCallback的值設(shè)為0時(shí),SampleCB為回調(diào)函數(shù);為1時(shí),BufferCB為回調(diào)函數(shù)。在SampleCB和BufferCB中可以獲取待顯示數(shù)據(jù),添加圖標(biāo)和文本。SampleCB還可以提供顯示數(shù)據(jù)的額外信息(如數(shù)據(jù)格式),因此使用SampleCB更加靈活。
(3)數(shù)據(jù)接收
在DirectShow中,數(shù)據(jù)傳輸有拉(Pull)和推(Push)二種模式。在推模式下,上游濾波器決定數(shù)據(jù)傳輸,它將數(shù)據(jù)主動(dòng)發(fā)送到下游濾波器中;在拉模式下,下游濾波器決定數(shù)據(jù)傳輸,它在需要數(shù)據(jù)時(shí)向上游濾波器索取,而上游濾波器不主動(dòng)向下游濾波器發(fā)送數(shù)據(jù)。
客戶端軟件中的源濾波器設(shè)計(jì)基于微軟DirectX SDK中Memfile的例子。Memfile是一個(gè)拉模式的濾波器,解碼濾波器采用循環(huán)方式向Memfile索取數(shù)據(jù)。即使Memfile中沒(méi)有有效數(shù)據(jù),解碼濾波器依然會(huì)持續(xù)讀取。由于客戶端數(shù)據(jù)來(lái)自網(wǎng)絡(luò),數(shù)據(jù)總是間斷到達(dá),所以這種循環(huán)索取數(shù)據(jù)的程序執(zhí)行效率低下,測(cè)試時(shí)CPU的占用率持續(xù)在100%,丟包的現(xiàn)象較為嚴(yán)重,解碼畫面不連續(xù),有大量馬賽克。因此需要優(yōu)化解碼濾波器和Memfile之間的數(shù)據(jù)傳輸。
DirectShow的設(shè)計(jì)采用多線程機(jī)制,這里可以借鑒非阻塞套接字函數(shù)的方法進(jìn)行優(yōu)化。解碼濾波器在讀取數(shù)據(jù)時(shí)傳入1個(gè)CEvent變量作為信號(hào)燈使用,Memfile發(fā)現(xiàn)無(wú)數(shù)據(jù)可讀時(shí)鎖住CEvent,通知解碼濾波器正在等待數(shù)據(jù),此時(shí)解碼濾波器在Cevent上等待。當(dāng)Memfile中有新數(shù)據(jù)到來(lái)時(shí)釋放CEvent,解碼濾波器再次讀取數(shù)據(jù)。改進(jìn)后的流程如下。
①解碼濾波器向Memfile索取數(shù)據(jù)。
?、谌绻鸐emfile有數(shù)據(jù)則跳至⑤,無(wú)數(shù)據(jù)則掛起線程。
?、跰emfile收到數(shù)據(jù)則喚醒線程,跳至①。
?、芫€程掛起超時(shí),跳至①。
?、萁獯a濾波器處理數(shù)據(jù)。
在Pentium IV、256M的機(jī)器上測(cè)試客戶端軟件,解碼濾波器采用MPEG2解碼器。測(cè)試結(jié)果顯示更新后的程序CPU占用率降至40%。
5 結(jié)束語(yǔ)
在Windows平臺(tái)下,微軟的DirectShow技術(shù)是開(kāi)發(fā)流媒體應(yīng)用程序的有效方法。本文介紹了DirectShow程序設(shè)計(jì)的原理,采用DirectShow技術(shù)實(shí)現(xiàn)了一個(gè)視頻廣播系統(tǒng)。測(cè)試結(jié)果表明,該系統(tǒng)在運(yùn)行時(shí)能夠達(dá)到良好效果。
參考文獻(xiàn)
1 DirectX Documentation for C++.Microsoft Corporation,2002
2 Regerson D.Inside COM.Microsoft Press,1997
3 廖義奎,王志文,韋衛(wèi)星.基于視頻組播的網(wǎng)絡(luò)教學(xué)系統(tǒng)研究.廣西科學(xué)院學(xué)報(bào),2003;19(2)
4 何頂新,周永鵬,萬(wàn)淑蕓.實(shí)時(shí)網(wǎng)絡(luò)視頻廣播系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).華中科技大學(xué)學(xué)報(bào),2001;29(3)
5 張振偉,李志淮.網(wǎng)絡(luò)視頻直播緩存系統(tǒng)設(shè)計(jì).計(jì)算機(jī)工程,2002;28(8)
