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

EasyScreenLive功能介绍

EasyScreenLive是一款简单、高效、稳定的集采集,编码,组播,推流和流媒体RTSP服务于一身的同屏功能组件,具低延时,高效能,低丢包等特点。

目前支持Windows,Android平台,通过EasyScreenLive我们就可以避免接触到稍显复杂的音视频源采集,编码和流媒体推送以及RTSP/RTP/RTCP/RTMP服务流程,只需要调用EasyScreenLive的几个API接口,就能轻松、稳定地把流媒体音视频数据RTMP推送给EasyDSS服务器以及发布RTSPServer服务, RTSP同屏服务支持组播和单播两种模式。

LibEasyScreenLive实现屏幕局部采集方法

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

(演示对比)

(硬件解码)

发布了64 篇原创文章 · 获赞 0 · 访问量 6842

猜你喜欢

转载自blog.csdn.net/EasyGBS/article/details/103526869