高紅霞, 郜 偉
(1.河南工程學(xué)院 計算機(jī)科學(xué)與工程系,河南 鄭州 451191;2.信息工程大學(xué) 理學(xué)院,河南 鄭州 450000)
近年來,多屏顯示在監(jiān)控、指揮、調(diào)度、公安、消防、軍事、氣象等領(lǐng)域獲得了越來越廣泛的應(yīng)用.應(yīng)用時,通常需要將多個屏幕或投影儀拼接成一個大的屏幕,以滿足顯示的需求.在此類系統(tǒng)中,視頻畫面的分割一直是核心問題之一.為達(dá)到優(yōu)良的顯示效果,一般選擇基于硬件的視頻畫面分割器來實現(xiàn)畫面的分割.目前,多屏系統(tǒng)中比較有代表性的是VATION PRO多屏圖像處理器和QIWEI-2003多屏拼接技術(shù),這兩種系統(tǒng)都能提供優(yōu)良的畫面效果,但其昂貴的硬件成本及高端的定位無法滿足大部分普通用戶的需求.對于那些對畫面質(zhì)量要求不是太高的普通用戶,低成本實現(xiàn)大面積的顯示才是其需要的.本文主要研究利用軟件的方法來處理視頻畫面分割,以解決成本問題.
圖1 系統(tǒng)總體流程圖Fig.1 Overall system flow chart
系統(tǒng)的總體設(shè)計如圖1所示.用戶在服務(wù)器界面選擇發(fā)送桌面工作模式或發(fā)送視頻文件工作模式,服務(wù)器根據(jù)局域網(wǎng)內(nèi)連接的客戶端數(shù)目確定分割方案,把桌面或視頻文件畫面劃分為相適應(yīng)的塊數(shù),并根據(jù)用戶的發(fā)送配置以壓縮視頻流的形式為各客戶端發(fā)送適當(dāng)?shù)漠嬅嬉詽M足客戶端上顯示屏空間分布的需求.客戶端接收服務(wù)器發(fā)來的視頻流信息后,通過譯碼解壓重建畫面并向服務(wù)器端發(fā)送主機(jī)IP等有關(guān)信息.
從系統(tǒng)流程可以看出服務(wù)器端應(yīng)實現(xiàn)如下功能:
(1)服務(wù)器端以視頻流的形式發(fā)送本機(jī)桌面到客戶端,并根據(jù)鏈接的客戶端數(shù)目智能選擇劃分塊數(shù);
(2)服務(wù)器端以視頻流的形式為客戶端播放視頻文件,并根據(jù)鏈接的客戶端數(shù)目智能選擇劃分塊數(shù);
(3)服務(wù)器端為客戶端選擇所顯示的內(nèi)容以滿足客戶端顯示屏空間分布的需求.
總的來說,服務(wù)器端主要完成桌面及視頻文件的捕獲、視頻的分割、視頻發(fā)送、視頻壓縮等功能,其功能模塊也就相應(yīng)地分為桌面捕獲處理模塊、視頻文件捕獲處理模塊、視頻分割處理模塊和視頻發(fā)送處理模塊[1].
①桌面捕獲處理模塊
該模塊利用DirectShow提供的PushSource Desktop濾波器捕獲實時的桌面畫面,輸出一個未壓縮的Video信號.
②視頻文件捕獲處理模塊
該模塊利用DirectShow提供的File Source濾波器捕獲視頻文件,輸出一個已編碼的Stream信號.
③視頻分割處理模塊
該模塊接收未壓縮的視頻流信號,根據(jù)連接的客戶端數(shù)目對流信號進(jìn)行分割,輸出相應(yīng)個數(shù)的未壓縮流信號.
④視頻發(fā)送處理模塊
該模塊把分割后的流信號進(jìn)行壓縮后再發(fā)送到相應(yīng)客戶端.這里,服務(wù)器端可以設(shè)置分割后視頻流信號的流向.
本文采用DirectShow編程技術(shù),盡可能使用其本身提供的濾波器(Filter).要實現(xiàn)服務(wù)器功能,只需自行開發(fā)一個能接收上游濾波器傳來的視頻流信息并根據(jù)分割方案把視頻畫面劃分為相應(yīng)塊數(shù)、之后把分割處理后的視頻流信息提供給Filter Graph中下游濾波器進(jìn)行下一步處理的Transform Filter.
由服務(wù)器功能可知,F(xiàn)ilter Graph的構(gòu)建并不是固定的,在不同的工作模式和分割方案下有不一樣的Filter Graph.下面以發(fā)送視頻文件模式下劃分2個畫面為例說明Filter Graph的構(gòu)建,如圖2所示.
圖2 發(fā)送視頻文件并劃分兩畫面的Filter GraphFig.2 Send video and divide into two screen Filter Graph
圖2中,A部分的構(gòu)建取決于選擇何種工作模式,在選擇發(fā)送視頻文件的情況下,服務(wù)器將選取上圖的3個Filter.File Source完成視頻文件的捕獲工作;Splitter把接收的視頻信息分離為視頻流和音頻流,在這里我們只需要視頻流;Ffdshow Video Decoder解碼所接收的視頻流.這3個Filter都是 DirectShow本身所提供的,它們共同構(gòu)成了服務(wù)器的視頻捕獲處理模塊.圖2中,VidoeCut Fliter根據(jù)分割方案把接收的視頻流進(jìn)行畫面劃分,分塊后的視頻流通過相應(yīng)接口傳往下游Filter.這個Filter需要自行開發(fā),DirectShow本身并沒有滿足需要的Filter,VidoeCut Filter單獨(dú)構(gòu)成了服務(wù)器的視頻分割處理模塊.圖2中,B部分為服務(wù)器的發(fā)送處理模塊,其構(gòu)建由分割方案所決定,采用動態(tài)加入Filter的形式,分割為幾塊就為幾個VidoeCut Filter的輸出接口.創(chuàng)建下游Filter鏈路,把分割后的視頻流進(jìn)行壓縮并發(fā)送.其中,A部分在發(fā)送桌面工作的模式下時,F(xiàn)ilter組成如圖3所示.
圖3 桌面捕獲處理模塊Fig.3 Desktop capture processing module
由圖3可知,桌面捕獲處理模塊也由一個Filter構(gòu)成,其捕獲的視頻流未經(jīng)編碼和壓縮可直接傳往視頻分割處理模塊.
服務(wù)器端設(shè)計為發(fā)送桌面和發(fā)送視頻文件兩種工作模式,一方面是考慮到盡可能使用DirectShow本身提供的Filter,降低開發(fā)難度;另一方面也考慮到了發(fā)送桌面和發(fā)送視頻文件時捕獲幀率的要求不一樣,分開處理能減輕網(wǎng)絡(luò)通信的負(fù)載.
在服務(wù)器端中使用DirectShow提供的Filter完成一些底層相關(guān)內(nèi)容的操作,大大降低了系統(tǒng)開發(fā)的難度.我們只需知道每個Filter的輸入和輸出,而無需了解它是如何實現(xiàn)的.在服務(wù)器端主要實現(xiàn)了視頻分割Filter(VideoCut Filter).
圖4 VideoCut Filter基本框架Fig.4 VideoCut Filter basic framework
本視頻分割Filter(VideoCut Filter)負(fù)責(zé)從上方的Filter接收視頻流數(shù)據(jù),按照分割方案處理后,發(fā)送到下游視頻發(fā)送處理模塊,屬于Transform Filter類型.
本文設(shè)計Filter的最大分割塊數(shù)為4塊,對每一塊提供預(yù)覽接口,VideoCut Filter的基本框架見圖4.
2.1.1 Filter及其Pin口的基類選型
視頻分割VideoCut Filter選擇CTransformFilter作為VideoCut Filter的基類.因為,VideoCut Filter Crossbar Filter實現(xiàn)的是單輸入、多輸出的Filter,需要將輸入sample寫入到新的輸出buffer中,這種情況一般選CTransformFilter作為基類.
當(dāng)Filter的基類選定了之后,Pin的基類也就相應(yīng)選定了.VideoCut Filter輸出Pin的實現(xiàn),需要實現(xiàn)基類所有的純虛函數(shù),除了CheckMediaTyp進(jìn)行媒體類型檢查外,還有GetMediaTyp提供支持的媒體類型,DecideBufferSize決定Sample使用內(nèi)存的大小,F(xiàn)illBuffer為即將傳送出去的Sample填充數(shù)據(jù).
2.1.2 分割原理
在DirectShow提供的CTransformFilter類中,上游Filter傳來的視頻流媒體結(jié)構(gòu)中有一個bmiHeader數(shù)據(jù)成員,這個成員是BITMAPINFOHEADER結(jié)構(gòu)[2],這個結(jié)構(gòu)的定義如下:
Typedef struct tagBITMAPNFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biplanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
}BITMAPNFOHEADER;
這個結(jié)構(gòu)有兩個結(jié)構(gòu)成員,biWidth 和biHeighto.
視頻流媒體結(jié)構(gòu)中還有一個rcSource數(shù)據(jù)成員,同時也有一個rcTarget成員,這里我們假設(shè)有兩個Filter A和B,假如這兩個Filter與視頻流媒體數(shù)據(jù)類型相連,A在左邊,是上游的filter ,B在右邊,是下游的Filter.在這兩個Filter間傳遞的buffer具有一定的尺寸,可以用bmiFleader.biWidth,bmiFleader.biFleight來標(biāo)記.
Filter A接收到輸入視頻流后,將該輸入視頻的一部分?jǐn)U展填充到buffer里面的rcTarget區(qū)域中,填充的部分的大小根據(jù)rcSource和輸出數(shù)據(jù)媒體類型的大小而定,也就是rcSource和biWidth, biHeight比較.如果rcSource為空,F(xiàn)ilter A就會將全部的輸入pin拷貝到rcTarget;如果rcTarget為空,那么Filter A就會將視頻填充到整個的輸出buffer中.
例如:假定Filter A接收的視頻圖像為160*120單位為像素,假定A和B連接的時候采用如下的數(shù)據(jù)類型:
(biWidth, biHeight): 320,240
RcSource:(0, 0, 0, 0)
RcTarget:(0, 0, 0, 0)
這就意味著Filter A就會將它接收到的視頻數(shù)據(jù)x方向和Y方向乘以2以后填充到320*240的輸出bufer中.
本文設(shè)置的視頻圖像分辨率為1 280*800像素.對stream00~stream11,相應(yīng)的構(gòu)造RcSource00~ RcSource11,在不同分割方案下“RcSource”的值也不一樣.分成4塊時,媒體類型設(shè)置如下:
Stream00:
(biWidth, biHeight): 1280,800
rcSource00:(0, 0, 640,400)
rcTarget00:(0,0, 0,0)
即Stream00輸出的視頻圖像為原視頻圖像的左上角1/4圖像擴(kuò)展為1 280*800像素分辨率后的圖像.
Stream01:
(biWidth, biHeight): 1280,800
rcSource01:(640, 0, 1280,400)
rcTarget01:(0,0, 0,0)
同樣的,Stream01輸出的視頻圖像為原視頻圖像的右上角.
Stream10:
(biWidth, biHeight): 1280,800
rcSource10:(0,40 0, 640,400)
rcTarget10:(0,0, 0,0)
Stream10輸出的視頻圖像為原視頻圖像的左下角.
Stream11:
(biWidth, biHeight): 1280,800
rcSource11:(640,400, 1280,800)
rcTarget11:(0,0, 0,0)
Stream11輸出的視頻圖像為原視頻圖像的右下角,分塊情況如圖5所示.
圖5 分塊示意圖Fig.5 Block diagram
圖6 視頻分割Filter工作流程Fig.6 Video segmentation Filter workflow
2.1.3 工作流程
視頻分割Filter的工作流程如圖6所示.
在開發(fā)Filter時重寫了GetMediaTyp虛函數(shù),根據(jù)分割方案為每個rcSource和rcTarget指定不同的媒體類型,以實現(xiàn)畫面分割效果.
2.1.4 服務(wù)器端內(nèi)容的智能劃分
服務(wù)器端根據(jù)實際成功連接客戶端的數(shù)目,自動將服務(wù)器端的顯示內(nèi)容劃分為客戶端個數(shù)的塊數(shù),顯示內(nèi)容的排列方式需要根據(jù)實際的要求進(jìn)行手工調(diào)節(jié),具體劃分過程如圖7所示.
圖7 服務(wù)器端內(nèi)容智能劃分過程Fig.7 Server-side content divide into the process of intelligence
(1)桌面捕獲模塊利用DirectShow提供的PushSource Desktop濾波器來捕獲即時的桌面畫面[3].PushSource Desktop濾波器的基本構(gòu)架如圖 8所示.
PushSource Desktop濾波器捕獲桌面畫面后輸出媒體格式為:
Major Type:Video
Sub Type:RGB32
Format:RGB 1280*800,32bit
圖8 PushSource Desktop 濾波器Fig.8 PushSource Desktop filter
rcSrc=(0,0,0,0)
rcDst=(0,0,0,0)
PushSource Desktop濾波器中捕獲的幀率有如下幾種
// UNITS = 10 ^ 7
// UNITS / 30 = 30 fps;
// UNITS / 20 = 20 fps, etc
const REFERENCE_TIME FPS_30 = UNITS / 30;
……
……
const REFERENCE_TIME FPS_1 = UNITS / 1;
本文設(shè)置為FPS_5,即幀率為5 fps.
(2)視頻文件的捕獲部分主要利用DirectShow提供的File Source濾波器捕獲視頻文件.File Source濾波器基本構(gòu)架如圖9所示.
圖9 File Source濾波器Fig.9 File Source filter
File Source濾波器提供了一個輸出接口和一個預(yù)覽接口,輸出的媒體格式與源文件有關(guān),例如源文件為AVI格式,則輸出媒體格式為:
Major Type: Stream - Video
Sub Type: Avi
GUID_NULL
利用預(yù)覽接口我們可以看到捕獲的效果.
一個好用的程序應(yīng)當(dāng)有友好的界面,服務(wù)器端界面的設(shè)計如圖10所示.界面左邊顯示了當(dāng)前連接的客戶端數(shù)目、本機(jī)IP、桌面捕獲的預(yù)覽屏幕和發(fā)送控制;右邊顯示了分塊預(yù)覽屏幕,各屏幕下的組合框用于選擇本塊發(fā)送的方向.服務(wù)器默認(rèn)選擇為發(fā)送桌面,當(dāng)有客戶端連接時,系統(tǒng)根據(jù)連接數(shù)自動選擇分塊方案(最多分為4塊),單擊開始發(fā)送之后,左側(cè)預(yù)覽屏幕出現(xiàn)本機(jī)桌面圖像,右側(cè)預(yù)覽屏幕出現(xiàn)桌面分塊后的圖像,在組合框中選擇本塊發(fā)往的主機(jī)IP.點(diǎn)擊發(fā)送視頻選擇框,再單擊開始發(fā)送,則首先彈出文件瀏覽對話框,之后的控制與發(fā)送桌面一樣,此時預(yù)覽屏幕顯示視頻文件畫面.
圖10 桌面捕獲Fig.10 Desktop capture
隨著多媒體技術(shù)的飛速發(fā)展,視頻技術(shù)已在越來越多的領(lǐng)域中得到了廣泛應(yīng)用.本文主要研究采用DirectShow系統(tǒng)來實現(xiàn)多屏軟拼接系統(tǒng)服務(wù)器端的桌面捕獲、視頻文件捕獲和視頻分割.隨著技術(shù)的不斷發(fā)展,視頻分割的準(zhǔn)確率將會越來越高,拼接效果也會越來越好,人為交互將會減少,而運(yùn)算的成本會越來越低.
參考文獻(xiàn):
[1] 陸其明.DirectShow實務(wù)精選[M].北京:科海電子出版社,2004:45-49.
[2] 許宏竹.基于DirectShow的流媒體的應(yīng)用和研究[M].北京:北京郵電大學(xué)出版社,2007:63-73.
[3] 邱換春.基于嵌入式Linux和DirectShow的網(wǎng)絡(luò)攝像機(jī)軟件設(shè)計[M].合肥:合肥工業(yè)大學(xué)出版社,2009:36-58.