您好,登錄后才能下訂單哦!
在項(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
http://edu.51cto.com/course/10359.html
免責(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)容。