<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
一、 浏览器的云渲染采集方案
方案分为三种:
- 抓取桌面浏览器画面 (Window Graphics Capture)方案
- hook浏览器渲染进程画面
- 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_);
}