C++编程使用QT5SDK录制屏幕并显示-创新互联

在项目中,我们有要录制屏幕的需求,录制屏幕有多种方法,可以基于windows api的BitBlt 、ffmpeg的AVDevice、directx 和QT,本文讲解基于QT5的抓屏。QT相对于其他几种抓屏方式优势是跨平台做的比较好,接口简单,劣势相对于directx抓屏消耗大一些,但directx只能是windows。经过测试directx抓屏速度最快,其他接口速度基本一致。

成都创新互联公司是一家专业提供肇庆企业网站建设,专注与成都网站设计、网站制作H5网站设计、小程序制作等业务。10年已为肇庆众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

在我的电脑上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录制屏幕并显示

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网页标题:C++编程使用QT5SDK录制屏幕并显示-创新互联
转载来于:https://www.cdcxhl.com/article4/dojdoe.html

成都网站建设公司_创新互联,为您提供动态网站自适应网站静态网站服务器托管品牌网站制作网站排名

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

h5响应式网站建设