cef降低视频渲染时cpu使用率的方法

news/2024/12/23 6:01:22/

windows客户端中使用了基于webrtc的音视频sdk,同时界面使用的是cef。
当webrtc解码出大尺寸视频时,需要通过某些技术将数据投递给javascript进行绘制。
##一、使用canvas绘制bmp数据
webrtc解码图像后,将数据转换为BMP图像,保存在内存中,
javascript通过自定义scheme进行图像的获取,比如请求zhangpengtest://image001.bmp
拿到数据后通过canvas绘制bmp。
这种方法cpu占用率很高,因为canvas使用cpu绘制,并且需要进行图像的缩放。
c++通过以下代码通知js有图像准备好:

    std::stringstream ss;ss << "zhangpengtest://" << sid << pic_id++ << ".bmp";std::string url = ss.str();		CefRefPtr<CefFrame> frame = browser->GetMainFrame();char buffer[256];sprintf(buffer, "onVideoData('%s');", url.c_str());frame->ExecuteJavaScript(buffer, frame->GetURL(), 0);

javascript可以通过设置img标签的src来加载图像
##二、通过webgl绘制
通过webgl绘制可以降低cpu,如何获取javascript的arraybuffer数据?
可以通过自定义scheme,结合XMLHttpRequest的Get请求,向browser进程的webrtc请求数据。
可以参考文章 cef中javascript和c++交换二进制数据(arraybuffer)的方法
我为什么选择使用方案三,是因为当时还没有发现能拿到arraybuffer数据的方法。
目前感觉可以使用此方案替换方案三。
##三、修改cef源码,添加虚拟摄像头,使用video标签预览摄像头
###基础知识
cef中本身也继承了一个webrtc,在javascript中使用getUserMedia()可以获取视频流stream。
通过window.navigator.mediaDevices.enumerateDevices()可以获取摄像头列表。
通过window.navigator.mediaDevices.getUserMedia可以获取对应于某个videoId的stream。
当使用video.srcObject = stream时,即可在video标签中预览摄像头。
###添加虚拟的摄像头
通过为设备列表添加一个虚拟的id,通过这个id的stream,使video标签打开我们自己实现的摄像头。
在该摄像头的实现代码中,为摄像头获取webrtc sdk解码的YUV格式的视频图像。
(1)修改media\capture\video\win\video_capture_device_factory_win.cc

void VideoCaptureDeviceFactoryWin::GetDeviceDescriptors(VideoCaptureDeviceDescriptors* device_descriptors) {DCHECK(thread_checker_.CalledOnValidThread());VideoCaptureApi api = VideoCaptureApi::WIN_DIRECT_SHOW;if (use_media_foundation_) {GetDeviceDescriptorsMediaFoundation(device_descriptors);api = VideoCaptureApi::WIN_MEDIA_FOUNDATION;}else {GetDeviceDescriptorsDirectShow(device_descriptors);}device_descriptors->emplace_back("zhangpengtest", "085db6c9-3c95-43a9-96de-2f015f2ac17c", "zhangpengtest:0", api);
}

在获取摄像头列表后,添加一个虚拟摄像头zhangpengtest,字符串的字段都可以任意填写,不要和已存在的设备重名即可。

std::unique_ptr<VideoCaptureDevice> VideoCaptureDeviceFactoryWin::CreateDevice(const Descriptor& device_descriptor) {DCHECK(thread_checker_.CalledOnValidThread());std::unique_ptr<VideoCaptureDevice> device;if (device_descriptor.display_name.find("zhangpengtest") != std::string::npos) {device.reset(new VideoCaptureDeviceZhangpeng(device_descriptor));DVLOG(1) << " DirectShow Device: " << device_descriptor.display_name;if (!static_cast<VideoCaptureDeviceFenbi*>(device.get())->Init())device.reset();return device;}//省略了部分代码return device;
}

以上代码,在打开摄像头时,发现是虚拟摄像头,就返回了VideoCaptureDeviceZhangpeng对象。
(2)实现摄像头类VideoCaptureDeviceZhangpeng

//继承于VideoCaptureDevice
class VideoCaptureDeviceZhangpeng : public VideoCaptureDevice {bool Init();
}

具体的实现细节,参考内置摄像头的实现方法即可。
重点细节在于在Init中启动一个线程,该线程负责定时获取图像数据。
获取图像数据后,回调给上层逻辑。

client_->OnIncomingCapturedData(data);

这样video标签就拿到了视频图像,会自动绘制出来。
(3)如何获取图像数据呢?
在windows系统中,可以通过共享内存来解决。
webrtc sdk解码视频后,写入共享内存。
虚拟摄像头中的线程,定时读取共享内存即可。


http://www.ppmy.cn/news/624509.html

相关文章

关于cpu 使用率【转】

来源&#xff1a;Linux中通过/proc/stat等文件计算Cpu使用率 - - BlogJava 总的Cpu使用率计算 计算方法&#xff1a; 1、 采样两个足够短的时间间隔的Cpu快照&#xff0c;分别记作t1,t2&#xff0c;其中t1、t2的结构均为&#xff1a; (user、nice、system、idle、iowait、i…

简单几步优化Ubuntu 降低CPU使用率

1、禁用 IPv6 目前 IPv6 还没有到来&#xff0c;Ubuntu 这个超前的功能暂时可以屏蔽掉&#xff0c;以加快速度。 编辑 sudo gedit /etc/modprobe.d/aliases&#xff0c;把&#xff1a; alias net-pf-10 ipv6 修改为 alias net-pf-10 off #ipv6 2、并行运行开机启动脚本 /etc/in…

计算机处理器显卡,电脑特别卡?别再让CPU显卡背锅了!

你是否有遇到电脑卡顿的问题呢&#xff1f;你是否开机速度特别慢呢&#xff1f;你是否经常磁盘占用率为100%呢&#xff1f; 是不是觉得很难受&#xff0c;为什么会这样呢&#xff1f;是不是很抓狂呢&#xff1f; 你是不是在想&#xff0c;为什么我的电脑买回来还没有多久&#…

让GPU跑的更快

作为一个cuda爱好者 一定要好好看看 不再让CPU和总线拖后腿&#xff1a;Exafunction让GPU跑的更快&#xff01;确实只用cpu会卡的一比... 在云服务中使用 GPU 是获得低延迟深度学习推理服务最经济的方式。使用 GPU 的主要瓶颈之一是通过 PCIe 总线在 CPU 和 GPU 内存之间复制…

统一处理异常/日志

在发生错误时服务器会自动重定向到error页面&#xff0c;为什么还需要定义一个新的类处理呢&#xff1f; 服务器只是在错误发生时跳转到错误页面&#xff0c;但是我们还需要记录日志&#xff0c;并且在异步请求中不是返回页面&#xff0c;而是返回json&#xff0c;这些都是服务…

Stable-diffusion支持Inter和AMD显卡加速出图的操作方法

英伟达的显卡有CUDA加持Stable diffusion出图很快&#xff0c;但我无奈家徒四壁&#xff0c;只有AMD老显卡苦苦支撑着本不富裕的家庭&#xff0c;但是生活还是继续不是。来吧&#xff01;兄弟&#xff0c;看看老显卡能不能加速出图就完事了。 说明&#xff0c;我在MacOs上操作成…

让你的电脑性能拉满

让你的电脑性能拉满 在我们做开发的时候&#xff0c;如果我们的生产工具&#xff08;也就是我们的电脑&#xff09;出现卡顿或者无法运行开发工具的话&#xff0c;那将会极大地影响我们的生产力。而且&#xff0c;电脑制造商为了电脑的稳定性&#xff0c;故意把初始化时候的电脑…

python 降低cpu_如何在获取帧的同时降低cpu使用率

我通过直接使用FFmpeg读取帧来提高速度。也许有更好的方法来做到这一点&#xff0c;但这是一种认可。我想你已经在不同的过程中开始了视频捕获&#xff0c;对吗&#xff1f;否则&#xff0c;这也是明智的一步。在import numpy from subprocess import Popen, PIPE import cv2 c…