云渲染之浏览器渲染采集方案

云渲染、Cef、离屏渲染、

Posted by chensong on 2024-12-23 18::43::01

<hr style=” border:solid; width:100px; height:1px;” color=#000000 size=1”>

前言

@TOC

<hr style=” border:solid; width:100px; height:1px;” color=#000000 size=1”>

云渲染之浏览器渲染采集Cef方案地址:https://github.com/chensongpoixs/cbrowser.git

一、 浏览器的云渲染采集方案

方案分为三种:

  1. 抓取桌面浏览器画面 (Window Graphics Capture)方案
  2. hook浏览器渲染进程画面
  3. Cef中离屏渲染

上面方案一: 是我们前期使用方案, 缺点是浏览器一直在桌面上, 电脑不能做其它事情

方案二: 没有采用这种方案问题是 浏览器是多进程,进程ID不好管理,界面与进程对应关系有难度, 所以后期没有采用这种方案

方案三: 是我们项目中最终采用方案, 所以离屏渲染

二、抓取桌面google浏览器WGC(Window Graphics Capture)方案

使用WGC(Window Graphics Capture)方案

抓取桌面应用画面后创建共享GPU地址: 抓取一帧画面后显存拷贝 (零拷贝)共享显存中取, 然后编码线程拿到共享显存地址进行编码

使用WGC(Window Graphics Capture)方案代码地址:

三、Cef、离屏渲染方案

google浏览器进程分为 通常5进程分别是

work进程 render进程 (GPU渲染进程) gpu-process进程 (GPU处理进程) utility进程两个

我们需要再渲染进程渲染完后 会共享一块显存地址 会通过webrtc协议发到工作进程中 然后接受通过的回调函数方式给到应用层

第一步我们在启动时候设置CefSettings中windowless_rendering_enabled参数为true是离屏渲染 , browser_subprocess_path参数是开启动其他四个子进程程序

设置离屏渲染需要继承CefRenderHandler类 然后在回调函数OnAcceleratedPaint 拿到共享显存地址

void crender_window::OnAcceleratedPaint(CefRefPtr<CefBrowser> browser, CefRenderHandler::PaintElementType type, const CefRenderHandler::RectList& dirtyRects, const CefAcceleratedPaintInfo& info)
{
	// 1. 打开显存地址
	if (type == PET_POPUP) {
		popup_layer_->on_paint(info.shared_texture_handle);
		
	}
	else {
		browser_layer_->on_paint(info.shared_texture_handle);
		
	}

	// 2.  渲染到当前屏幕上
	Render();


	// 3. 拷贝到新共享显存地址上
	if (type == PET_POPUP) {
		popup_layer_->copy_shared_textrue();

	}
	else {
		browser_layer_->copy_shared_textrue( );

	}

	//g_rtc_mgr.webrtc_texture(device_->pSharedHandle, 87, width_, height_);
}

总结