導讀:
高效螢幕錄製
螢幕錄製有著廣泛的用途,主要用於建立示範培訓,或者遠程螢幕監視和廣播。由於螢幕的大小和色深通常很高,而且具有大塊背景色、視窗拖動/捲動造成的內容移動和菜單彈出造成的瞬時變化等特性,因此需要在資料擷取、壓縮和傳輸/儲存上多加考慮。
錄製之前
錄製之前,應該選擇錄製方法,壓縮方式和錄製範圍。
有必要儘可能縮小錄製的地區以減少資料量。在錄製開始之前,可以讓使用者指定錄製的範圍,例如全螢幕,指定視窗,指定/自適應座標等等。小的錄製地區意味著更少的未經處理資料。
儘可能降低錄製的色深以減少資料量。通常,用於簡單教學的錄製只需要256色。
錄製之前,應該停用螢幕保護裝置,桌布和活動案頭的一些特性以避免不必要的錄製。
錄製方法
錄製分兩種方式,一種是推模式,也就是錄製模組不斷錄製資料,一種是拉模式,錄製模組在需要的時候才錄製資料。對於低頻寬的場合,拉模式可以有效減少未經處理資料量。對於需要基本無損回放的場合,推模式在監測到螢幕變化時就錄製資料,可以減少視頻品質的損失。在推模式下需要選取錄製的時機,以避免大量的重複資料。
壓縮編碼
適當的編碼方式可以有效地減少錄製時的資源佔用。
JPEG 格式(Joint Photographic Experts Group,JPEG)編碼
在有損壓縮時,對於靜態映像具有比較好的壓縮比率。但是有損壓縮可能會使得螢幕上的文字變得模糊。
運動映像專家(MPEG)組編碼
適合運動的映像,但是劇烈變化的映像,例如菜單的彈出,可能會暫時使錄製的視頻品質降低,以及CPU資源佔用的升高。
遠程幀緩衝(Remote Frame Buffer,RFB)編碼
包括對於視窗拖動/捲動造成的內容移動造成的矩形複製(copy rectangle)和背景色的最佳化。對於每個矩形,可以有各種不同的編碼方式,例如MPEG或者JPEG。
分塊比較編碼
將每次錄製的螢幕分塊和上次錄製的螢幕內容比較,如果某塊抽樣變化了,那麼編碼整個塊。對於每個塊,可以有各種不同的編碼方式,例如MPEG或者JPEG。
根據錄製內容的不同,以及編碼設定的不同(例如品質和分塊大小設定),以上編碼方式可能各有所長。
額外的考慮
掃描線
隔行掃描而不是漸進式掃描螢幕資料可以有效地減少錄製的資料量,同時錄製的視頻品質降低不大。
錄製時機
虛擬顯示裝置或者適當的系統鉤子可以使你在螢幕變化或者即將變化時得到通知,這樣可以儘可能地減少錄製的次數。參見http://ultravnc.sourceforge.net以及http://www.realvnc.com提供的VNC原始碼中的VNCHooks。
DirectX
使用DirectX可以進行直接的顯存訪問,這對提高效能很有好處。但是也由於DirectX的特性,某些使用DirectX等技術的程式可能無法錄製,例如大多數遊戲和媒體播放器,即使可以錄製也比較慢。錄製這樣的程式的視窗內容的方法是局部或者全域地禁用部分或者全部DirectX加速功能。
機器碼
在錄製和編碼過程中,使用機器碼模組可以有效地加強程式的效能。例如XVID的很多核心模組就是機器碼。
分塊的大小
大的分塊意味著錄製時錄製的次數少,但是小的分塊可能意味著較少的資料量。對於依賴於背景色的編碼方式,分塊大小也影響資料量。
其他錄製內容
滑鼠,浮水印和其他映像
在錄製映像的同時,可能同時需要在螢幕內容上疊加其他映像,例如滑鼠或者浮水印。這可以通過在每一次錄製的映像上在指定位置上疊加指定的映像來完成。
//Draw the Cursor
if (g_recordcursor==1) {
ICONINFO iconinfo ;
BOOL ret;
ret = GetIconInfo( hcur, &iconinfo );
if (ret) {
xPoint.x -= iconinfo.xHotspot;
xPoint.y -= iconinfo.yHotspot;
//need to delete the hbmMask and hbmColor bitmaps
//otherwise the program will crash after a while after running out of resource
if (iconinfo.hbmMask) DeleteObject(iconinfo.hbmMask);
if (iconinfo.hbmColor) DeleteObject(iconinfo.hbmColor);
}
:: DrawIcon( hMemDC, xPoint.x, xPoint.y, hcur);
}
這裡hMemDC包含已經錄製的螢幕內容,hcur表示當前緩衝的游標(因為游標不是每次錄製都變化,所以緩衝起來效率較高)。
音頻
為了豐富媒體內容,可能有必要在錄製螢幕時同時錄製音頻。螢幕錄製佔用了大量資源時,有可能造成音訊錄製和壓縮慢於預計的頻率,結果是錄製的媒體音調降低,以及可能的同步問題。
加密
如果錄製的內容需要保密,那麼必須考慮實施加密的效能和可行性。一般來說,為每個會話產生一個不同的密鑰來進行初步的加密就可以了。
本文轉自
http://blog.joycode.com/jiangsheng/archive/2004/01/01/10410.aspx