周恕義 李斌 賀玉虎
摘 要: 針對遠程教學中學生機端同步顯示教師機端教學內容的需求,提出了一種基于Mirror Driver的教師機端屏幕共享解決方案。該方案基于教師機端對DirectDraw非高依賴和Mirror Driver能精確高效捕捉屏幕變化區域的特點,首先對教師機端屏幕高效捕捉;然后將捕捉的變化圖像壓縮成JPEG格式,通過網絡傳輸到學生機端;最后學生機端提取JPEG數據,并轉換成BMP圖像,將多變化區域圖像合成顯示。實驗結果表明,此方案能夠實現高效的屏幕捕捉并同步顯示,具有良好的實時性,可以應用于遠程監控、遠程教學等領域。
關鍵詞: Mirror Driver; 屏幕共享; 圖像合成; JPEG
中圖分類號:TP37 文獻標志碼:A 文章編號:1006-8228(2014)08-04-03
Research and implementation of screen sharing scheme based on Mirror Driver
Zhou Shuyi1, Li Bin2, He Yuhu1
(1. Modern Technological Center in Education, Beijing University of Technology, Beijing 100124, China;
2. Department of Computer Science, Beijing University of Technology)
Abstract: To meet the demand of synchronous display between student-side and teacher-side in distant teaching, a resolution of teacher-side screen sharing technology based on Mirror Driver is introduced. In view of the characteristics of non-high dependence of DirectDraw on the teacher-side and Mirror Driver captures the screen variation region efficiently and precisely, this resolution firstly captures the teacher-side screen effectively. It compress the snapped varying picture to JPEG format and transmit it to the student-side over the network. The student-side extracts the JPEG data, converts them to BMP picture, composites and displays the changing area. The practice shows that this method can capture screen efficiently, and display synchronously. It has a good real-time performance, and may be applied in the domain of remote monitoring and distant teaching.
Key words: Mirror Driver; screen sharing; image synthesis; JPEG
0 引言
屏幕共享是一個很早就有的想法,它最初是在1968年被Engelbart展示出來的[1],但當時的共享主要是通過硬件實現的。后來隨著網絡的發展,逐漸出現了軟件實現的屏幕共享方式。相對于硬件實現方式,軟件實現方式很大程度上降低了成本,同時降低了復雜度。
目前主要有基于Hook和基于Mirror Driver的軟件屏幕共享技術。Hook是Windows提供的一種重要的系統接口,當屏幕重繪消息被系統處理之前,會被Hook捕捉到并處理。基于Hook的方法計算量比較小,速度比較快,占用系統資源較少[1],能較好地平衡CPU占用率和生成文件的大小[2],但無法捕捉控制臺等DOS窗口的變化[1],并且對屏幕變化的跟蹤具有不確定性[2]。Mirror Driver是虛擬設備的顯示驅動,對一個或多個額外的顯示設備進行繪圖映射,并且能夠精確地捕捉屏幕的變化區域。基于Mirror Driver的方法在精確度、準確度、CPU占用率及穩定性等方面均滿足理想要求。由于不支持DirectDraw,會對DirectDraw依賴較高的應用程序產生較大的影響,喪失硬件加速功能[3]。
綜合考慮目前軟件屏幕共享技術的優缺點,本文提出一種基于C/S(客戶機/服務器)體系結構的遠程教師機屏幕共享方案。
1 架構設計
1.1 系統體系結構
C/S軟件體系結構是基于資源不對等,為實現資源共享提出來的[4],并且很多分布式系統都是以此體系結構實現的。該方案以教師機端作為服務器,學生機端作為客戶端,實現學生機端同步顯示教師機屏幕的功能。該方案的系統體系結構如圖1所示。
1.2 系統功能設計
教師機端采用Mirror Driver技術實現屏幕動態變化區域捕捉,為了保證變化圖像的穩定準確傳輸,將捕獲到的圖像壓縮成JPEG(Joint Photographic Experts Group)格式,壓縮后的圖像壓縮率達到95%以上,同時圖像也能保證較高的清晰度。
由于學生機端接收到JPEG圖像后,需要將圖像在指定位置顯示,因此,教師機端需要對傳輸的JPEG圖像加入包頭信息,用于描述圖像的位置、長度、捕捉的順序等信息。
UDP協議不提供可靠通信保證[5],不能保證傳輸的數據能夠到達目的地,是一種面向無連接的通信協議;TCP具備可靠的傳輸特性,能夠保證數據準確有序到達目的地,是一種面向連接[6]的協議。在網絡傳輸過程中丟幀會造成學生機端接收的圖像出現不連續、花屏等現象,因此,為了保證變化圖像能夠準確有序地到達學生機端并顯示,教師機端采用TCP協議傳輸變化圖像。
由多幅JPEG圖像內容合成的圖像中往往存在質量因子或分塊位置不一致[7]等問題。為了保證合成后圖像的一致性和位置的準確性,同時降低圖像合成的復雜性,并提高圖像合成的效率,將學生機端接收到的JPEG圖像轉換成BMP(BitMap)圖像。該方案實現的系統功能如圖2所示。
2 系統實現
2.1 Mirror Driver技術
Mirror Driver由Display Driver與Video Miniport Driver驅動構成。Mirror Driver功能的實現主要依賴Display Driver驅動實現。Display Driver通過Win32 API與內核模式下GDI(Graphics Device Interface)組件交互,并且必須支持GDI調用所需的接口,這些接口是DrvEnableDriver,DrvGetModes,DrvEnablePDEV,DrvCompletePDEV,DrvEnableSurface,DrvDisableSurface,DrvDisablePDEV,DrDisableDriver,DrvAssertMode[3]。
2.2 打包格式
對將要發送的JPEG數據加入包頭信息,其中序列號表示捕獲的變化圖像的順序,保證學生機端以正確順序顯示變化圖像;數據長度表示JPEG圖像實際長度,用于在一次Socket接收的數據中分離出一個變化圖像;起點x和起點y表示捕獲圖像在桌面左上角坐標;終點x和終點y表示捕獲圖像在桌面右下角的坐標。包頭格式如圖3所示。
2.3 學生機端接收緩沖區設置
Windows MFC對底層Socket[9-10]實現進行了面向對象的封裝,使用起來更加方便。本系統使用CSyncSocket類實現網絡中數據的異步傳輸。
當教師機端捕捉變化圖像過多,學生機端沒有足夠緩沖區接收的情況下,就會出現丟幀現象,但是TCP協議會對丟失的幀進行超時重傳,這樣會影響學生機端對服務器端變化圖像的實時顯示。為解決這個問題,學生機端需要將底層Socket的緩沖區設置到盡可能大,使用CSyncSocket類中SetSockOpt函數設置,第一個參數使用SO_RCVBUF(用于指定接收緩沖區的大小)。
學生機端每接收一次數據,都需要在接收的數據中提取出JPEG圖像,并且提取出的JPEG圖像可能有很多個,然后發送消息通知應用程序接收數據,但應用程序不一定能及時處理緩沖區中的消息,如果不能及時處理接收到的數據,會出現丟幀現象,此時TCP不會重傳丟失的幀。丟幀會造成客戶端圖像顯示不連續等問題,為了解決此問題,本系統使用動態分配內存的循環緩沖隊列方法。
當學生機端接收到數據后,需要根據圖3中定義的包格式提取JPEG圖像信息。由于JPEG圖像的數據長度相差過大,若是提前分配空間,會造成空間浪費現象。此時可以分配足夠大的數組空間用于記錄已經分配空間的指針,該方案分配30個數組空間,使用WIN7操作系統,4核CPU,在高負載的情況下最高使用15個堆空間,并運轉正常。使用循環隊列的方式對指向堆空間的指針進行管理,當有數據到來時則分配堆空間,圖像合成顯示后則銷毀指針指向的堆空間。動態分配循環隊列緩沖區如圖4所示。
2.4 JPEG圖像轉換成BMP圖像
為了實現圖像轉換,本系統選用目前廣泛使用的開源庫Libjpeg[11]。Libjpeg庫是一個完全由C語言實現的庫,包含了JPEG解碼、JPEG編碼功能的實現。在這里為了能夠將接收到的JPEG圖像數據轉換成BMP數據,并將轉換后的BMP圖像放入內存,需要對Libjpeg進行如下修改。
在結構體djpeg_dest_ptr中刪除FILE*output_file,添加PBYTE pData和UINT nDataLen,記錄輸出緩沖區的地址和輸出緩沖區的大小。
修改write_bmp_header函數,刪除函數中寫入位圖文件[8]的信息,并將位圖信息寫入內存,添加如下代碼:
memcpy(dest->pub.pData,bmpinfoheader,40);
修改finish_output_bmp函數信息,將轉換后BMP圖像寫入輸出緩存,添加如下代碼:
for (col=dest->row_width; col>0; col--) {
memcpy(pData+i,data_ptr,1);
i++;
data_ptr++;
}
dinfo是jpeg_decompress_struct結構體類型,記錄解壓過程中的所有信息。JPEG圖像轉換成BMP圖像過程如圖5所示。
[初始化dinfo
jpeg_create_decompress()][將接收的jpeg圖像數據寫入緩存
jpeg_mem_src()][讀取JPEG圖像的頭信息,寫入dinfo
jpeg_read_header()][初始化輸出緩沖區
jinit_write_bmp()][JPEG圖像解壓開始
jpeg_start_decompress()] [將解壓數據輸出到虛緩沖區
start_output()][從虛緩沖區讀數據到輸出緩沖區
jpeg_read_scanlines()
put_pixel_rows()][解壓完成
finish_output()][清除剩余資源
jpeg_finish_decompress()
jpeg_destroy_decompress()]
圖5 JPEG圖像轉換成BMP圖像
2.5 BMP圖像的合成顯示
學生機端第一次連接教師機端時,會接收到完整的屏幕圖像。根據圖3中描述的坐標信息,可以知道教師機端屏幕的分辨率,然后根據分辨率建立屏幕顯示緩沖區。根據坐標信息,將轉換后的BMP圖像填充到緩沖區指定位置。BMP圖像存儲時要求每行的字節數是4的整數倍,若不滿足此要求,需要對該行填充字節信息。為了保證圖像正常顯示,在將接收到的圖像數據放到緩沖區指定位置前,去掉填充字節,然后利用Windows提供的GDI庫對桌面顯示緩沖的圖像進行顯示[12]。位圖顯示過程如圖6所示。
3 實驗結果
該方案實現后,教師機端能夠高效捕捉變化區域圖像,學生機端可以及時接收教師機端傳送的變化圖像。在教師機端傳輸變化圖像過多時,學生機端依然能夠對變化圖像合成并正確顯示。學生機端接收的JPEG圖像和轉換后的BMP圖像清晰度對比如圖7、圖8所示。兩個圖像分辨率都是110×108。
該方案以教師機端每分鐘鼠標移動次數為基準,對教師機端和學生機端進行性能測試,測試環境如下。
教師機端:操作系統,WIN7,32位;CPU,雙核,3.0GHZ;內存3G。
學生機端:操作系統,WIN7,64位;CPU,四核,2.66GHZ;內存4G。
測試結果如表1所示。
實驗結果表明,經過JPEG壓縮,然后轉換成BMP圖像后,屏幕圖像能夠保持很好的清晰度,能夠準確顯示遠端教師機屏幕變化;隨著每分鐘鼠標移動次數的增多,教師機端CPU使用率有很小幅度的升高,學生機端CPU使用率基本上沒有變化, 效率較高。
4 結束語
本文旨在提供一種對遠端計算機屏幕變化圖像進行捕捉,通過網絡傳輸到客戶端,并合成顯示的完整解決方案。此方案可以應用于遠程教學,將教師機桌面變化及時呈現到學生機端;可以應用到遠程監控,將多個計算機的屏幕變化圖像統一傳輸到監控客戶端,并統一顯示。實際部署及應用結果表明,采用本方案實現的系統,性能優良,具有良好的應用前景。
參考文獻:
[1] 楊紅生,田地,王豐貴等.基于Hook和輪詢檢測機制的屏幕共享技
術[J].計算機工程與應用,2009.45(5):29-31
[2] 倪曉軍,鄭龍.基于Mirror Driver的自適應屏幕錄制算法[J].計算機工
程,2011.37(11):281-282
[3] 周恕義,陳圣奇,賀玉虎等.基于Mirror Driver的屏幕圖像捕捉技術[J].
計算機工程,2013.39(6):295-303
[4] 張友生,陳松喬.C/S與B/S混合軟件體系結構模型[J].計算機工程
與應用,2002.23:138-140
[5] 趙飛,葉震.UDP協議與TCP協議的對比分析與可靠性改進[J].計算
機技術與發展,2006.16(9):219-221
[6] 張藝瀕,張志斌,趙詠等.TCP與UDP網絡流量對比分析研究[J].計算
機應用究,2010.27(6).
[7] 李晟,張新鵬.利用JPEG壓縮特性的合成圖像檢測[J].應用科學學
報,2008.26(3):281-283
[8] 徐殿武.位圖文件操作的程序設計的研究[J].微計算機信息,
2007.05X:176-178
[9] 張允剛,劉常春,劉偉等.基于Socket和多線程的遠程監控系統[J].控
制工程,2006.13(2):175-177
[10] 于濤,王健.基于Socket通訊技術的上層監控軟件的實現[J].計算機
技術與發展,2009.19(3):243-245
[11] Wang H, You X, Wang R. Design of image capture and
transmission embedded system for remote monitoring[C]//Information Science and Digital Content Technology (ICIDT), 2012 8th International Conference on. IEEE,2012.3:661-664
[12] 葛永慧,郭虎.談談BMP圖像的高效率顯示[J].測繪通報,2009.z1:
53-54