视频会议开发:为什么必须使用显卡GPU解码渲染视频?

news2024/11/19 10:31:02

       现在,使用视频会议系统远程协同办公、沟通交流,已经非常普遍了。如果我们要开发自己的视频会议系统,那么,GPU解码渲染技术是不可缺少的。

       在视频会议系统中,经常需要同时观看会议中多个参会人员的视频图像,另外,还可能需要同时观看某人分享的屏幕。

       随着大家对会议中视频图像的要求越来越高,所以在适配会议中,起步分辨率就是1280*720。而1920*1080已经是标配,2K分辨率也不算太高。

       但是,对程序而言,高分辨率的视频图像的编码、解码、渲染都是消耗性能的大户。

一.为什么必须使用GPU解码渲染视频?

      在视频会议中,同时看多路高清视频图像是基础的硬指标。每一路视频图像都是需要解码和渲染的,如果解码和渲染的工作都交给CPU来做(即所谓的“软解” CPU-based Software Decoding),那么CPU的负载就会立马飙升,严重时会CPU跑满而导致系统卡死。

      何况,CPU并不擅长做图像处理的工作。对于H264/H265视频,解码和渲染都是GPU专业技能,所以,在视频会议中,我们要尽可能地使用GPU也就是显卡来解码渲染视频(即所谓的“硬解”,也称“硬件加速” GPU-accelerated Hardware Decoding)。

二. 显卡与GPU解码、渲染

      显卡,一般肯定都是支持GPU渲染的,然而,并不是所有的显卡都支持GPU解码视频。对于指定的显卡,我们查看其性能参数,就可以知道其是否支持H264/H265视频解码,且能支持解码的视频最高分辨率是多少。

      目前市面上主流的显卡主要有三种:Intel的集显(也叫核显)、NVIDIA的N卡、以及AMD的A卡。

      在程序中想要使用GPU来解码渲染视频,首先要看这台电脑配备的显卡是哪种,然后再使用该显卡对应的程序接口去访问它。

      下面是每种显卡所使用的程序访问接口/技术。

      我们可以先这样简单地理解显卡,即 显卡 = GPU + 显存。而GPU是操作不了内存的,内存是由CPU操作的,GPU只能对显存进行操作。

      GPU要解码H264/H265视频图像,先要将其拷贝到显存中,再由GPU解码,解码后得到的图像数据(一般是YUV格式)也是位于显存中,此时,直接将该数据提交给GPU去渲染,性能就非常高效了。

       之前,我们尝试过一种方案:解码由GPU来做,然后渲染由CPU做。即我们把GPU解码得到的YUV数据拷贝回内存,再交由CPU去渲染,但是这样效率就大打折扣了。

       因为当视频图像的分辨率很高时,解码得到的YUV数据就非常大,这时将其从显存拷贝回内存,就需要消耗大量的CPU。

       经过我们测试,这样的方案很鸡肋,还不如直接使用CPU解码渲染来得方便省事。

       当然,最佳方案是解码和渲染全部交由GPU来执行。如果有些显卡不支持GPU解码,那么,就只能由CPU解码,GPU来渲染了。

三.对比测试

       我们使用 OMCS入门Demo 来做测试(OMCS 支持使用集显、N卡、A卡解码渲染视频),分别在开启和关闭GPU解码渲染功能时,看看CPU和GPU的占用情况。

       首先将摄像头分辨率设置成1920*1080,帧频设为30fps,如下代码所示:

     multimediaManager.CameraVideoSize = new Size(1920, 1080);
     multimediaManager.MaxCameraFrameRate = 30;

       然后,我们可以通过设置 GpuEnabled4Decode 属性来控制是否开启GPU解码渲染:

     multimediaManager.Advanced.GpuEnabled4Decode = true; //是否开启GPU解码渲染

       OMCS入门Demo按照上面修改后,重新编译客户端。接下来就可以开始我们的测试工作了。

       先在我同事的电脑上启动Demo客户端,登录aa01账号。然后,在我的电脑上启动客户端后,登录aa02账号,然后,aa02去连接aa01的摄像头,这样,aa02就可以看到aa01的视频图像了。

       此时,我电脑上的demo客户端aa02在收到了来自aa01视频图像帧(H264)后,会将其解码,然后再在UI上渲染出来。

1. 使用CPU解码渲染视频

       我们先关闭GPU解码渲染功能:

  multimediaManager.Advanced.GpuEnabled4Decode = false; //关闭GPU解码渲染

       测试时看看CPU的占用情况:     

       可以看到,Demo客户端进程CPU占用率为8%,而GPU的占用为0,表示没有使用GPU。

       我这台电脑的CPU型号是 AMD Ryzen 7 4700G with Radeon Graphics,算是很不错的,如果是次一点的CPU,解码渲染一路1080p的视频,CPU能跑到20%了。

2. 使用GPU解码渲染视频

        接下来,我们开启GPU解码渲染功能:

  multimediaManager.Advanced.GpuEnabled4Decode = true; //开启GPU解码渲染

        再看看CPU的占用情况:    

       对比非常明显,现在CPU的利用率降到了0,而GPU利用率接近7%。

       这样看来,测试的这台电脑的显卡,可以同时解码渲染13~14路1920*1080的全高清视频,如果是1280*720的高清视频,应该可以同时解码渲染20多路了,这样,对于一般的视频会议系统来说,是绰绰有余了。

       通过上面的介绍,你应该已经明白了,为什么视频会议系统中必须使用GPU来解码渲染视频了吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1799153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ant Design Pro

一:Ant Design pro是什么: Ant Design Pro 是基于 Ant Design 和 umi 的封装的一整套企业级中后台前端/设计解决方案,致力于在设计规范和基础组件的基础上,继续向上构建,提炼出典型模板/业务组件/配套设计资源&#x…

【js】input设置focus()不生效

实现功能:点击添加文章标签的时候,输入框聚焦。 页面上,input输入框默认不显示,是display:none; 点击添加按钮后,input输入框才显示。 在js里面直接获取元素进行设置聚焦不成功 。 ∵ focus方法比show方法先执行。j…

【MySQL】MySQL Connect -- 详解

一、Connector / C 使用 要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,可以去官网进行下载:MySQL :: MySQL Community Downloads 我们使用 C 接口库来进行连接,要正确使用,还需要做一些准备工作&#xff1a…

从军事角度理解“战略与战术”

战略与战术,均源于军事术语。 战略(Strategy),源自希腊语词汇“strategos(将军)”和“strategia(军事指挥部,即将军的办公室和技能)”。指的是指挥全局性作战规划的谋略…

如何知道ZIP压缩包解压密码?有哪些解密策略?

我们在生活当中,经常会遇到ZIP压缩包,它们以其高效的文件压缩和方便的传输特性而受到广泛欢迎。然而,有时我们可能会遇到一些带有密码保护的ZIP文件,这时就需要知道解压密码才能访问其中的内容。本文将探讨如何知道ZIP压缩包的解压…

Thinkphp使用Elasticsearch查询

在Thinkphp中调用ES,如果自己手写json格式的query肯定是很麻烦的。我这里使用的是ONGR ElasticsearchDSL 构建 ES 查询。ongr ElasticsearchDSL 的开源项目地址:GitHub - ongr-io/ElasticsearchDSL: Query DSL library for Elasticsearch。ONGR Elastics…

网络编程TCP

White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程(下)🙉 🐹今日诗词: 壮士当唱大风哥, 宵小之徒能几何?🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微…

[职场] 为什么不能加薪? #学习方法#知识分享#微信

为什么不能加薪? 不能加薪的根本原因,终于被我找到了! 朋友们!职场这个地方是个很神奇的世界,有些规则并不是你想象的那样。我们都希望能在这个世界里施展自己的才华,获得升职加薪的荣耀。然而&#xff0c…

Docker搭建ELKF日志分析系统

Docker搭建ELKF日志分析系统 文章目录 Docker搭建ELKF日志分析系统资源列表基础环境一、系统环境准备1.1、创建所需的映射目录1.2、修改系统参数1.3、单击创建elk-kgc网络桥接 二、基于Dockerfile构建Elasticsearch镜像2.1、创建Elasticsearch工作目录2.2、上传资源到指定工作路…

Maxkb玩转大语言模型

Maxkb玩转大语言模型 随着国外大语言模型llama3的发布,搭建本地个人免费“人工智能”变得越来越简单,今天博主分享使用Max搭建本地的个人聊天式对话及个人本地知识域的搭建。 1.安装Maxkb开源应用 github docker快速安装 docker run -d --namemaxkb -p 8…

被拖欠6000万,代工大厂倒闭了····

6月7日消息,据综合媒体报道,电子烟代工大厂佳斯特电子(东莞)发布公告,将自6月3日起停止一切经营活动,开始自行清算工作。根据佳斯特电子科技(东莞)有限公司的通告,由于公…

IP域名关系的研究与系统设计(学习某知名测绘系统)

IP域名关系库管理包括域名库检索和whois库检索,详情如下。 域名库检索支持以下5项功能: 1.通过过滤器检索 筛选条件包含IP地址、口令、工具名称、可利用的漏洞编号、创建时间; 2.通过关键字检索 在查询框中输入域名库名称的部分关键词&a…

基于语音识别的智能电子病历(其他)网络电话的接入

医生在使用语音识别时有以下几种方式。 医院或者医生通过接口或者网站上传语音文件医生使用电话进行录音,医生拨打电话进行录音。有T1线路语音卡,也有网络电话的接入。医生使用手机APP进行录音。 下面说一下网络电话的使用,(注意…

C语言数据结构(排序算法总结)

目录 算法类型 算法比较 稳定性描述 插入排序 选择排序 冒泡排序 希尔排序 堆排序 快速排序 霍尔排序(递归) 挖坑法(递归) 双指针(递归) 快排(非递归) 归并排序 计数排序 总结(速…

计算机毕业设计基于YOLOv8的头盔检测系统

1、安装Anaconda 官网下载或者哔哩哔哩有的up分享 https://www.anaconda.com/download 版本无所谓,安装位置不要有中文就行 2、创建环境yolov8 winR打开命令行 conda create -n yolov8 python3.9 3、打开源码 下载下来放到你想放的目录,直接用pyCharm或者…

华为端云一体化开发 (起步1.0)(HarmonyOS学习第七课)

官方文献: 为丰富HarmonyOS对云端开发的支持、实现端云联动,DevEco Studio推出了云开发功能,开发者在创建工程时选择云开发模板,即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开发,体验端云一体化协…

【排序】插入排序,希尔排序

前面我们讲述了冒泡排序和选择排序,我们本章讲的排序方法是插入排序,插入排序是希尔排序实现的基础函数,大家一定要好好理解插入排序的逻辑,这样才能在后面学习希尔排序的时候,更容易的去理解,我们直接开始…

Vue根据后端返回的tabList动态渲染组件信息

最近做了一个功能&#xff0c;后端根据配置信息&#xff0c;动态返回一个tabList&#xff0c;其中结构是List<String,Object> tabList; map里面的数据是 label、value 页面需要根据tablist动态渲染组件&#xff08;不同的tab都使用了组件进行了封装&#xff09; 实现效果…

[原创][Delphi多线程]TThreadedQueue的经典使用案例.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delph…

Git介绍及应用

1.简介 Git是一个分布式版本控制器&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 2.执行流程 3.Git代码托管服务…