第11课 利用windows API捕获桌面图像并通过FFmpeg分享

在上一章,我们已经实现了一对一音视频对话功能。在实际应用中,我们常需要把自己的电脑桌面分享给他人以实现桌面共享功能,这种功能在视频会议、在线教学等场景中很常见,这种功能如何实现呢?这节课我们就来解决这个问题。

1.备份demo9并修改demo9为demo11。

2.在fmle.cpp的init函数中添加捕获屏幕的线程:

//capCamHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)capCamThread, (LPVOID)this, 0, NULL);
capScrHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)capScrThread, (LPVOID)this, 0, NULL);

3.添加捕获桌面的功能:

cv::Mat hwndToMat(HWND hwnd)
{	HDC hwindowDC, hwindowCompatibleDC;int height, width, srcheight, srcwidth;HBITMAP hbwindow;cv::Mat src;BITMAPINFOHEADER  bi;hwindowDC = GetDC(hwnd);hwindowCompatibleDC = CreateCompatibleDC(hwindowDC);SetStretchBltMode(hwindowCompatibleDC, COLORONCOLOR);RECT windowsize; GetClientRect(hwnd, &windowsize);srcheight = windowsize.bottom;srcwidth = windowsize.right;height = windowsize.bottom;width = windowsize.right;src.create(height, width, CV_8UC4);hbwindow = CreateCompatibleBitmap(hwindowDC, width, height);bi.biSize = sizeof(BITMAPINFOHEADER);bi.biWidth = width;bi.biHeight = -height;bi.biPlanes = 1;bi.biBitCount = 32;bi.biCompression = BI_RGB;bi.biSizeImage = 0;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;	SelectObject(hwindowCompatibleDC, hbwindow);	StretchBlt(hwindowCompatibleDC, 0, 0, width, height, hwindowDC, 0, 0, srcwidth, srcheight, SRCCOPY | CAPTUREBLT);GetDIBits(hwindowCompatibleDC, hbwindow, 0, height, src.data, (BITMAPINFO *)&bi, DIB_RGB_COLORS); 	DeleteObject(hbwindow); DeleteDC(hwindowCompatibleDC); ReleaseDC(hwnd, hwindowDC);return src;
}int fmle::capScr(){HWND hwnd = GetDesktopWindow();cv::Mat scrMat;while (true){scrMat = hwndToMat(hwnd);		if (scrMat.cols != backWidth || scrMat.rows != backHeight){resize(scrMat, scrMat, cv::Size(backWidth, backHeight));}if (scrMat.data&&!scrMat.empty()){		cvtColor(scrMat, scrMat, CV_BGRA2BGR);mainDlg->drawMatOfPub(scrMat);EnterCriticalSection(&videoQueLock);tmpVideoQueObj.type = 1;tmpVideoQueObj.tmpMat = scrMat;tmpVideoQueObj.dataLen = scrMat.cols*scrMat.rows * 3;inVideoQue.push(tmpVideoQueObj);if (inVideoQue.size() >videoDataArrNum){inVideoQue.front().dataLen = 0;inVideoQue.front().tmpMat.release();inVideoQue.front().dataLen = NULL;inVideoQue.pop();}LeaveCriticalSection(&videoQueLock);}Sleep(40);}scrMat.release();	return 0;
}

4.调试运行,如能正常发送和播放桌面流则表示成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/233126.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初识Linux shell

Linux初探 Linux系统可以划分为4个部分: Linux内核:Linux系统的核心,控制着系统的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。 内核主要功能: 系统内存管理:内核通过硬件上称为交换…

VS+QT五子棋游戏开发

1、首先安装好VS软件和QT库,将其配置好,具体不在此展开说明。 2、文件结构如下图: 3、绘制棋盘代码,如下: void Qwzq::paintEvent(QPaintEvent* event) {QPainter painter(this);painter.setRenderHint(QPainter::An…

VMware Workstation虚拟机CentOS 7.9 配置固定ip的步骤

VMware Workstation虚拟机CentOS7.9配置固定ip的步骤 编辑虚拟机 打开VMware Workstation。 选择要配置的虚拟机,但不要启动它。 点击“编辑虚拟机设置”(Edit virtual machine settings)。 选择“网络适配器”(Network Adapter&…

ArcGIS制图技巧总结

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用,各信息化部门和生产单位都逐渐建立起自己的GIS的应用,同时积累了大量的地理数据。随着应用深度和广度的推进,针对数据建立专题应用越来越迫切,对行业专题制图的需…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第五天-Linux消息共享内存练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

Qt优秀开源项目之二十:RedPanda-CPP(小熊猫C++)

小熊猫C是跨平台、轻量易用的开源C/C集成开发环境。 官网:http://royqh.net/redpandacpp github:https://github.com/royqh1979/RedPanda-CPP 小熊猫C(原名小熊猫Dev-C 7)是基于Qt开发的Dev-C替代版本。和经典的Dev-C 5.11、新的Embarcadero …

海外跨境独立站和代购系统存在必然联系?独立站建站初期,以及如何运营好独立站。

海外跨境独立站和代购系统在多个方面存在差异: 定位:独立站是拥有独立域名,自主宣传推广媒体与渠道的新型网站,更侧重于培养买家,做品牌建设,相当于个体经营专卖店。而代购系统是利用先进的技术和流程管理…

HTML---JavaScript操作DOM对象

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 本章目标 了解DOM的分类和节点间的关系熟练使用JavaScript操作DOM节点 访问DOM节点 能够熟练的进行节点的创建、添加、删除、替换等 能够熟练的设置元素的样式 能够灵活运用JavaScript获取元素…

【北邮国院大四上】Business Technology Strategy 企业技术战略

北邮国院电商大四在读,本笔记仅为PPT内容的整理与翻译,并不代表本课程的考纲及重点,仅为本人复习时方便阅读与思考之作。 写在前面 大家好,欢迎来到大学期间的最后一门课程,本门课程是中方课,所以很庆幸的…

Python综合数据分析_根据订单求RFM值

文章目录 0.导入数据1.数据可视化2.数据清洗3.特征工程4.构建User用户表5.求R值6.求F值7.求M值 0.导入数据 import pandas as pd #导入Pandas df_sales pd.read_csv(订单.csv) #载入数据 df_sales.head() #显示头几行数据 1.数据可视化 import matplotlib.pyplot as plt #导…

django学习:ORM实现数据库的连接、表的创建与增删改查

1.ORM机制 Django 是一个流行的 Python Web 框架,它提供了一个强大的 ORM(对象关系映射)机制,用于管理应用程序和数据库之间的数据交互。 ORM 是一种编程技术,它将数据库表的结构和数据转换为面向对象的模型&#xff…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)

本实践教程将教你如何使用 Elasticsearch 构建完整的搜索解决方案。 在本教程中你将学习: 如何对数据集执行全文关键字搜索(可选使用过滤器)如何使用机器学习模型生成、存储和搜索密集向量嵌入如何使用 ELSER 模型生成和搜索稀疏向量如何使用…

如何编写高效的正则表达式?

正则表达式(Regular Expression,简称regex)是一种强大的文本处理技术,广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践,帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中,我们将使用 React 和 MUI(Material-UI)库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据,并允许用户选择多个节点。 前提 在开始之前,确保你已经安装了以下依赖: Reac…

关于目标检测中按照比例将数据集随机划分成训练集和测试集

1. 前言 在做目标检测任务的时候,不少网上的数据,没有划分数据集,只是将数据和标签放在不同的文件夹下,没有划分数据集 虽然代码简单,每次重新编写还是颇为麻烦,这里记录一下 如下,有的数据集…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1)、Docker网络原理 Docker默认使用的网络模型是bridge,这里只讲bridge网络模型 1)容器之间通信原理 当安装完docker之后,docker会在宿主机上创建一个名叫docker0的网桥,默认IP是172.17.0.1…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一: main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

最靠谱的Arduino IDE集成ESP32环境

设置的 地址为: https://dl.espressif.com/dl/package_esp32_index.json

PIG框架学习2——资源服务器的配置详解

一、前言 1、pig资源服务器的配置 Spring Security oauth2相关的依赖是在pigx-common-security模块中引入的,其他模块需要进行token鉴权的,需要在微服务中引入pigx-common-security模块的依赖,从而间接引入相关的Spring security oauth2依赖…

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件:ca-config.json ② 创建 CA 证书签名请求文件&#xff…