LibEasyScreenLive在通过GDI方式采集的同时,我们不仅支持采集全屏幕,也支持屏幕局部某个区域的采集,这里,我们需要精确计算屏幕像素坐标,以实现采集位置的精确定位。
首先,设置采集区域坐标,如下代码所示:
注意,这里对采集区域的长宽做了16倍数修正,这是为了在视频编码的时候不会因为像素对齐的问题导致编码失败。
然后,在采集核心函数内,指定桌面区域拷贝上下文DC的内容,如下代码所示:
(硬件解码)
2022-07-15 17:40:20
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);
(硬件解码)