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

开发视频会议系统:使用GPU解码渲染视频的更多相关文章

  1. 开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))

    开源Flex Air版免费激情美女视频聊天室,免费网络远程视频会议系统((Flex,Fms3联合打造))   Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实 ...

  2. 视频会议系统MCU服务器视频传输处理模式

    视频会议系统MCU服务器视频传输处理模式 视频会议系统的组成主要包括终端.MCU服务器.网守等,其中的MCU服务器是整个系统的核心,视频会议系统的性能很大程度取决于MCU服务器的性能,因此MCU服务器 ...

  3. WPF 视频硬解码渲染播放(无空域)(支持4K、8K、高帧率视频)

    MediaWPF 基于 .NET 6 实现视频硬解码渲染Demo(无空域问题) 代码实现仅供学习参考 本项目视频渲染通过显卡进行视频解码,CPU几乎不参与工作,并且不存在令人烦躁的空域问题. 在播放摄 ...

  4. 打造自己的视频会议系统 GGMeeting(附送源码)

    自从在博客园发布广域网即时通信系统GG(QQ高仿版)以来,结识了很多做IM的朋友,然后我和我的伙伴们也接到了很多与IM相关的项目.相比在发布GG之前难以接到项目的状况相比,现在简直太幸福了,虽然做项目 ...

  5. Microsoft Tech Summit 2018 课程简述:利用 Windows 新特性开发出更好的手绘视频应用

    概述 Microsoft Tech Summit 2018 微软技术暨生态大会将于10月24日至27日在上海世博中心举行,这也会是国内举办的最后一届 Tech Summit,2019 年开始会以 Mi ...

  6. 【转】打造自己的视频会议系统 GGMeeting(附送源码)

    原文地址:http://www.cnblogs.com/justnow/p/4487201.html 自从在博客园发布开源即时通信系统GG(QQ高仿版)以来,结识了很多做IM的朋友,然后我和我的伙伴们 ...

  7. 视频流GPU解码在ffempg的实现(一)-基本概念

    这段时间在实现Gpu的视频流解码,遇到了很多的问题. 得到了阿里视频处理专家蔡鼎老师以及英伟达开发季光老师的指导,在这里表示感谢! 基本命令(linux下) 1.查看物理显卡 lspci | grep ...

  8. Qt与FFmpeg联合开发指南(一)——解码(1):功能实现

    前言:对于从未接触过音视频编解码的同学来说,使用FFmpeg的学习曲线恐怕略显陡峭.本人由于工作需要,正好需要在项目中使用.因此特地将开发过程总结下来.只当提供给有兴趣的同学参考和学习. 由于FFmp ...

  9. Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现

    下面随笔将给出Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现,最终的效果是:USB摄像 ...

  10. 使用X264编码yuv格式的视频帧使用ffmpeg解码h264视频帧

    前面一篇博客介绍在centos上搭建点击打开链接ffmpeg及x264开发环境.以下就来问个样例: 1.利用x264库将YUV格式视频文件编码为h264格式视频文件 2.利用ffmpeh库将h264格 ...

随机推荐

  1. (二)asyncio的简单使用,python异步高效处理数据,asyncio.get_event_loop(),loop.run_until_complete(main()),loop.close()

    Asyncio 是一个基于事件循环的异步I/O框架,它提供了高效的协程实现,能够轻松地编写高并发的Python程序.Asyncio 在 Python 3.4 中首次引入,它的核心是事件循环(Event ...

  2. Serverless 极致弹性解构在线游戏行业痛点

    简介: 本文将通过剖析一个个具体的场景案例,以期望给相关的游戏开发同学带来共鸣,同时也希望能给非游戏行业的同学带来一些启发. 一.前言 1. 游戏客户上云关注点 游戏行业是一个富有创意又竞争激烈的市场 ...

  3. 来电科技:基于Flink+Hologres的实时数仓演进之路

    简介: 本文将会讲述共享充电宝开创企业来电科技如何基于Flink+Hologres构建统一数据服务加速的实时数仓 作者:陈健新,来电科技数据仓库开发工程师,目前专注于负责来电科技大数据平台离线和实时架 ...

  4. Flink 1.13,面向流批一体的运行时与 DataStream API 优化

    简介: 在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由 ...

  5. 前端关于获取网络时间的方法api

    淘宝 http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp 苏宁http://quan.suning.com/getSys ...

  6. 习题8 #第8章 Verilog有限状态机设计-3 #Verilog #Quartus #modelsim

    3. 编写一个8路彩灯控制程序,要求彩灯有以下3种演示花型. (1) 8路彩灯同时亮灭: (2) 从左至右逐个亮(每次只有1路亮): (3) 8路彩灯每次4路灯亮,4路灯灭,且亮灭相间,交替亮灭. 在 ...

  7. await this.$nextTick()和this.$nextTick(callback)有什么区别?记一次bug调试

    背景 需要实现一个需求,一个小区业务详情页面,在左侧菜单栏切换了小区后,详情页跟着切换. 这个详情页面是根据url上的/:id来确定小区id的,所以切换了小区后,应该切换路由. 于是这样实现: wat ...

  8. Higress 基于自定义插件访问 Redis

    简介 基于 wasm 机制,Higress 提供了优秀的可扩展性,用户可以基于 Go/C++/Rust 编写 wasm 插件,自定义请求处理逻辑,满足用户的个性化需求,目前插件已经支持 redis 调 ...

  9. .net 记录http请求

    记录http请求 环境 .net7 一.过滤器(Filter) 这个过程用的的是操作过滤器(ActionFilter) 二. 2.1 继承IAsyncActionFilter 2.2 重写OnActi ...

  10. 我用 GitHub 9.8k 的 Go 语言 2D 游戏引擎写了个游戏

    前言 hi,大家好,这里是白泽.今天给大家分享一个 GitHub 9.8k 的 Go 语言 2D 游戏引擎. https://github.com/hajimehoshi/ebiten 引擎的贡献者依 ...