91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-07-11 11:06:55 來源:網絡 閱讀:2000 作者:夏曹俊 欄目:編程語言

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


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



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

//獲取主屏幕

QScreen *scr = QGuiApplication::primaryScreen();

//抓屏

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


  • 將QPixmap轉為可以直接訪問rgb數據的QImage

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

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

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







向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

加查县| 宁强县| 海淀区| 鹤壁市| 秭归县| 百色市| 昂仁县| 白河县| 习水县| 自治县| 清丰县| 额济纳旗| 九台市| 陆川县| 宝鸡市| 嵊州市| 枣阳市| 沅江市| 宝兴县| 长顺县| 个旧市| 会宁县| 泊头市| 云林县| 旬邑县| 泾阳县| 衡南县| 桂阳县| 沭阳县| 克什克腾旗| 吴堡县| 常山县| 台中县| 丰都县| 康平县| 旅游| 田东县| 中阳县| 兴文县| 莆田市| 天峻县|