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

这篇具有很好参考价值的文章主要介绍了第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.调试运行,如能正常发送和播放桌面流则表示成功。

第11课 利用windows API捕获桌面图像并通过FFmpeg分享,C++,opencv,ffmpeg,windows,ffmpeg,c++,音视频,opencv文章来源地址https://www.toymoban.com/news/detail-779080.html

到了这里,关于第11课 利用windows API捕获桌面图像并通过FFmpeg分享的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 家庭版Windows10/Windows11不支持远程桌面

    家庭版Windows10是不支持远程桌面的。我们可以在windows的“设置”- “远程桌面设置”里面查看系统是否支持远程桌面: 我们可以通过RDPWrap这个项目让家庭版也支持远程桌面。 首先在下面网址下载该项目,下载zip https://github.com/stascorp/rdpwrap/releases/tag/v1.6.2 解压,分别以管理员

    2023年04月08日
    浏览(56)
  • windows 11 去掉桌面图标的小箭头方法

    以前我们还可以利用电脑管家的电脑诊所来去掉小箭头图标,但是现在更新的windows11 系统版本这种方法就不再实用了(亲测) 这个时候还会出先黑块, 又要利用去掉快捷键方式去除黑块 这里我们使用更改注册表方式来解决,实际上Windows11系统中,想要取消桌面快捷方式小箭头

    2024年02月16日
    浏览(40)
  • windows利用ffmpeg采集摄像头画面,支持服务启动,支持一键启动

    1. 我们在windows 系统下采用ffmpeg去采集笔记本电脑摄像头和麦克风的时候需要先获取摄像头和麦克风的信息 2. 因为每台电脑摄像头和麦克风的信息不一样,如果名称不对会导致不能采集  bat脚本实现,先去获取摄像头信息,筛选出摄像头的信息,作为变量传入到ffmpeg采集命令

    2024年02月13日
    浏览(42)
  • 基于PyQt5的桌面图像调试仿真平台开发(11)清晰度测试

    基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)亮度处理 基于PyQt5的桌

    2024年02月12日
    浏览(42)
  • Python图像处理【11】利用反卷积执行图像去模糊

    我们已经知道可以使用低通滤波器执行模糊操作,并减弱图像中较高频域。模糊操作(例如,高斯模糊)是线性的,在数学意义上是可逆的,但在实践中,该问题

    2024年02月04日
    浏览(44)
  • 【解决】你的家庭版windows 11 不支持远程桌面问题

    某天想要使用mstsc进行远程桌面时发现windows 11 不支持远程桌面,来解决一下吧 被控方电脑 打开控制面板-系统和安全-允许远程访问,勾选允许远程协助连接这台计算机 打开控制面板-系统和安全-Windows Defender 防火墙-允许应用或功能通过Windows Defender 防火墙 (1)点击更改设置

    2024年02月02日
    浏览(43)
  • C# Windows API应用:获取桌面所有窗口句柄的方法

    C# Windows API应用:获取桌面所有窗口句柄的方法 在 C# 的 Windows 应用程序开发中,我们常常需要获取桌面上所有窗口的句柄,以便进行一些窗口管理或者后续操作。本文将介绍一种利用 Windows API 获取桌面所有窗口句柄的方法,并提供相应的源代码和描述。 在开始之前,我们需

    2024年02月05日
    浏览(52)
  • Windows通过RDP异地远程桌面Ubuntu【内网穿透】

    XRDP是一种开源工具,它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外,xrdp工具还接受来自其他RDP客户端(如FreeRDP、rdesktop和NeutrinoRDP )的连接。 相较于VNC,xrdp更加的轻量级。下面简单几步实现ubuntu XRDP+cpolar内网穿透工具,实现windows远程桌面控制ubuntu。 先更APT 包管

    2024年02月21日
    浏览(52)
  • win11家庭版安装远程桌面服务(使用RDPWra解决windows家庭版无法远程桌面问题)

    1.进行rdpwrap软件安装 2.设置rdpwrap软件进行相关配置 3.按当前系统版本号修改rdpwrap.ini文件 4.进行windows账户相关设置,进行远程桌面测试 获取RDP软件和相关配置文件 rdpwrap相关压缩包和对应版本号的rdpwrap.ini配置文件 百度网盘获取RDP软件和配置文件 https://pan.baidu.com/s/1EJQnfUMoJ

    2024年02月02日
    浏览(54)
  • 利用R语言通过百度地图API进行批量地理编码

    当您有大量的地点名称需要在地图上来呈现时,首先要在在线地图上找到该地址的坐标,通常是指经纬度,如果能够用代码来实现,便少了许多费时费力的体力活儿,以下将详细介绍地理编码的详细实现路径,即使您是一个编程小白,只要会打开软件,也可轻松搞定批量地理

    2024年02月11日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包