首页 > 移动平台 > 详细

摄像头、电脑投屏、手机投屏同屏互联网直播之LibEasyScreenLive实现屏幕局部采集方法

时间:2019-10-10 11:28:46      阅读:174      评论:0      收藏:0      [点我收藏+]

LibEasyScreenLive在通过GDI方式采集的同时,我们不仅支持采集全屏幕,也支持屏幕局部某个区域的采集,这里,我们需要精确计算屏幕像素坐标,以实现采集位置的精确定位。

首先,设置采集区域坐标,如下代码所示:

	int top=m_rcUse.top;
	int left=m_rcUse.left;
	int width=m_rcUse.right-m_rcUse.left+1;
	int height=m_rcUse.bottom - m_rcUse.top + 1;

	//  [1/27/2016 SwordTwelve]
	//长宽做一下修正,修正为16的倍数
	int nDivW = width%16;
	int nDivH = height%16;
	if (nDivW<8)
		width -= nDivW;
	else
		width += (16 - nDivW);
	if (nDivH<8)
		height -= nDivH;
	else
		height += (16 - nDivH);
	if (width>m_nMaxxScreen)
	{
		width = m_nMaxxScreen;
	}
	if (height>m_nMaxyScreen)
	{
		height = m_nMaxyScreen;
	}
技术分享图片

注意,这里对采集区域的长宽做了16倍数修正,这是为了在视频编码的时候不会因为像素对齐的问题导致编码失败。
然后,在采集核心函数内,指定桌面区域拷贝上下文DC的内容,如下代码所示:

	//获取桌面屏幕设备DC
	HDC hScreenDC = ::GetDC(NULL);

	HDC hMemDC = ::CreateCompatibleDC(hScreenDC);     
	HBITMAP hbm;

	hbm = CreateCompatibleBitmap(hScreenDC, width, height);
	HBITMAP oldbm = (HBITMAP) SelectObject(hMemDC, hbm);	 
	BitBlt(hMemDC, 0, 0, width, height, hScreenDC, left, top, SRCCOPY);	 	

技术分享图片

技术分享图片?

(演示对比)

技术分享图片?技术分享图片

(硬件解码)

摄像头、电脑投屏、手机投屏同屏互联网直播之LibEasyScreenLive实现屏幕局部采集方法

原文:https://www.cnblogs.com/TSINGSEE/p/11646774.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!