很多地方都需要用到截圖/錄屏技術,比如桌面直播,桌面錄製等等。在微軟windows平台,有很多截圖的介面,不過大多數效能並不理想,windows8以後微軟引入了一套新的介面,叫「desktop duplication api」,應用程式,可以通過這套api訪問桌面資料。而由於desktop duplication api是通過microsoft directx graphics infrastructure (dxgi)來提供桌面影象的,速度非常快。由於是通過gpu,所以cpu佔用率很低,效能很高。
還有一點有意思的是,duplication api獲取到的桌面資料,不管顯示模式如何設定,都永遠是32位rgba資料,其實這樣方便的多了,不用考慮其他可能的情況,比如24位等。
綜合來看,各方面秒殺gdi截圖技術,易用性上也比mirrordriver技術好得多,是windows8以後平台的截圖技術首選。
首先,這套介面是整合在dirextx之中的,所以更大部分directx介面的使用方式基本一致,也就是通過d3d,各種queryinte***ce,各種enum,核心方法,是acquirenextframe。先簡單說下流程。
建立d3ddevice
通過一系列介面獲取路徑,獲取到idxgioutputduplication介面
呼叫acquirenextframe,獲取當前桌面資料,儲存在idxgiresource中
把資料從gpu對映到記憶體中
拷貝需要的資料到自己的buffer裡
其中,獲取到idxgioutputduplication介面,是通過如下路徑:
這裡把他跟傳統的使用gdi截圖技術,進行對比。程式只擷取桌面資料,然後把資料儲存到自己的記憶體buffer中,不做其他操作。cpu有點差,如果是好點的cpu,效能資料應該是更好看,不過做對比還是很明顯能看出來的。
我的筆記本比較老了,所以gdi最多只能跑到20幀了,不過可以看到,即使這種情況下,當不設定幀率,也就是無限迴圈截圖的情況下,dxgi的效能只能用可怕來形容。。。
anydesk截圖技術
anydesk針對不同的作業系統使用了不同的截圖技術 針對nt5系統使用ddraw截圖。針對nt6系統優先使用dxgi截圖,如果不支援dxgi則使用dx截圖。為什麼這樣做呢?首先directdraw覆蓋了全系統,但是dx確不一定是什麼版本了,在nt5上使用ddraw速度肯定是比gdi快的 如果win...
c 錄屏 FFmpeg錄屏 錄屏格式轉換
需要對軟體的客戶區進行錄屏,但是找了半天資料發現並不好整合到我的軟體當中,最後發現利用cmd命令呼叫ffmpeg.exe可以實現錄屏功能,實現錄屏以及錄屏格式轉換,相當有趣。ffmpeg有乙個專用於windows下螢幕錄製的裝置 gdigrab。gdigrab是基於gdi的抓屏裝置,可以抓取螢幕的特...
C 截圖工具開發技術
最近有乙個需要擷取當前螢幕,並儲存成bmp檔案的需求。整個需求,拆分成三步 1 擷取螢幕,獲得位圖資料。2 配合bmp檔案結構資訊,將資料整合。3 對整合後的資料做操作,如儲存在本地 通過網路傳送至伺服器等。截圖首先獲得螢幕的hdc,通過getdc 這個api,接著建立乙個相容hdc,即comhdc...