视频会议系统中的GPU解码渲染技术

现在,视频会议系统在远程协同办公和沟通交流中变得非常普遍。如果我们要开发自己的视频会议系统,那么GPU解码渲染技术将变得至关重要。

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

随着对视频图像要求的不断提高,会议中的起步分辨率已达到1280*720,而1920*1080已成标配,2K分辨率也逐渐普及。

然而,高分辨率视频图像的编码、解码和渲染对系统性能消耗极大。

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

视频会议中同时查看多路高清视频图像是基本需求。每一路视频图像都需要解码和渲染,如果这些工作都由CPU来完成(即软解,CPU-based Software Decoding),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,如下代码所示:

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

根据以上修改重新编译OMCS入门Demo客户端后,开始测试工作。

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

此时,我的电脑上的demo客户端aa02接收到aa01的视频图像帧(H264),将对其进行解码,然后在UI上进行渲染。

1. 使用CPU解码渲染视频

首先关闭GPU解码渲染功能,测试CPU的占用情况:

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

我的电脑的CPU型号是 AMD Ryzen 7 4700G with Radeon Graphics,性能相当不错。对于较低性能的CPU,解码和渲染一路1080p的视频,CPU占用率可能会达到20%。

2. 使用GPU解码渲染视频

接下来,我们开启GPU解码渲染功能,观察CPU的占用情况:

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

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

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

标签:游戏攻略