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

淺唱寂寞╮ 提交于 2019-12-01 01:51:53

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);	 	

EasyScreenLive演示对比.jpg

(演示对比)

EasyScreenLive硬件解码.png

(硬件解码)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!