攝像頭、電腦投屏、手機投屏同屏互聯網直播之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);	 	

EasyScreenLive演示對比.jpg

(演示對比)

EasyScreenLive硬件解碼.png

(硬件解碼)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM