技术干货 | WebRTC 视频渲染

技术干货 | WebRTC 视频渲染

导读:WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音对话或视频对话的 API。W3C 和 IETF 在2021年1月26日共同宣布 WebRTC 1.0 定稿,促使 WebRTC 从事实上的互联网通信标准成为了官方标准,其在不同场景的应用将得到更为广泛的普及。WebRTC 提供了视频会议的核心技术,包括音视频的采集、编解码、网络传输、显示等功能,并且还支持跨平台:Windows,Mac,iOS,Android。本文主要介绍各个平台的视频渲染技术。

文|陶金亮

网易云信资深音视频工程师

技术干货 | WebRTC 视频渲染

背景

目前业界还没有关于 WebRTC 各个平台视频渲染技术的总结,同时本人最近主要从事视频后处理超分在移动端落地的相关工作,会涉及到视频渲染模块的联动,因此刚好趁这个机会把相关的知识点进行总结一下,希望能够帮助大家更容易的理解 WebRTC 的视频渲染技术。

技术干货 | WebRTC 视频渲染

内容

 视频 Pipline 流程 

视频渲染需要支持视频采集、视频前处理、视频后处理、视频解码输出的视频格式。

技术干货 | WebRTC 视频渲染

 视频渲染流程 

  • CPU 计算需要显示的内容,然后通过数据总线传给GPU
  • GPU 拿到数据之后开始渲染数据并保存在帧缓存区中
  • 随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示

技术干货 | WebRTC 视频渲染

 视频渲染技术 

1. 平台视频渲染技术介绍

主要介绍 Apple、Google、Microsoft 三大平台在视频渲染方面的支持。

技术干货 | WebRTC 视频渲染

Apple 主要使用早期的 OpenGL 和 最新的 Metal 2种渲染技术,目前 WebRTC 中 iOS 和 Mac 这2个平台都实现了 OpenGL 和 Metal 2种渲染方式。
WWDC 2014 发布了 Metal,仅支持 iOS 8 以及 A7 以上的设备;
WWDC 2015 Metal 支持在 OS X 上运行,2012 之后生产的,系统版本在 El Capitan(10.11)之上的 Mac 设备 ;
WWDC 2016 Metal 性能优化,一些新技术,比如 Tessellation(曲面细分)可用于实现细节层次,高效调整以适应不同材质等。最重要的应该是引入了 Metal Performance Shaders,内置了一系列常用的图像处理 kernel,方便进行图像效果处理 ;
WWDC 2017 发布了 Metal 2。名字上是图形 API 更新,实际上更多是内部实现的优化,以及加入一系列调试工具,API 层面并没有多大改变。硬件方面要求一致,系统版本支持 iOS 11,macOS High Sierra,tvOS 11 ;

WWDC 2018 iOS 12、macOS 10.14 之后弃用 OpenGL ES,系统的一些框架全面改成默认 Metal 支持 ;
WWDC 2019、2020、2021 都有发布关于 Metal 的更新,包括机器学习、计算机视觉、AR/VR 与 Metal 的交互。

  • Android 主要支持 OpenGL 和 Vulkan

在 Android 平台上,GPU 渲染的 API 有两套,一套是 OpenGL-ES,另一套是7.0后推出的 Vulkan。目前 WebRTC 中 Android 平台实现了 OpenGL 的渲染方式,网易云信后期也将考虑支持 Vulkan。
Vulkan 是一个用于图形和计算设备的编程接口,Vulkan 是一个跨平台的 2D 和 3D 绘图应用程序接口(API),较早由科纳斯组织在2015年游戏开发者大会(GDC)上发表。
Vulkan 是用于高性能 3D 图形的低开销、跨平台 API。Vulkan 是 Khronos Group(OpenGL 标准的维护组织)开发的一个新 API,它提供了对现代显卡的一个更好的抽象,与 OpenGL 和 Direct3D 等现有 API 相比,Vulkan 可以更详细的向显卡描述你的应用程序打算做什么,从而可以获得更好的性能和更小的驱动开销。Vulkan 的设计理念与 Direct3D 12 和 Metal 基本类似,但 Vulkan 作为 OpenGL 的替代者,它设计之初就是为了跨平台实现的,可以同时在 Windows、Linux 和 Android 开发。甚至在 Mac OS 系统上,Khronos 也提供了 Vulkan 的 SDK,虽然这个 SDK 底层其实是使用 MoltenVK 实现的。

  • Windows 主要支持 OpenGL、Direct3D 和 Vulkan

在 Windows 平台下的视频播放技术主要有以下三种:GDI、Direct3D 和 OpenGL;包括上面提到的 Vulkan 也支持 Windows 平台。以及早期的 DirectDraw,目前微软已放弃支持。
Direct3D 是微软公司在 Microsoft Windows 系统上开发的一套 3D 绘图 API,是 DirectX 的一部份,目前广为各家显示卡所支持。1995年2月,微软收购了英国的 Rendermorphics 公司,将 RealityLab 2.0 技术发展成 Direct3D 标准,并整合到 Microsoft Windows 中,Direct3D 在 DirectX 3.0 版本中开始出现。后来在 DirectX 8.0 发表时与 DirectDraw 编程介面合并并改名为 DirectX Graphics。Direct3D 与 Windows GDI 是同层级组件。它可以直接调用底层显卡的功能。与 OpenGL 同为电脑绘图软件和电脑游戏最常使用的两套绘图 API。
Simple DirectMedia Layer(SDL)是一个跨平台开发库,主要提供对音频,键盘,鼠标,操纵杆的操作,通过 OpenGL 和 Direct3D 来实现直接访问图像硬件。主要应用在视频播放软件,模拟器和游戏开发。SDL 官方支持 Windows,Mac OS X,Linux,iOS 和 Android。
由于微软想主推 Direct3D,因此微软对于 OpenGL 的支持并不积极。目前 WebRTC 中并没有实现 Windows 平台的渲染,目前网易云信使用的是开源的SDL框架,但由于其太重,因此后期会考虑直接实现 Direct3D。

由以上的介绍可知,目前在终端实现的渲染技术有跨平台的 OpenGL、Vulkan,以及 Apple 平台特有的 Metal、Windows 平台特有的 Direct3D,总共4种渲染方式。

2. 详细介绍视频渲染技术

  • OpenGL 介绍

OpenGL(Open Graphics Library)是一个跨语言、跨平台的编程图形程序接口,它可用于二维、三维图像的渲染,是一个功能强大,调用方便的底层图形库。OpenGL ES(OpenGL for Embedded Systems)是 OpenGL 三维图形 API 的子集,针对手机、Pad 和游戏而设计,去除了很多不必要和性能较低的 API。因此在 iPhone 和 Android 手机上使用的都是 OpenGL ES

什么是 EGL

EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口它的主要作用:

  • 与设备的原生窗口系统通信;
  • 查询绘图表面的可用类型和配置;
  • 创建绘图表面;
  • 在 OpenGL ES 和其他图形渲染 API 之间同步渲染;
  • 管理纹理贴图等渲染资源;

OpenGL ES 的平台无关性正是借助 EGL 实现的,EGL 屏蔽了不同平台的差异

技术干货 | WebRTC 视频渲染

创建 OpenGL 上下文

  • 在 iOS 平台使用 OpenGL ES 做视频渲染时,首先要创建 EAGLContext 对象。因为 EAGLContext 管理着 OpengGL ES 渲染上下文。该上下文中,包括了状态信息,渲染命令以及 OpenGL ES 绘制资源。为了执行 OpenGL ES 命令,你需要将创建的 EAGLContext 设置为当前渲染上下文。EAGLContext 并不直接管理绘制资源,它通过与上下文相关的 EAGLSharegroup 对象来管理。当创建 EAGLContext 时,你可以选择创建一个新的 sharegroup 或与之前创建的 EAGLContext 共享 EAGLSharegroup。

技术干货 | WebRTC 视频渲染

  • 在 macOS 平台下提供 NSOpenGL、CGL 等接口来创建和管理 OpenGL 环境NSOpenGLView 是一个轻量级的 NSView 子类封装,方便地提供了 OpenGL 绘制环境的创建与管理。在其内部维护了 [NSOpenGLPixelFormat] 和 [NSOpenGLContext] 对象,用户可以方便的对其进行访问和管理。
  • 在 Android 平台上开发 OpenGL ES 应用时,类 GLSurfaceView 已经为我们提供了对 Display , Surface , Context 的管理,即 GLSurfaceView 内部实现了对 EGL 的封装可以很方便地利用接口 GLSurfaceView.Renderer 的实现,使用 OpenGL ES API 进行渲染绘制,很大程度上提升了 OpenGL ES 开发的便利性。

创建 OpenGL View

  • 在 iOS 中,有两种展示层,一种是 GLKView,另一种是 CAEAGLLayer。WebRTC 中使用 GLKView 进行展示。GLKit 框架提供了视图和视图控制器类,它们消除了绘制和动画 OpenGL ES 内容所需的设置和维护代码。本 GLKView 类管理 OpenGL ES 的基础设施,为您的绘制代码提供一个场所,GLKViewController 类提供了在 GLKit 视图的 OpenGL ES 内容的流畅的动画渲染循环这些类扩展了用于绘制视图内容和管理视图呈现的标准 UIKit 设计模式。因此,您可以将精力主要集中在 OpenGL ES 渲染代码上,并使您的应用程序快速启动和运行。GLKit 框架还提供了其他特性来简化 OpenGL ES 2.0 和 3.0 的开发。

技术干货 | WebRTC 视频渲染

  • 在macOS平台下提供了NSOpenGLView,在其内部维护了 NSOpenGLPixelFormat 和 NSOpenGLContext 对象。
  • 在 Android 平台下提供 GLSurfaceView,GLSurfaceView 继承了 SurfaceView,实现了 SurfaceHolder.Callback2 接口SurfaceView 在 View 的基础上是创建了独立的 Surface,拥有 SurfaceHolder 来管理它的 Surface,渲染的工作可以不再在主线程中做了。可以通过 SurfaceHolder 得到 Canvas,在单独的线程中,利用 Canvas 绘制需要显示的内容,然后更新到 Surface 上。 GLSurfaceView 主要是在 SurfaceView 的基础上实现了一个 GLThread(EGLContext 创建 GL 环境所在线程即为 GL 线程),绘制的工作直接通过 OpenGL 来进行,绘制的内容默认情况下依旧是绘制到 SurfaceView 所提供的 Surface 上。

具体运用

目前网易云信第二代实时音视频 iOS 和 Mac 的整体渲染框架,如下图:

技术干货 | WebRTC 视频渲染

目前网易云信第二代实时音视频 iOS 和 Mac 的 OpenGL 渲染架构,如下图:

技术干货 | WebRTC 视频渲染

  • Metal介绍

Metal 框架支持 GPU 加速的先进的 3D 图形渲染和并行数据计算Metal 提供了一系列现代化且高效的 API,用于在细粒度和低层次上组织、处理、提交图形绘制指令和并行计算指令,并管理和这些指令相关联的数据和资源。Metal 的一个主要目标是最小化 GPU 执行这些计算时必要的 CPU 开销

Metal 框架提供以下内容:

  • 高效的接口Metal 被设计来消除“隐蔽”的性能瓶颈,比如隐式状态校验。你可以控制 GPU 的异步行为,可以高效的使用多线程特性来并行创建和提交 command buffer。
  • 内存和资源管理机制Metal 框架描述了 buffer 和 texture 对象,这两种对象对应着 GPU 内存的分配。Texture 对象具有特殊的像素格式,并且可以被用作纹理图片或者附件(attachments)。
  • 对图形渲染和并行计算的统一支持Metal 使用同样的数据结构和资源(比如 buffers, textures, and command queues)来支持图形和计算。另外,Metal 还定义了一个相应的着色语言来实现图形渲染着色程序和并行计算程序。Metal 框架允许数据在运行时(runtime interface)、图形着色器(graphics shaders)、并行计算程序(compute functions)之间共享。
  • 预编译的着色器Metal 着色器可以在 Build 阶段连同你的 App 代码被编译,然后在运行时加载。这种工作流提供更好的代码生成以及简单的着色代码的调试(Metal 也支持运行时编译着色器代码)。

MTLCommandBuffer 提供的 Encoder 类型:

  • MTLRenderCommandEncoder ,该类型的 Encoder 为一个渲染 pass 编码 3D 图形渲染指令。
  • MTLComputeCommandEncoder ,该类型的 Encoder 编码并行数据计算任务。
  • MTLBlitCommandEncoder ,该类型的 Encoder 支持在 buffer 和 texture 之间进行简单的拷贝操作,以及类似 mipmap 生成操作。
  • MTLParallelRenderCommandEncoder 对象可以允许一个渲染 pass 被打散成多个子 Encoder 并分配到多个线程进行操作。

多线程 Metal Command Buffers

技术干货 | WebRTC 视频渲染

具体运用

目前网易云信第二代实时音视频 iOS 和 Mac 的 Metal 渲染架构,拓展了纹理输入渲染,如下图:

技术干货 | WebRTC 视频渲染

  • Vulkan 介绍

Vulkan 是一个用于图形和计算设备的编程接口,Vulkan 是一个跨平台的 2D 和 3D 绘图应用程序接口(API)同 OpenGL® 一样,Vulkan™ 也由 Khronos 集团开发。它是 AMD Mantle 的后续版本,继承了前者强大的低开销架构,使软件开发人员能够全面获取 Radeon™ GPU 与多核 CPU 的性能、效率和功能。相对于 OpenGL,Vulkan™ 大幅降低了 CPU 在提供重要特性、性能和影像质量时的“API 开销” (CPU 在分析游戏的硬件需求时所执行的后台工作),而且可以使用通常通过 OpenGL 无法访问的 GPU 硬件特性。
独特的跨 OS 支持:Vulkan™ 能够支持深入硬件底层的控制,为 Windows® 7、Windows® 8.1、Windows® 10 和 Linux® 带来更快的性能和更高的影像质量。Vulkan™API 还提供超高的 OS 兼容性、渲染特性和硬件效率。
自动兼容 GCN 架构目前只有基于 GCN 架构 的 Radeon™ 显卡拥有强大的“异步计算”功能,使显卡得以并行处理 3D 几何图形与计算工作量。

Vulkan 中主要的组件以及它们之间的关系

技术干货 | WebRTC 视频渲染

基本的 Vulkan 编程流程

技术干货 | WebRTC 视频渲染

这个流程和 OpenGL 的使用流程很像,就是找到设备——创建上下文——创建命令队列——准备任务——发送执行。

Vulkan 的窗口系统

技术干货 | WebRTC 视频渲染

注意到,在移动设备上使用 OpenGL 时,我们必须通过 EGL 的 API 先准备好 Surface 和 Context,而在 Vulkan 标准里面,WSI 只是为Command Buffer 提供了 VkFrameBuffer,这个是图形渲染的输出。

  • Direct3D 介绍

Direct3D 是一种低级别的 API,用于通过呈现管道绘制基元,或用于通过计算着色器执行并行操作
Direct3D 9.0 使用 HLSL(全称 High Level Shading Language)编写 Vertex Shader 和 Pixel Shader,有助于着色器的编写和所产生代码的效率,并且大幅地缩短设计时间
Direct3D 10 着眼在高级绘图程序,全新的 graphics pipeline;新的 resource type: constant buffer、texture array。Texture array 可容许非常多 512 个 Texture;resource 引进 view 的概念;guaranteed  feature set;GPU 呈现多任务(multitasking)。

Direct3D 11 新增以下的功能:镶嵌(Tessellation, 即曲面细分);多线程渲染(Multithread Render); 计算着色器(Compute Shader),支持 GPGPU,提供新版 HLSL 语言,与 nVidia 的 CUDA 或 OpenCL 功能类似。其他还有面向对象化的 Shader Model 5 等功能。之前 DirectX 10 还是单线程,文件访问与绘图指令共用同一个线程,容易造成画面迟缓的现象与 DirectX 10 相比,Direct3D 11 有了更好的解决方案。DirectX 11 的 pipeline 新增 Hull Shader、Tessellator、Domain Shader 来实现 tessellation, 可以快速让成像 3D 的小三角型快速增加。至于 Computer ShadeWindows U 的实现,以 GPU 的平行处理能力与浮点运算能力来实现 CPU 的运算,能够同时支持 ATI 以及 Nvidia 的显卡,不受绘图流程的限制。DirectX11 还支持 Intel 的支持 Ray Tracing(光线跟踪)与 Rasterization(光栅化)技术,使 3D 效果更真实,更加逼真。

D3D11.1 图形流水线
技术干货 | WebRTC 视频渲染

《Direct3D 11.3 Functional Specification》
D3D11.1 计算流水线
技术干货 | WebRTC 视频渲染《Direct3D 11.3 Functional Specification》

技术干货 | WebRTC 视频渲染总结
随着 AR/VR 的发展,对高效的视频渲染技术提出了更高的要求Apple 在 WWDC 2018 上宣称 iOS 12、macOS 10.14 之后弃用 OpenGL ES,系统的一些框架全面改成默认 Metal 支持;以及多家硬件厂商(高通、英伟达等)都致力于打造新一代渲染技术 Vulkan,包括谷歌也已经明确 Android 会支持  Vulkan;而微软一直努力开发 Direct3D。Vulkan、Metal、Direct3D 其三者背后设计的理念都是一致的,都是朝着高性能的图形渲染技术发展。并行计算架构、可扩展的渲染管线、GPU 驱动的渲染管线都将是发展的重要方向因此我认为此后的发展必将形成一个三足鼎立的态势。

作者介绍
陶金亮,网易云信资深音视频客户端开发工程师;2016年2月加入网易,2017年8月加入网易云信团队,负责直播、短视频、IM、RTC SDK 的开发工作。

文章标题:技术干货 | WebRTC 视频渲染,本文转载自网易智慧企业技术+,原文链接:https://mp.weixin.qq.com/s/GysEvZH8AgMKjPHN96roBg,本文观点不代表Worktile社区立场。如有侵权,请联系chengfeifei@worktile.com删除

(3)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企认证作者
上一篇 2022年3月9日 下午2:02
下一篇 2022年3月11日 上午10:23

相关推荐

  • 项目内部如何管理员工工资

    项目内部管理员工工资不仅需要精细化管理策略,还需依托于高效的信息系统支撑。精确掌握员工工作量、明确薪资政策、应用科技手段、确保法规遵循是实现有效管理的关键。尤其确保法规遵循,这一点不仅保障了员工权益,也是企业合规经营的基础,避免了因薪资问题引发的法律风险。 一、精确掌握员工工作量 为了公平、合理地分…

    2024年4月11日
    5500
  • 为什么使用规则引擎

    规则引擎可以简化业务架构,让开发人员更容易理解业务逻辑,并在一个开发环境中提供一致易用的工具。降低开发人员使用复杂代码的难度;降低数据录入工作量;优化功能代码实现,提高开发效率;灵活扩展应用程序功能,快速上线新功能;增加应用程序的灵活性。 一、什么是规则引擎 定义:是指对业务系统的规则进行抽象,使之…

    2023年7月28日
    62900
  • 如何建立有效的员工反馈机制

    建立有效的员工反馈机制关键步骤包括:1、设立明确的反馈目的;2、创建开放的反馈文化;3、使用多元化的反馈渠道;4、确保反馈的及时性和准确性;5、采取行动并跟进反馈。其中,创建开放的反馈文化特别重要,这有助于鼓励员工积极表达观点和感受,以便及时发现和解决问题。有效的员工反馈机制不仅能促进员工与管理层的…

    2023年8月21日
    1.2K00
  • DevOps如何提高应用程序的自动化故障排查和修复

    DevOps实践通过整合开发与运维流程,使自动化故障排查及修复成为可能。1、集成监控工具、2、采用持续集成/持续部署(CI/CD)、3、实施基础设施即代码(IaC)、4、利用自动化测试与部署等策略是实现这一目标的关键。强调自动化测试与部署,DevOps推动的自动化不仅加速了从开发到部署的流程,还增强…

    2024年1月18日
    20900
  • 程序中的映射是什么

    在计算机程序中,映射(mapping)是一种将一个数据集合中的每个元素(称为“键”)都对应到另一个集合中的唯一元素(称为“值”)的方法。这种对应关系可以用键值对(key-value pair)的形式表示,其中每个键对应一个值。 在计算机程序中,映射(mapping)是一种将一个数据集合中的每个元素(…

    2023年2月28日
    1.6K00
  • 泛微oa系统维护

    泛微OA系统维护涉及多层面操作,如1、定期数据备份、2、系统更新与补丁应用、3、用户权限审查与管理、4、服务器性能监测、5、网络安全防护,每一环节均需精细操作确保系统的平稳运行。特别在2、系统更新与补丁应用方面,维护人员应留意软件发布的更新通知,及时下载和安装最新的补丁,此过程中验证更新的兼容性和稳…

    2024年1月15日
    34000
  • oa控件下载

    标题:探讨OA控件下载的流程与注意事项 OA控件下载涉及诸多步骤与环节。1、确保网站安全性,避免恶意软件或病毒侵入系统。2、检查系统兼容性,保证控件与操作系统或浏览器的匹配。3、依从正确安装指引,防止安装过程中出现错误导致控件失效。4、进行必要的系统配置,如设定信任等级,确保控件正常运行。在这些环节…

    2024年1月16日
    19400
  • 如何在产品生命周期中进行市场定位的调整

    市场定位在产品生命周期阶段会根据市场环境、竞争状况以及消费者偏好的变化进行不同程度的调整。 1、在产品引入阶段,市场定位应侧重于创新特性的宣传以吸引早期采纳者;2、成长期则转向强化品牌识别度和市场占有率;3、成熟期需要重点维护客户忠诚度,防止市场份额流失;4、衰退期定位调整旨在寻找新的市场尼奇或逐步…

    2024年1月19日
    56700
  • 如何选择最适合你的团队的DevOps工具

    选择最适合团队的DevOps工具,关键在于确定团队特定需求并考量工具的多个核心指标。主要包括:适应性、集成性、用户友好性、安全性和成本效益。首先,工具需要有良好的适应性,以便能够与现存系统和流程无缝对接。其次,强调工具间的集成性,用以确保连贯的工作流程并促进团队协作。用户友好性考虑的是工具的易用性,…

    2023年11月18日
    22800
  • 国产化oa系统

    国产化OA系统是解决企业内部日常办公自动化的有效手段,关键性因素包括:1、数据安全性增强;2、满足本土化需求;3、提高办公效率;4、成本控制优势明显。 其中,数据安全性增强 是国产化OA系统中最受关注的优势。本土开发的系统可以更好地遵循国家法律法规,针对本国企业的安全管理需要定制各种安全策略,包括但…

    2024年1月12日
    22300

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部