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

       现在,使用视频会议系统远程协同办公、沟通交流,已经非常普遍了。如果我们要开发自己的视频会议系统,那么,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来解码渲染视频了吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ALSA 用例配置

ALSA 用例配置。参考 ALSA 用例配置 来了解更详细信息。 ALSA 用例配置 用例配置文件使用 配置文件 语法来定义静态配置树。该树在运行时根据配置树中的条件和动态变量进行评估(修改)。使用 用例接口 API 解析结果并将其导出到应用程序。 配置目录和主…

LeetCode1143最长公共子序列

题目描述 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符&#xff08…

贪心算法-数组跳跃游戏(mid)

目录 一、问题描述 二、解题思路 1.回溯法 2.贪心算法 三、代码实现 1.回溯法实现 2.贪心算法实现 四、刷题链接 一、问题描述 二、解题思路 1.回溯法 使用递归的方式,找到所有可能的走步方式,并记录递归深度(也就是走步次数&#x…

Vue3_对接腾讯云COS_大文件分片上传和下载

目录 一、腾讯云后台配置 二、安装SDK 1.script 引入方式 2.webpack 引入方式 三、文件上传 1.new COS 实例 2.上传文件 四、文件下载 腾讯云官方文档: 腾讯云官方文档https://cloud.tencent.com/document/product/436/11459 一、腾讯云后台配置 1.登录 对…

成都跃享未来教育咨询有限公司,值得信赖!

在浩渺的教育咨询市场中,成都跃享未来教育咨询有限公司以其独特的魅力和卓越的服务质量,成为了行业内的璀璨明星。作为一家致力于为学生提供全方位教育咨询服务的公司,成都跃享未来教育咨询有限公司始终坚持安全可靠的原则,为广大…

【vue2新增页面跳转列表页,当前页面不会刷新问题,有效果的点个赞嗷】

文章目录 概要案例解决方法小结 概要 开发中遇到的罕有需求,一般来说切换路由页面就会重新渲染,相应接口也会自动刷新。但是有些需求新增页面是走路由的,关闭心中页会关闭当前面包屑,返回上一个,所以这时候由于之前列…

Proxyman 现代直观的 HTTP 调试代理应用程序

Proxyman 是一款现代而直观的 HTTP 调试代理应用程序,它的功能强大,使您可以轻松捕获、检查和操作 HTTP(s) 流量。不再让繁杂的网络调试工具阻碍您的工作,使用 Proxyman,您将轻松应对网络调试的挑战。 下载地址:https…

Allure在jenkins中无法显示的问题

jenkins中使用allure生成报告需要注意工作环境和路径的配置 前提条件: jenkins容器中已安装jdk和allure jenkins中配置全局工具环境: 项目中配置allure路径: 路径来源: Path需要选择相对路径的allure-report、allure-results

Mintegral解析休闲游戏如何靠创意素材吸引玩家

核心玩法简单清晰、容易让人无限上头的休闲游戏,玩法机制一般比较明确、简单,如果要在短时间内吸引玩家注意,除了完整展示游戏流程以外,开发者需要在素材中设置更多亮点性的内容,如吸睛的剧情、爆炸性的视听效果等元素…

033.搜索旋转排序数组

题意 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给方法之前&#xff0c;nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&…

暴雨推出基于英特尔® 至强® 6 能效核处理服务器

随着人工智能技术的快速发展&#xff0c;大模型的应用越来越广泛。据预测&#xff0c;到2024年年底&#xff0c;我国将有5%-8%的企业大模型参数从千亿级跃升至万亿级&#xff0c;算力需求增速将达到320%&#xff0c;这进一步推动了数据中心的持续变革。 超凡性能&#xff0c;绿…

WebGIS常用技术体系记录

1、数据下载 &#xff08;1&#xff09;OSM下载开源矢量数据&#xff0c;数据较全&#xff0c;但是质量一般&#xff1b; &#xff08;2&#xff09;地理空间数据云下载DEM影像&#xff1b; &#xff08;3&#xff09;datav下载行政区 http://datav.aliyun.com/tools/atlas/…

《十八岁出门远行》世界很小,案牍劳形;世界很大,日短心长

《十八岁出门远行》世界很小&#xff0c;案牍劳形&#xff1b;世界很大&#xff0c;日短心长 余华&#xff0c;作家&#xff0c;著有《在细雨中呼喊》《活着》《文城》《兄弟》等。 文章目录 《十八岁出门远行》世界很小&#xff0c;案牍劳形&#xff1b;世界很大&#xff0c;日…

黄金票据~

一. 黄金票据原理 黄金票据一般是伪造的TGT,生成这个TGT&#xff0c;不需要和KDC进行校验&#xff0c;金票可以在本地直接生成&#xff0c;生成的的金票在非域机器和域内机器都可以使用 黄金票据的作用&#xff1a; 可以用来权限维持 可以用来横向移动二. 利用条件 1. 必须…

C++基础与深度解析 | 类与面向对象编程 | 数据成员 | 成员函数 | 访问限定符与友元 | 构造、析构成员函数 | 字面值类、成员指针与bind交互

文章目录 一、结构体与对象聚合二、成员函数&#xff08;方法&#xff09;三、访问限定符与友元1.访问限定符2.友元&#xff08;慎用&#xff09; 四、构造、析构与复制成员函数1.构造函数2.析构函数3.补充 五、字面值类&#xff0c;成员指针与bind交互1.字面值类2.成员指针3.b…

【小白专用 已验证24.6.7】C# MySQL数据库访问操作封装类

一、底层库介绍 本文主要介绍数据库访问操作类&#xff0c;包含&#xff1a;SQL插入脚本、SQL查询脚本、数据库表是否存在判断、带参脚本执行、包含事务回滚脚本执行、存储过程脚本等等。 特殊说明 在使用之前&#xff0c;先安装 MySql.Data 插件 二、底层库源码 2.1 程序源…

android antirollback verno 获取方法

ReadRollbackIndex.exe 获取 调查avbVBMeta结构体 typedef struct AvbVBMetaImageHeader { /* 0: Four bytes equal to "AVB0" (AVB_MAGIC). */ uint8_t magic[AVB_MAGIC_LEN]; /* 4: The major version of libavb required for this header. */ uint32_t…

Linux shell编程学习笔记53: nproc命令:当前进程可以使用 cpu的数量

0 前言 2024年的网络安全检查又开始了&#xff0c;对于使用基于Linux的国产电脑&#xff0c;我们可以编写一个脚本来收集系统的有关信息。对于中央处理器CPU&#xff0c;我们可以使用cat /proc/cpuinfo和 lscpu命令来收集中央处理器CPU的信息&#xff0c;如果我们只想了解和获…

一个月速刷leetcodeHOT100 day15 彻底搞懂回溯算法 以及相关题目

回溯算法采用试错的思想&#xff0c;它尝试分步的去解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#xff0c;再通过其它的可能的分步解答再次尝试寻找问题的…

JavaSE 实战五子棋中国象棋(单机简易版)

介绍 JavaSE实践五子棋和中国象棋游戏&#xff0c;棋盘&#xff0c;棋子绘制&#xff0c;输赢判定重置棋盘&#xff0c;单机博弈。 五子棋棋盘 中国象棋棋盘 使用说明 启动类 Main.java&#xff0c; 面板类 Panel.java绘制棋盘和玩法&#xff0c;实体类 ChessPiecesNode.jav…