溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++編程 使用QT5 SDK錄制屏幕并顯示

發(fā)布時(shí)間:2020-07-11 11:06:55 來源:網(wǎng)絡(luò) 閱讀:1998 作者:夏曹俊 欄目:編程語言

在項(xiàng)目中,我們有要錄制屏幕的需求,錄制屏幕有多種方法,可以基于windows api的BitBlt 、ffmpeg的AVDevice、directx 和QT,本文講解基于QT5的抓屏。QT相對(duì)于其他幾種抓屏方式優(yōu)勢是跨平臺(tái)做的比較好,接口簡單,劣勢相對(duì)于directx抓屏消耗大一些,但directx只能是windows。經(jīng)過測試directx抓屏速度最快,其他接口速度基本一致。


在我的電腦上qt 1080P屏幕抓屏消耗60~80毫秒,720p消耗30~50,也就是說如果抓屏1080我一秒最多錄制10幀。這個(gè)性能要算好,不然會(huì)造成阻塞。



  • 先獲取主屏幕然后抓屏存到QPixmap

//獲取主屏幕

QScreen *scr = QGuiApplication::primaryScreen();

//抓屏

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


  • 將QPixmap轉(zhuǎn)為可以直接訪問rgb數(shù)據(jù)的QImage

就兩行代碼非常簡單,抓屏后數(shù)據(jù)存放在pix中,將QPixmap轉(zhuǎn)換為QImage就可以取到rgb數(shù)據(jù)了。

QImage img= pix.toImage();

uchar *date = img.bits();


  • QImage格式分析

取到截屏數(shù)據(jù)后,我們就要進(jìn)行編碼壓縮,編碼可以使用ffmpeg,需要確定取到的數(shù)據(jù)格式,可以通過img.format成員獲取,我這邊獲取的是Format_RGB32。另外要注意QT中的圖像數(shù)據(jù)不一定每個(gè)像素連續(xù)存儲(chǔ),每一行會(huì)以4對(duì)齊,最簡單解決方案,就是要保證你圖像的寬度是4的倍數(shù)。如果無法保證,可以通過 img.bytesPerLine() 獲取每一行的字節(jié)數(shù)。


  • 如果想要將桌面繪制到QWidget中測試,重載paintEvent函數(shù)

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();

}



更多的資料也可以關(guān)注我51CTO上的視頻課程

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

C++跨平臺(tái)開發(fā)和音視頻技術(shù)實(shí)戰(zhàn)主題套餐

C++實(shí)戰(zhàn)FFmpeg音視頻編碼實(shí)戰(zhàn)屏幕錄像機(jī)視頻課程-基于QT5和ffmpeg sdk

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

C++編程 使用QT5 SDK錄制屏幕并顯示







向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI