李紅升
(西安鐵路職業(yè)技術學院,710600)
在遠程視頻監(jiān)控中,視頻快速捕捉與存儲技術是決定其性能關鍵點之一,而隨著計算機功能的不斷強大,多媒體技術特別是數字圖像技術的不斷發(fā)展,為只依靠軟件技術快速抓取計算機屏幕的監(jiān)控畫面,并將其轉化成可供傳輸與預覽的視頻流資源,提供了可能。本文將在屏幕DC方法的基礎上,結合內存映射文件技術加快寫屏的思想,提出一種優(yōu)化屏幕信息采集的新方法。并將連續(xù)捕捉到的圖像合成為AVI視頻流,使之能夠預覽播放。
通常獲取屏幕圖像的方法有兩種:創(chuàng)建屏幕DC(Device Context,設備描述表)方法以及DirectX的方法,兩種方法各自具有優(yōu)缺點。屏幕DC方法適應范圍廣泛,但是截圖速率低,DirectX方法截圖速率高,但是需要安裝軟件,為程序開發(fā)和應用帶來不便。
在屏幕DC截圖的基礎上,利用內存映射文件技術MVF(map view of file),可以將磁盤文件映射到虛擬內存的一塊地址空間,在訪問文件時就像訪問內存文件一樣,從而加快了采集速度,較好的解決了屏幕DC截圖速度慢的缺點。優(yōu)化后的屏幕DC截圖法將有更好的應用價值。
DC(Device Context,設備描述表)是一個定義一組圖形對象及其屬性、影響輸出的圖形方式(數據)結構。Windows提供設備描述表,用于應用程序和物理設備之間進行交互,從而提供了應用程序設計的平臺無關性。DC與顯示設備具有一定的對應關系,在 Windows GDI(Graphics Device Interface,圖形設備接口)界面下,總是相關屏幕上的某個顯示區(qū)域,具體程序操作時可以不關心是哪一種具體的設備。
DirectX軟件開發(fā)包是微軟公司提供的一套在Windows操作系統(tǒng)上開發(fā)的高性能圖形、聲音、輸入、輸出和網絡游戲的編程接口。DirectDraw是DirectX中的關于視頻輸入輸出的基本部分,使用DirectDraw可以方便地編制出高效的視頻處理程序。它支持在所有視頻適配器上顯示圖形的標準方法,并且使用加速驅動程序時可以更快更直接地訪問。
WIN32 API提供了一種進行文件操作的高效途徑,即內存映射文件。內存映射文件允許在WIN32進程的虛擬地址空間中保留一段內存區(qū)域,并將物理存儲器中目標文件提交給該區(qū)域,映射到這段虛擬內存之中。我們可以用存取內存數據的方式直接操作文件中的數據,如同這些數據放在內存中一樣,簡化了對文件的訪問操作,還可以實現(xiàn)多個進程共享數據。使用內存映射文件可以大大提高程序的運行效率。
視頻資源采集系統(tǒng)運行在計算機上,首先需要將視頻數據截取下來。本文在截圖設計上是在屏幕DC截圖法的基礎上,結合內存文件映射法優(yōu)化其讀屏與寫屏的速度,在視頻資源播放時,能夠根據視頻的刷新率,設置截圖速率,達到控制PC機處理數據量的效果。
在屏幕DC截圖法中引入了Win32提供的一個新函數CreateDIBSection(),通過它可以創(chuàng)建一個存儲DIB位的內存區(qū)域,既可以執(zhí)行相應的GDI操作,又可以直接通過指向DIB位區(qū)域的指針方位DIB位區(qū)域。避免了圖片資源選入后,轉化為DDB在時間和空間上的開銷,加快了讀屏速度。CreateFileMapping()函數用來創(chuàng)建文件映射內核對象,不分配進程的地址空間,不占用內存空間,因此在實際應用中通常是一次性把整個文件創(chuàng)建為內存映射對象。
MapViewofFile()函數把文件中的數據映射到進程的地址空間中,UnmapViewOfFile()函數解除文件內存映射,系統(tǒng)將內存中的數據回寫到磁盤。最后通過CloseHandle()函數關閉映射文件,釋放內存空間。
在從內存中寫文件時,使用內存文件映射法可以節(jié)省頁面空間和程序啟動的時間,特別是有利于方便應對同一臺計算機上運行的多個進程能夠相互之間共享數據的需求,從而文件資源能被多個進程所共享。
可供人觀賞的視頻流是由許許多多的單幀組成的,根據人眼視覺的暫緩效應,幀在連續(xù)播放時,便形成了連續(xù)的動畫,因此視頻流生成的基礎是對視頻元素的單幀獲取與保存。本文將通過單幀截取的圖像文件合成AVI視頻流,AVI視頻格式是目前最常用到的視頻格式之一,是映射生成文件時可以不經過處理直接讀取的一種資源格式。
在使用文件內存映射將文件數據映射到進程的地址空間中要調用MapViewOfFile()函數,需要指定數據文件的偏移地址以及待映射的長度。其中,文件的偏移地址由DWORD型的參數dwFileOffsetHigh和 dwFileOffsetLow組成的64位值來指定,而且必須是操作系統(tǒng)的分配粒度的整數倍,對于Windows操作系統(tǒng),分配粒度固定為64KB,所以分頁映射時,每頁的起始位置startpos,必須為64KB的整數倍,如圖2所示,一幀數據文件在分頁時一般情況下會被分成n個64KB的小區(qū)塊,如果最后剩余的空間不足64KB的分區(qū)時,系統(tǒng)會自動補齊。

圖1 幀文件分頁映射結構圖Picture 1 The frame file paging mapping diagram
所以在生成基于AVI視頻格式的視頻流時,插入流中的每幀圖像數據需要經過運算比較,以實際截取的數據幀插入視頻流,生成AVI視頻流工作流程。為了插入實際的幀文件,從每幀首地址開始,根據計算出的幀實際大小,按照順序存儲文件訪問的方式設置指示幀文件的尾指針,這樣子就避免了將用于補足部分的空文件插入視頻流中。
本文通過對傳統(tǒng)計算機屏幕截圖方法的比較、分析和優(yōu)化,結合內存映射文件法設計了在技術上實現(xiàn)較為直接、能夠適應各種視頻源文件、速度快捷的視頻資源采集系統(tǒng)技術方案。相對于通常獲取視頻圖像的兩種方法:創(chuàng)建屏幕DC(Device Context,設備描述表)方法以及DirectX的方法,優(yōu)化屏幕DC截圖法在截圖效率上有很大改進,既彌補了屏幕DC較慢的捕捉速度,同時也擁有適用范圍廣的優(yōu)點,對于遠程視頻監(jiān)控的計算機屏幕信息的采集等方面有很大的用途。

圖2 生成AVI視頻流工作流程圖Picture 2 The generated AVI video streaming workflow diagram
[1]Kelly Dempski. DirectX實時渲染技術詳解[M].于忠德,吳紅艷,林鋒 譯.重慶:重慶大學出版社,2006
[2]邱嵐,李翠華.Hook技術在視頻截取中的應用研究與實現(xiàn)[J].廈門大學學報(自然科學版),2003,42(6),710-713.
[3]胡光東,李錦明,馬游春,秦麗.內存映射文件在大容量采編數據處理中的應用[J].電腦編程技巧與維護,2009,16:54-55
[4]楊明元,任景光,劉未學.基于內存映射文件的仿真系統(tǒng)進程間數據[J].電子科技,2010,23(11),33-34.
[5]于慧彬,齊 鵬,梁 捷,楊逍.內存映射文件在大數據量海洋調查數據處理中的應用[J].海洋技術,2010,29(1),33-35.
[6]Gerald Millerson,Jim Owens.視頻制作手冊[M].李志堅譯.北京:人民郵電出版社,2011