C++編程 使用QT5 SDK錄製屏幕並顯示

在項目中,咱們有要錄製屏幕的需求,錄製屏幕有多種方法,能夠基於windows api的BitBlt 、ffmpeg的AVDevice、directx 和QT,本文講解基於QT5的抓屏。QT相對於其餘幾種抓屏方式優點是跨平臺作的比較好,接口簡單,劣勢相對於directx抓屏消耗大一些,但directx只能是windows。通過測試directx抓屏速度最快,其餘接口速度基本一致。html


在個人電腦上qt 1080P屏幕抓屏消耗60~80毫秒,720p消耗30~50,也就是說若是抓屏1080我一秒最多錄製10幀。這個性能要算好,否則會形成阻塞。windows



  • 先獲取主屏幕而後抓屏存到QPixmapapi

//獲取主屏幕ide

QScreen *scr = QGuiApplication::primaryScreen();函數

//抓屏性能

QPixmap pix= scr->grabWindow(QApplication::desktop()->winId());測試


  • 將QPixmap轉爲能夠直接訪問rgb數據的QImageui

就兩行代碼很是簡單,抓屏後數據存放在pix中,將QPixmap轉換爲QImage就能夠取到rgb數據了。this

QImage img= pix.toImage();編碼

uchar *date = img.bits();


  • QImage格式分析

取到截屏數據後,咱們就要進行編碼壓縮,編碼可使用ffmpeg,須要肯定取到的數據格式,能夠經過img.format成員獲取,我這邊獲取的是Format_RGB32。另外要注意QT中的圖像數據不必定每一個像素連續存儲,每一行會以4對齊,最簡單解決方案,就是要保證你圖像的寬度是4的倍數。若是沒法保證,能夠經過 img.bytesPerLine() 獲取每一行的字節數。


  • 若是想要將桌面繪製到QWidget中測試,重載paintEvent函數

void QTScreen::paintEvent(QPaintEvent *event)

{

QScreen *scr = QGuiApplication::primaryScreen();

//抓屏

QPixmap pix= scr->grabWindow(QApplication::desktop()->winId());

QImage img= pix.toImage();


QPainter p;

p.begin(this);

p.drawImage(QPoint(0, 0), qi);

p.end();

}



更多的資料也能夠關注我51CTO上的視頻課程

夏老師的課堂 http://edu.51cto.com/lecturer/12016059.html

C++跨平臺開發和音視頻技術實戰主題套餐

C++實戰FFmpeg音視頻編碼實戰屏幕錄像機視頻課程-基於QT5和ffmpeg sdk

http://edu.51cto.com/course/10359.html

1406b01a322070e017b12a6e0f05c8d9.png

相關文章
相關標籤/搜索