周恕義 李斌 賀玉虎
摘 要: 針對(duì)遠(yuǎn)程教學(xué)中學(xué)生機(jī)端同步顯示教師機(jī)端教學(xué)內(nèi)容的需求,提出了一種基于Mirror Driver的教師機(jī)端屏幕共享解決方案。該方案基于教師機(jī)端對(duì)DirectDraw非高依賴和Mirror Driver能精確高效捕捉屏幕變化區(qū)域的特點(diǎn),首先對(duì)教師機(jī)端屏幕高效捕捉;然后將捕捉的變化圖像壓縮成JPEG格式,通過(guò)網(wǎng)絡(luò)傳輸?shù)綄W(xué)生機(jī)端;最后學(xué)生機(jī)端提取JPEG數(shù)據(jù),并轉(zhuǎn)換成BMP圖像,將多變化區(qū)域圖像合成顯示。實(shí)驗(yàn)結(jié)果表明,此方案能夠?qū)崿F(xiàn)高效的屏幕捕捉并同步顯示,具有良好的實(shí)時(shí)性,可以應(yīng)用于遠(yuǎn)程監(jiān)控、遠(yuǎn)程教學(xué)等領(lǐng)域。
關(guān)鍵詞: Mirror Driver; 屏幕共享; 圖像合成; JPEG
中圖分類(lèi)號(hào):TP37 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):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 引言
屏幕共享是一個(gè)很早就有的想法,它最初是在1968年被Engelbart展示出來(lái)的[1],但當(dāng)時(shí)的共享主要是通過(guò)硬件實(shí)現(xiàn)的。后來(lái)隨著網(wǎng)絡(luò)的發(fā)展,逐漸出現(xiàn)了軟件實(shí)現(xiàn)的屏幕共享方式。相對(duì)于硬件實(shí)現(xiàn)方式,軟件實(shí)現(xiàn)方式很大程度上降低了成本,同時(shí)降低了復(fù)雜度。
目前主要有基于Hook和基于Mirror Driver的軟件屏幕共享技術(shù)。Hook是Windows提供的一種重要的系統(tǒng)接口,當(dāng)屏幕重繪消息被系統(tǒng)處理之前,會(huì)被Hook捕捉到并處理?;贖ook的方法計(jì)算量比較小,速度比較快,占用系統(tǒng)資源較少[1],能較好地平衡CPU占用率和生成文件的大小[2],但無(wú)法捕捉控制臺(tái)等DOS窗口的變化[1],并且對(duì)屏幕變化的跟蹤具有不確定性[2]。Mirror Driver是虛擬設(shè)備的顯示驅(qū)動(dòng),對(duì)一個(gè)或多個(gè)額外的顯示設(shè)備進(jìn)行繪圖映射,并且能夠精確地捕捉屏幕的變化區(qū)域?;贛irror Driver的方法在精確度、準(zhǔn)確度、CPU占用率及穩(wěn)定性等方面均滿足理想要求。由于不支持DirectDraw,會(huì)對(duì)DirectDraw依賴較高的應(yīng)用程序產(chǎn)生較大的影響,喪失硬件加速功能[3]。
綜合考慮目前軟件屏幕共享技術(shù)的優(yōu)缺點(diǎn),本文提出一種基于C/S(客戶機(jī)/服務(wù)器)體系結(jié)構(gòu)的遠(yuǎn)程教師機(jī)屏幕共享方案。
1 架構(gòu)設(shè)計(jì)
1.1 系統(tǒng)體系結(jié)構(gòu)
C/S軟件體系結(jié)構(gòu)是基于資源不對(duì)等,為實(shí)現(xiàn)資源共享提出來(lái)的[4],并且很多分布式系統(tǒng)都是以此體系結(jié)構(gòu)實(shí)現(xiàn)的。該方案以教師機(jī)端作為服務(wù)器,學(xué)生機(jī)端作為客戶端,實(shí)現(xiàn)學(xué)生機(jī)端同步顯示教師機(jī)屏幕的功能。該方案的系統(tǒng)體系結(jié)構(gòu)如圖1所示。
1.2 系統(tǒng)功能設(shè)計(jì)
教師機(jī)端采用Mirror Driver技術(shù)實(shí)現(xiàn)屏幕動(dòng)態(tài)變化區(qū)域捕捉,為了保證變化圖像的穩(wěn)定準(zhǔn)確傳輸,將捕獲到的圖像壓縮成JPEG(Joint Photographic Experts Group)格式,壓縮后的圖像壓縮率達(dá)到95%以上,同時(shí)圖像也能保證較高的清晰度。
由于學(xué)生機(jī)端接收到JPEG圖像后,需要將圖像在指定位置顯示,因此,教師機(jī)端需要對(duì)傳輸?shù)腏PEG圖像加入包頭信息,用于描述圖像的位置、長(zhǎng)度、捕捉的順序等信息。
UDP協(xié)議不提供可靠通信保證[5],不能保證傳輸?shù)臄?shù)據(jù)能夠到達(dá)目的地,是一種面向無(wú)連接的通信協(xié)議;TCP具備可靠的傳輸特性,能夠保證數(shù)據(jù)準(zhǔn)確有序到達(dá)目的地,是一種面向連接[6]的協(xié)議。在網(wǎng)絡(luò)傳輸過(guò)程中丟幀會(huì)造成學(xué)生機(jī)端接收的圖像出現(xiàn)不連續(xù)、花屏等現(xiàn)象,因此,為了保證變化圖像能夠準(zhǔn)確有序地到達(dá)學(xué)生機(jī)端并顯示,教師機(jī)端采用TCP協(xié)議傳輸變化圖像。
由多幅JPEG圖像內(nèi)容合成的圖像中往往存在質(zhì)量因子或分塊位置不一致[7]等問(wèn)題。為了保證合成后圖像的一致性和位置的準(zhǔn)確性,同時(shí)降低圖像合成的復(fù)雜性,并提高圖像合成的效率,將學(xué)生機(jī)端接收到的JPEG圖像轉(zhuǎn)換成BMP(BitMap)圖像。該方案實(shí)現(xiàn)的系統(tǒng)功能如圖2所示。
2 系統(tǒng)實(shí)現(xiàn)
2.1 Mirror Driver技術(shù)
Mirror Driver由Display Driver與Video Miniport Driver驅(qū)動(dòng)構(gòu)成。Mirror Driver功能的實(shí)現(xiàn)主要依賴Display Driver驅(qū)動(dòng)實(shí)現(xiàn)。Display Driver通過(guò)Win32 API與內(nèi)核模式下GDI(Graphics Device Interface)組件交互,并且必須支持GDI調(diào)用所需的接口,這些接口是DrvEnableDriver,DrvGetModes,DrvEnablePDEV,DrvCompletePDEV,DrvEnableSurface,DrvDisableSurface,DrvDisablePDEV,DrDisableDriver,DrvAssertMode[3]。
2.2 打包格式
對(duì)將要發(fā)送的JPEG數(shù)據(jù)加入包頭信息,其中序列號(hào)表示捕獲的變化圖像的順序,保證學(xué)生機(jī)端以正確順序顯示變化圖像;數(shù)據(jù)長(zhǎng)度表示JPEG圖像實(shí)際長(zhǎng)度,用于在一次Socket接收的數(shù)據(jù)中分離出一個(gè)變化圖像;起點(diǎn)x和起點(diǎn)y表示捕獲圖像在桌面左上角坐標(biāo);終點(diǎn)x和終點(diǎn)y表示捕獲圖像在桌面右下角的坐標(biāo)。包頭格式如圖3所示。
2.3 學(xué)生機(jī)端接收緩沖區(qū)設(shè)置
Windows MFC對(duì)底層Socket[9-10]實(shí)現(xiàn)進(jìn)行了面向?qū)ο蟮姆庋b,使用起來(lái)更加方便。本系統(tǒng)使用CSyncSocket類(lèi)實(shí)現(xiàn)網(wǎng)絡(luò)中數(shù)據(jù)的異步傳輸。
當(dāng)教師機(jī)端捕捉變化圖像過(guò)多,學(xué)生機(jī)端沒(méi)有足夠緩沖區(qū)接收的情況下,就會(huì)出現(xiàn)丟幀現(xiàn)象,但是TCP協(xié)議會(huì)對(duì)丟失的幀進(jìn)行超時(shí)重傳,這樣會(huì)影響學(xué)生機(jī)端對(duì)服務(wù)器端變化圖像的實(shí)時(shí)顯示。為解決這個(gè)問(wèn)題,學(xué)生機(jī)端需要將底層Socket的緩沖區(qū)設(shè)置到盡可能大,使用CSyncSocket類(lèi)中SetSockOpt函數(shù)設(shè)置,第一個(gè)參數(shù)使用SO_RCVBUF(用于指定接收緩沖區(qū)的大小)。
學(xué)生機(jī)端每接收一次數(shù)據(jù),都需要在接收的數(shù)據(jù)中提取出JPEG圖像,并且提取出的JPEG圖像可能有很多個(gè),然后發(fā)送消息通知應(yīng)用程序接收數(shù)據(jù),但應(yīng)用程序不一定能及時(shí)處理緩沖區(qū)中的消息,如果不能及時(shí)處理接收到的數(shù)據(jù),會(huì)出現(xiàn)丟幀現(xiàn)象,此時(shí)TCP不會(huì)重傳丟失的幀。丟幀會(huì)造成客戶端圖像顯示不連續(xù)等問(wèn)題,為了解決此問(wèn)題,本系統(tǒng)使用動(dòng)態(tài)分配內(nèi)存的循環(huán)緩沖隊(duì)列方法。
當(dāng)學(xué)生機(jī)端接收到數(shù)據(jù)后,需要根據(jù)圖3中定義的包格式提取JPEG圖像信息。由于JPEG圖像的數(shù)據(jù)長(zhǎng)度相差過(guò)大,若是提前分配空間,會(huì)造成空間浪費(fèi)現(xiàn)象。此時(shí)可以分配足夠大的數(shù)組空間用于記錄已經(jīng)分配空間的指針,該方案分配30個(gè)數(shù)組空間,使用WIN7操作系統(tǒng),4核CPU,在高負(fù)載的情況下最高使用15個(gè)堆空間,并運(yùn)轉(zhuǎn)正常。使用循環(huán)隊(duì)列的方式對(duì)指向堆空間的指針進(jìn)行管理,當(dāng)有數(shù)據(jù)到來(lái)時(shí)則分配堆空間,圖像合成顯示后則銷(xiāo)毀指針指向的堆空間。動(dòng)態(tài)分配循環(huán)隊(duì)列緩沖區(qū)如圖4所示。
2.4 JPEG圖像轉(zhuǎn)換成BMP圖像
為了實(shí)現(xiàn)圖像轉(zhuǎn)換,本系統(tǒng)選用目前廣泛使用的開(kāi)源庫(kù)Libjpeg[11]。Libjpeg庫(kù)是一個(gè)完全由C語(yǔ)言實(shí)現(xiàn)的庫(kù),包含了JPEG解碼、JPEG編碼功能的實(shí)現(xiàn)。在這里為了能夠?qū)⒔邮盏降腏PEG圖像數(shù)據(jù)轉(zhuǎn)換成BMP數(shù)據(jù),并將轉(zhuǎn)換后的BMP圖像放入內(nèi)存,需要對(duì)Libjpeg進(jìn)行如下修改。
在結(jié)構(gòu)體djpeg_dest_ptr中刪除FILE*output_file,添加PBYTE pData和UINT nDataLen,記錄輸出緩沖區(qū)的地址和輸出緩沖區(qū)的大小。
修改write_bmp_header函數(shù),刪除函數(shù)中寫(xiě)入位圖文件[8]的信息,并將位圖信息寫(xiě)入內(nèi)存,添加如下代碼:
memcpy(dest->pub.pData,bmpinfoheader,40);
修改finish_output_bmp函數(shù)信息,將轉(zhuǎn)換后BMP圖像寫(xiě)入輸出緩存,添加如下代碼:
for (col=dest->row_width; col>0; col--) {
memcpy(pData+i,data_ptr,1);
i++;
data_ptr++;
}
dinfo是jpeg_decompress_struct結(jié)構(gòu)體類(lèi)型,記錄解壓過(guò)程中的所有信息。JPEG圖像轉(zhuǎn)換成BMP圖像過(guò)程如圖5所示。
[初始化dinfo
jpeg_create_decompress()][將接收的jpeg圖像數(shù)據(jù)寫(xiě)入緩存
jpeg_mem_src()][讀取JPEG圖像的頭信息,寫(xiě)入dinfo
jpeg_read_header()][初始化輸出緩沖區(qū)
jinit_write_bmp()][JPEG圖像解壓開(kāi)始
jpeg_start_decompress()] [將解壓數(shù)據(jù)輸出到虛緩沖區(qū)
start_output()][從虛緩沖區(qū)讀數(shù)據(jù)到輸出緩沖區(qū)
jpeg_read_scanlines()
put_pixel_rows()][解壓完成
finish_output()][清除剩余資源
jpeg_finish_decompress()
jpeg_destroy_decompress()]
圖5 JPEG圖像轉(zhuǎn)換成BMP圖像
2.5 BMP圖像的合成顯示
學(xué)生機(jī)端第一次連接教師機(jī)端時(shí),會(huì)接收到完整的屏幕圖像。根據(jù)圖3中描述的坐標(biāo)信息,可以知道教師機(jī)端屏幕的分辨率,然后根據(jù)分辨率建立屏幕顯示緩沖區(qū)。根據(jù)坐標(biāo)信息,將轉(zhuǎn)換后的BMP圖像填充到緩沖區(qū)指定位置。BMP圖像存儲(chǔ)時(shí)要求每行的字節(jié)數(shù)是4的整數(shù)倍,若不滿足此要求,需要對(duì)該行填充字節(jié)信息。為了保證圖像正常顯示,在將接收到的圖像數(shù)據(jù)放到緩沖區(qū)指定位置前,去掉填充字節(jié),然后利用Windows提供的GDI庫(kù)對(duì)桌面顯示緩沖的圖像進(jìn)行顯示[12]。位圖顯示過(guò)程如圖6所示。
3 實(shí)驗(yàn)結(jié)果
該方案實(shí)現(xiàn)后,教師機(jī)端能夠高效捕捉變化區(qū)域圖像,學(xué)生機(jī)端可以及時(shí)接收教師機(jī)端傳送的變化圖像。在教師機(jī)端傳輸變化圖像過(guò)多時(shí),學(xué)生機(jī)端依然能夠?qū)ψ兓瘓D像合成并正確顯示。學(xué)生機(jī)端接收的JPEG圖像和轉(zhuǎn)換后的BMP圖像清晰度對(duì)比如圖7、圖8所示。兩個(gè)圖像分辨率都是110×108。
該方案以教師機(jī)端每分鐘鼠標(biāo)移動(dòng)次數(shù)為基準(zhǔn),對(duì)教師機(jī)端和學(xué)生機(jī)端進(jìn)行性能測(cè)試,測(cè)試環(huán)境如下。
教師機(jī)端:操作系統(tǒng),WIN7,32位;CPU,雙核,3.0GHZ;內(nèi)存3G。
學(xué)生機(jī)端:操作系統(tǒng),WIN7,64位;CPU,四核,2.66GHZ;內(nèi)存4G。
測(cè)試結(jié)果如表1所示。
實(shí)驗(yàn)結(jié)果表明,經(jīng)過(guò)JPEG壓縮,然后轉(zhuǎn)換成BMP圖像后,屏幕圖像能夠保持很好的清晰度,能夠準(zhǔn)確顯示遠(yuǎn)端教師機(jī)屏幕變化;隨著每分鐘鼠標(biāo)移動(dòng)次數(shù)的增多,教師機(jī)端CPU使用率有很小幅度的升高,學(xué)生機(jī)端CPU使用率基本上沒(méi)有變化, 效率較高。
4 結(jié)束語(yǔ)
本文旨在提供一種對(duì)遠(yuǎn)端計(jì)算機(jī)屏幕變化圖像進(jìn)行捕捉,通過(guò)網(wǎng)絡(luò)傳輸?shù)娇蛻舳?,并合成顯示的完整解決方案。此方案可以應(yīng)用于遠(yuǎn)程教學(xué),將教師機(jī)桌面變化及時(shí)呈現(xiàn)到學(xué)生機(jī)端;可以應(yīng)用到遠(yuǎn)程監(jiān)控,將多個(gè)計(jì)算機(jī)的屏幕變化圖像統(tǒng)一傳輸?shù)奖O(jiān)控客戶端,并統(tǒng)一顯示。實(shí)際部署及應(yīng)用結(jié)果表明,采用本方案實(shí)現(xiàn)的系統(tǒng),性能優(yōu)良,具有良好的應(yīng)用前景。
參考文獻(xiàn):
[1] 楊紅生,田地,王豐貴等.基于Hook和輪詢檢測(cè)機(jī)制的屏幕共享技
術(shù)[J].計(jì)算機(jī)工程與應(yīng)用,2009.45(5):29-31
[2] 倪曉軍,鄭龍.基于Mirror Driver的自適應(yīng)屏幕錄制算法[J].計(jì)算機(jī)工
程,2011.37(11):281-282
[3] 周恕義,陳圣奇,賀玉虎等.基于Mirror Driver的屏幕圖像捕捉技術(shù)[J].
計(jì)算機(jī)工程,2013.39(6):295-303
[4] 張友生,陳松喬.C/S與B/S混合軟件體系結(jié)構(gòu)模型[J].計(jì)算機(jī)工程
與應(yīng)用,2002.23:138-140
[5] 趙飛,葉震.UDP協(xié)議與TCP協(xié)議的對(duì)比分析與可靠性改進(jìn)[J].計(jì)算
機(jī)技術(shù)與發(fā)展,2006.16(9):219-221
[6] 張藝瀕,張志斌,趙詠等.TCP與UDP網(wǎng)絡(luò)流量對(duì)比分析研究[J].計(jì)算
機(jī)應(yīng)用究,2010.27(6).
[7] 李晟,張新鵬.利用JPEG壓縮特性的合成圖像檢測(cè)[J].應(yīng)用科學(xué)學(xué)
報(bào),2008.26(3):281-283
[8] 徐殿武.位圖文件操作的程序設(shè)計(jì)的研究[J].微計(jì)算機(jī)信息,
2007.05X:176-178
[9] 張?jiān)蕜偅瑒⒊4?,劉偉?基于Socket和多線程的遠(yuǎn)程監(jiān)控系統(tǒng)[J].控
制工程,2006.13(2):175-177
[10] 于濤,王健.基于Socket通訊技術(shù)的上層監(jiān)控軟件的實(shí)現(xiàn)[J].計(jì)算機(jī)
技術(shù)與發(fā)展,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] 葛永慧,郭虎.談?wù)凚MP圖像的高效率顯示[J].測(cè)繪通報(bào),2009.z1:
53-54