《電子技術應用》
您所在的位置:首頁 > 通信与网络 > 设计应用 > 基于DirectShow的视频广播系统设计与实现
基于DirectShow的视频广播系统设计与实现
邵 林 曹汉强
摘要: 分析了DirectShow技术的结构和原理,采用DirectShow开发了视频广播系统,并介绍了其软件设计方案和实现方法。
關鍵詞: DirectShow 视频广播
Abstract:
Key words :

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

  關鍵詞: DirectShow  視頻廣播

 

1 視頻廣播系統(tǒng)的結構

  視頻廣播系統(tǒng)為用戶提供實時語音和視頻數據,服務方式類似于傳統(tǒng)的有線電視網。視頻廣播系統(tǒng)由三部分組成:廣播服務器、轉發(fā)服務器和客戶端。廣播服務器負責音視頻數據的采集、壓縮和發(fā)送。轉發(fā)服務器負責轉發(fā)音視頻數據。客戶端負責音視頻數據的接收、解碼和回放。典型的視頻廣播系統(tǒng)結構如圖1所示。

 

 

2 DirectShow程序設計原理

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

  (1)源濾波器(Source Filter):從數據源獲取原始數據。不同的源濾波器可以處理一類或多類數據源,包括本地文件、網絡和數據采集卡等。

  (2)變換濾波器(Transform Filter):從上游濾波器接收數據,處理后提交給下游濾波器。變換濾波器可以進行數據的壓縮解壓、復合分離或者其他處理。

  (3)終端濾波器(Render Filter):對數據進行最后的處理,可以顯示視頻、回放音頻、保存數據或者將數據發(fā)送到網絡等。

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

 

 

3 系統(tǒng)設計

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

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

4 系統(tǒng)實現中的關鍵技術

  (1)視頻捕獲

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

  (2)圖標的實現

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

  圖標文本濾波器放置在解碼濾波器和顯示濾波器之間,輸入數據是RGB或YUV格式的未壓縮圖像,直接修改其中部分數據就可在圖像中顯示圖標或文本,因此采用InPlace模式設計濾波器即可。DirectShow自帶一個InPalce的變換濾波器Sample Grabber Filter。Sample Grabber Filter提供一個ISampleGrabber的接口。ISampleGrabber需要自定義一個ISampleGrabberCB接口,實現其中的BufferCB或SampleCB函數,然后通過ISampleGrabber接口的SetCallback函數選取ISampleGrabberCB接口設置回調函數。SetCallback的調用方法為:HRESULT SetCallback(ISampleGrabberCB*pCallback,long WhichMethodToCallback)。參數WhichMethodToCallback的值設為0時,SampleCB為回調函數;為1時,BufferCB為回調函數。在SampleCB和BufferCB中可以獲取待顯示數據,添加圖標和文本。SampleCB還可以提供顯示數據的額外信息(如數據格式),因此使用SampleCB更加靈活。

  (3)數據接收

  在DirectShow中,數據傳輸有拉(Pull)和推(Push)二種模式。在推模式下,上游濾波器決定數據傳輸,它將數據主動發(fā)送到下游濾波器中;在拉模式下,下游濾波器決定數據傳輸,它在需要數據時向上游濾波器索取,而上游濾波器不主動向下游濾波器發(fā)送數據。

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

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

 ?、俳獯a濾波器向Memfile索取數據。

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

  ③Memfile收到數據則喚醒線程,跳至①。

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

  ⑤解碼濾波器處理數據。

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

5  結束語

  在Windows平臺下,微軟的DirectShow技術是開發(fā)流媒體應用程序的有效方法。本文介紹了DirectShow程序設計的原理,采用DirectShow技術實現了一個視頻廣播系統(tǒng)。測試結果表明,該系統(tǒng)在運行時能夠達到良好效果。

 

參考文獻

1  DirectX Documentation for C++.Microsoft Corporation,2002

2  Regerson D.Inside COM.Microsoft Press,1997

3  廖義奎,王志文,韋衛(wèi)星.基于視頻組播的網絡教學系統(tǒng)研究.廣西科學院學報,2003;19(2)

4  何頂新,周永鵬,萬淑蕓.實時網絡視頻廣播系統(tǒng)的設計與實現.華中科技大學學報,2001;29(3)

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

此內容為AET網站原創(chuàng),未經授權禁止轉載。

相關內容