《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 通信與網(wǎng)絡(luò) > 設(shè)計應(yīng)用 > 基于DirectShow的視頻廣播系統(tǒng)設(shè)計與實現(xiàn)
基于DirectShow的視頻廣播系統(tǒng)設(shè)計與實現(xiàn)
邵 林 曹漢強
摘要: 分析了DirectShow技術(shù)的結(jié)構(gòu)和原理,采用DirectShow開發(fā)了視頻廣播系統(tǒng),并介紹了其軟件設(shè)計方案和實現(xiàn)方法。
關(guān)鍵詞: DirectShow 視頻廣播
Abstract:
Key words :

  摘  要: 分析了DirectShow技術(shù)的結(jié)構(gòu)和原理,采用DirectShow開發(fā)了視頻廣播系統(tǒng),并介紹了其軟件設(shè)計方案和實現(xiàn)方法。

  關(guān)鍵詞: DirectShow  視頻廣播

 

1 視頻廣播系統(tǒng)的結(jié)構(gòu)

  視頻廣播系統(tǒng)為用戶提供實時語音和視頻數(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è)計原理

  微軟的DirectShow技術(shù)是在Windows平臺下開發(fā)流媒體程序的有效方法。DirectShow將流媒體處理劃分為若干個連續(xù)的步驟。這些步驟包括音視頻數(shù)據(jù)的采集、傳輸、分離、合并、編碼、解碼和回放等。一個具體的流媒體處理過程可以由其中的幾個步驟組成。濾波器(Filter)是DirectShow中最基本的單元,不同的濾波器實現(xiàn)不同的功能,可以處理一個或多個步驟。DirectShow定義了一系列的濾波器,每個濾波器需要實現(xiàn)若干個接口。開發(fā)人員可以創(chuàng)建自己的濾波器,也可以使用微軟或第三方提供的濾波器。應(yīng)用程序連接若干個濾波器進(jìn)行指定的流媒體處理。數(shù)據(jù)可以在不同的濾波器間傳輸,傳輸方向一般是單向的。如果數(shù)據(jù)從濾波器A傳向濾波器B,則稱濾波器A為上游濾波器,濾波器B為下游濾波器。傳輸?shù)臄?shù)據(jù)加有時間戳,用來同步音視頻數(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):對數(shù)據(jù)進(jìn)行最后的處理,可以顯示視頻、回放音頻、保存數(shù)據(jù)或者將數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)等。

  利用DirectShow開發(fā)流媒體程序的框架如圖2所示。

 

 

3 系統(tǒng)設(shè)計

  視頻廣播系統(tǒng)的軟件設(shè)計有2種方案可供選擇:(1)不使用DirectShow,在服務(wù)器端采用VFW或設(shè)備廠商提供的二次開發(fā)包采集數(shù)據(jù),在客戶端采用GDI或DirectDraw顯示。(2)采用DirectShow的設(shè)計方案。服務(wù)器軟件設(shè)計中包括源濾波器以采集視頻,變換濾波器用于壓縮視頻,終端濾波器用于發(fā)送壓縮數(shù)據(jù);客戶端軟件設(shè)計也相應(yīng)地包括源濾波器以接收網(wǎng)絡(luò)數(shù)據(jù),變換濾波器用于解壓視頻數(shù)據(jù),終端濾波器用于顯示視頻。

  采用VFW進(jìn)行視頻捕獲效率較低,捕獲幀率只能達(dá)到15幀/秒。而采用設(shè)備廠商提供的二次開發(fā)包雖然可以獲取較高的效率,但不同廠商提供的開發(fā)包風(fēng)格各異,使用不同設(shè)備時需要重復(fù)編寫代碼。DirectShow方法可以達(dá)到較高的效率,同時在DirectShow中對硬件設(shè)備進(jìn)行了封裝,開發(fā)人員不需要重復(fù)編寫代碼。由于DirectShow已經(jīng)在流媒體程序設(shè)計中得到普及,網(wǎng)絡(luò)上有大量第三方提供的編解碼濾波器,因此基于DirectShow設(shè)計的系統(tǒng)能夠直接使用這些濾波器,從而縮短開發(fā)時間。同時因為有較多的編碼方式可以選擇,所以系統(tǒng)能夠適應(yīng)更多的應(yīng)用環(huán)境。此外,DirectShow在處理視頻數(shù)據(jù)回放時,盡可能采用DirectDraw技術(shù),可有效地利用用戶的顯卡設(shè)備??梢?采用DirectShow設(shè)計的系統(tǒng)容易升級和維護(hù),程序具有較好的性能。

4 系統(tǒng)實現(xiàn)中的關(guān)鍵技術(shù)

  (1)視頻捕獲

  視頻廣播的數(shù)據(jù)可能來自視頻采集卡、USB攝像頭或者TV卡等輸入設(shè)備,因此服務(wù)器軟件需要在不同的硬件平臺上工作。DirectShow使用一類特殊的源濾波器對硬件設(shè)備進(jìn)行封裝。這類濾波器工作在用戶模式下,使用方法與普通的濾波器相同,在內(nèi)部完成與硬件驅(qū)動程序的交互,實現(xiàn)內(nèi)核模式和用戶模式間的數(shù)據(jù)交換。DirectShow支持多類設(shè)備,如VFW Capture Filter封裝早期的VFW視頻采集設(shè)備,KsProxy Filter封裝WDM驅(qū)動硬件等。服務(wù)器軟件啟動時通過DirectShow提供的設(shè)備枚舉功能(Enumerating Devices)查詢已安裝的所有視頻采集設(shè)備,不同的設(shè)備選擇不同的捕獲濾波器進(jìn)行數(shù)據(jù)采集。如果采集設(shè)備使用WDM驅(qū)動模式,在捕捉濾波器上游還需要尋找是否存在其他特定的濾波器,支持硬件提供的附加功能。如使用PV143四路采集卡時,在捕獲濾波器的上游需要一個流十字濾波器(Crossbar Filter),對視頻輸入端口進(jìn)行選擇。

  (2)圖標(biāo)的實現(xiàn)

  某些場合需要在客戶端的解碼圖像中加入圖標(biāo)(如公司或?qū)W校的標(biāo)志)和文本(如重要通知)。這時可以在解碼濾波器和顯示濾波器間添加一個變換濾波器處理圖標(biāo)和文本。DirectShow中的變換濾波器有2種工作方式:Copy模式和InPlace模式。在Copy模式下,濾波器接收上游濾波器提供的數(shù)據(jù),處理后拷貝到自己的緩沖區(qū),然后將新緩沖區(qū)發(fā)送到下游濾波器。在InPlace模式下,濾波器處理完所接收數(shù)據(jù)后直接發(fā)送到下游的濾波器。由于多媒體數(shù)據(jù)量較大,數(shù)據(jù)拷貝會消耗較多時間,因此在設(shè)計變換濾波器時應(yīng)首先考慮InPlace模式。但在某些場合,如設(shè)計編解碼濾波器,只能采用Copy模式。

  圖標(biāo)文本濾波器放置在解碼濾波器和顯示濾波器之間,輸入數(shù)據(jù)是RGB或YUV格式的未壓縮圖像,直接修改其中部分?jǐn)?shù)據(jù)就可在圖像中顯示圖標(biāo)或文本,因此采用InPlace模式設(shè)計濾波器即可。DirectShow自帶一個InPalce的變換濾波器Sample Grabber Filter。Sample Grabber Filter提供一個ISampleGrabber的接口。ISampleGrabber需要自定義一個ISampleGrabberCB接口,實現(xiàn)其中的BufferCB或SampleCB函數(shù),然后通過ISampleGrabber接口的SetCallback函數(shù)選取ISampleGrabberCB接口設(shè)置回調(diào)函數(shù)。SetCallback的調(diào)用方法為:HRESULT SetCallback(ISampleGrabberCB*pCallback,long WhichMethodToCallback)。參數(shù)WhichMethodToCallback的值設(shè)為0時,SampleCB為回調(diào)函數(shù);為1時,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ù)主動發(fā)送到下游濾波器中;在拉模式下,下游濾波器決定數(shù)據(jù)傳輸,它在需要數(shù)據(jù)時向上游濾波器索取,而上游濾波器不主動向下游濾波器發(fā)送數(shù)據(jù)。

  客戶端軟件中的源濾波器設(shè)計基于微軟DirectX SDK中Memfile的例子。Memfile是一個拉模式的濾波器,解碼濾波器采用循環(huán)方式向Memfile索取數(shù)據(jù)。即使Memfile中沒有有效數(shù)據(jù),解碼濾波器依然會持續(xù)讀取。由于客戶端數(shù)據(jù)來自網(wǎng)絡(luò),數(shù)據(jù)總是間斷到達(dá),所以這種循環(huán)索取數(shù)據(jù)的程序執(zhí)行效率低下,測試時CPU的占用率持續(xù)在100%,丟包的現(xiàn)象較為嚴(yán)重,解碼畫面不連續(xù),有大量馬賽克。因此需要優(yōu)化解碼濾波器和Memfile之間的數(shù)據(jù)傳輸。

  DirectShow的設(shè)計采用多線程機(jī)制,這里可以借鑒非阻塞套接字函數(shù)的方法進(jìn)行優(yōu)化。解碼濾波器在讀取數(shù)據(jù)時傳入1個CEvent變量作為信號燈使用,Memfile發(fā)現(xiàn)無數(shù)據(jù)可讀時鎖住CEvent,通知解碼濾波器正在等待數(shù)據(jù),此時解碼濾波器在Cevent上等待。當(dāng)Memfile中有新數(shù)據(jù)到來時釋放CEvent,解碼濾波器再次讀取數(shù)據(jù)。改進(jìn)后的流程如下。

 ?、俳獯a濾波器向Memfile索取數(shù)據(jù)。

 ?、谌绻鸐emfile有數(shù)據(jù)則跳至⑤,無數(shù)據(jù)則掛起線程。

 ?、跰emfile收到數(shù)據(jù)則喚醒線程,跳至①。

 ?、芫€程掛起超時,跳至①。

  ⑤解碼濾波器處理數(shù)據(jù)。

  在Pentium IV、256M的機(jī)器上測試客戶端軟件,解碼濾波器采用MPEG2解碼器。測試結(jié)果顯示更新后的程序CPU占用率降至40%。

5  結(jié)束語

  在Windows平臺下,微軟的DirectShow技術(shù)是開發(fā)流媒體應(yīng)用程序的有效方法。本文介紹了DirectShow程序設(shè)計的原理,采用DirectShow技術(shù)實現(xiàn)了一個視頻廣播系統(tǒng)。測試結(jié)果表明,該系統(tǒng)在運行時能夠達(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é)報,2003;19(2)

4  何頂新,周永鵬,萬淑蕓.實時網(wǎng)絡(luò)視頻廣播系統(tǒng)的設(shè)計與實現(xiàn).華中科技大學(xué)學(xué)報,2001;29(3)

5  張振偉,李志淮.網(wǎng)絡(luò)視頻直播緩存系統(tǒng)設(shè)計.計算機(jī)工程,2002;28(8)

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。