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

相关文章
相关标签/搜索