优酷弹幕穿人「渲染技术」揭秘

article/2025/10/11 8:30:17

弹幕穿人功能,能使用户在弹幕刷屏的情况下,又不错过人物画面。因此,弹幕穿人功能一经推出就受到了广大用户的喜爱。
就技术方案而言,弹幕穿人方案可以分为以下两大类:“云端离线人体分割+端侧渲染”和“端侧实时人体分割+端侧渲染”。在这里我们分别简称为云端方案和端侧方案。
不管是云端方案还是端侧方案,高效的弹幕渲染及弹幕穿人效果的渲染都是其中不可或缺的重要组成部分。
本文主要聚焦在优酷弹幕穿人渲染相关技术介绍,包括弹幕渲染流程、弹幕穿人渲染实现及工程上的优化实践等相关方面。

一. 背景

1 弹幕穿人效果
我们先体验一下目前在优酷主客上已经上线的弹幕穿人效果。
(1)截图:
在这里插入图片描述

通过截图我们可以看出,整体人物穿透的效果处理上很赞,肩膀和胳膊边缘、特别是发丝等细节处的处理都非常细腻。

(2)录屏:
在这里插入图片描述

在这里插入图片描述

通过录屏我们可以看到,弹幕穿人的效果把整个视频画面分为了3个层次:人物在最外层,中间一层是弹幕,最里面一层是视频画面背景。这样给人一种很好的观影沉浸感,能有效提升在满屏弹幕下的观影体验。

2 弹幕穿人方案介绍
2.1 云端弹幕穿人方案

整体流程如下云端和移动端两大部分:
在这里插入图片描述

2.1.1 云端
主要完成人体图像分割数据的生产和部署:算法同学提供AI算法,部署到云端服务器上,针对需要穿人效果的剧进行离线人体模板数据生产。然后将生产出来的模板数据对接到ups服务中,成为ups的一个节点。这样,端侧在播放对应视频时,同步请求ups对应节点拿到对应的模板数据资源链接,就可以做后续的下载、解码、弹幕穿人等相关的处理来完成弹幕穿人的效果了。
2.1.2 移动端
分为两块:
(1). MetaPipe:
MetaPipe是端智能算法的集大成者。对应弹幕穿人场景,MetaPipe完成模板数据的下载、解析和解码等工作,对接OPR吐出对应pts的人体分割模板数据。
(2). OPR渲染:
OPR渲染主要完成人体分割模板数据的获取、弹幕及模板数据的渲染等工作,从而实现弹幕穿人的效果。具体实现细节后续章节会详细介绍。
2.2 端侧弹幕穿人方案
在这里插入图片描述

端侧弹幕穿人是纯端侧方案,相较于云端方案的显著优势是实时(能适用于直播等实时场景),生产成本低,并且在视频介质发生变化时不用重新生产(云端方案必须重新生产)。
简单介绍一下端侧弹幕穿人流程:
端侧在video正常渲染的同时,截取视频帧画面,送给OPR端智能模块去做数据处理。对应弹幕穿人这种场景,端智能算法负责实时完成人体图像分割,生成人体分割模板数据。最后将当前帧的人体分割模板数据送给OPR弹幕渲染模块去做穿人效果的渲染。

2.3 弹幕穿人在移动端的基本要求
弹幕穿人作为一个新的互动形态,弹幕在渲染每一帧的时候,都会涉及大量的运算,特别是纯端侧方案场景更是如此(高效截取视频帧画面,人体检测,弹幕及穿人效果渲染等等)。
弹幕穿人要能在移动端落地产品化,需要满足以下两个条件:
(1)穿人效果要能得到保证,不能出现错位、偏移、穿人弹幕画面频繁闪烁等影响观感的情况发生,这样才能给用户很好的观感和用户体验。
(2)不能因为引入新的计算量而产生弹幕卡顿、抖动、闪烁等不良影响,不能出现系统资源包括CPU/GPU和内存占用等增长过多,否则影响视频画面观感效果,那就是舍本逐末了!

二. 优酷弹幕穿人渲染技术

1 弹幕渲染技术
弹幕的渲染可以通过canvas来完成(比如著名的开源框架烈焰弹幕使),也可以通过opengl/metal在GPU中来完成。
为了更好的渲染性能,优酷移动端弹幕的渲染全部通过opengl/metal在GPU中完成。
2 弹幕穿人渲染技术
2.1 简单流程图

在这里插入图片描述

整体流程如下:
opr拿到当前视频帧的人体轮廓数据,上传到GPU中去做blur,然后把blur后的数据作为alpha通道去跟弹幕纹理做blend,就能得到穿人效果,最后上屏。
2.2 实现细节
2.2.1 架构图

在这里插入图片描述

2.2.2 实现步骤
(1)OPR针对当前video的pts拿到人体轮廓mask数据(无论是云端方案从MetaPipe获取还是端侧方案从OPR端智能模块实时获取的),先把纹理数据上传到GPU。
弹幕穿人轮廓数据,RLE解码后就是0和255(二值数据更利于做RLE编码,编码出来的数据更小),如下图所示:

在这里插入图片描述

这个数据对应如下画面:
在这里插入图片描述

(2) 在GPU里通过shader实现上下及左右各5个像素做gaussian blur,这样做有两个好处:
a.主体mask数据没有变化,但边缘处会更平滑、不会那么突兀,锯齿感也会抹平。
b.会增加mask数据的容错性,如果检测出来的人体轮廓有些许偏差,blur处理后会使偏差看起来没那么明显。
在这里插入图片描述

(3) 将blur后的mask纹理作为alpha通道,去跟弹幕的纹理做一次blend。针对每一个点去调整弹幕内容的alpha值,从而达到人体部分的穿透效果。
(4) 最后将blend之后的数据上屏,得到最终的穿人效果如下图:
在这里插入图片描述

三. 工程上的优化

要达到一个最优的显示效果,在产品中落地,工程上要做大量的优化。2018年优酷也有团队做过尝试,当时遇到的种种问题最终没能上线。
这些问题我们在落地过程中也都遇到,并都解决掉了。下面举几个例子:
1 人体边缘突兀、不自然在这里插入图片描述

可以看一下上面截图,由于边缘处没有处理好,导致人物头发、眼部的弹幕文字显得特别突兀不自然。
2 视频与弹幕宽高比不同时导致弹幕mask错位

在这里插入图片描述

如上图所示,弹幕是全屏的,视频画面会根据视频的宽高比等比缩放,一般左右两端或上下两端会留黑。如果拿到视频的人体轮廓数据直接往全屏弹幕上贴的话,产生的就是上图效果,弹幕mask错位。
所以,每一帧人体轮廓数据,我们不能直接贴到弹幕上去做blend,而需要根据两者的尺寸比例差去调整贴图的坐标。
3 性能相关问题
弹幕对性能非常敏感。好多因素会导致弹幕渲染性能的下降,频繁切换render target是导致渲染性能急剧下降的主要因素之一。我们以这一因素为例讲解一下我们是如何做优化的。
由于不是每一帧都有轮廓数据,在没有轮廓数据时,弹幕需要直接上屏,这时就会涉及render target的频繁改变。由于每一次改变,相当于一次render pipeline的重建,对性能会有一定的损耗。render target的频繁改变会导致渲染性能的急剧下降,从而产生弹幕画面卡顿、抖动等现象。
为了解决这一难题,我们采用一种比较tricky的做法:针对需要做弹幕穿人的场景,我们把渲染管线固定为一直有弹幕穿人的mask。在某一帧视频画面没有人体轮廓数据时,我们会拿一个1x1的假数据作为伪mask,然后去跟弹幕数据做blend。这样既不会对弹幕画面产生任何影响,也不会增加渲染耗时,从而非常有效解决了频繁切换render target导致的性能急剧下降问题。
目前发现的影响弹幕穿人渲染性能的其他问题,我们也都一一解决了。

**
查看系列文章:
优酷移动端弹幕穿人架构设计与工程实战总结
PixelAI移动端实时人像分割

四. 参考

**
https://developer.aliyun.com/article/829886
https://www.khronos.org/opengles/resources
https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/Introduction/Introduction.html
https://developer.apple.com/metal/
https://developer.apple.com/documentation/metal?language=objc


http://chatgpt.dhexx.cn/article/vWqThLRm.shtml

相关文章

学习笔记:RTC时钟

学习笔记:RTC时钟 1.什么是RTC (1) RTC是个独立的定时器。RTC拥有一个连续计数的计数器。 (2)注意:RTC模块和时钟配置系统(RCC_BDCR寄存器)工作在后备区域,系统断电或者复位不会影响RTC的设置和事件&…

STM32-RTC实时时钟

RTC实时时钟 RTC(Real Time Clock)是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄…

STM32的RTC时钟的获取

STM32的RTC时钟的获取 硬件 1.STM32F103RCT6最小系统板(mini) 2.下载器(我这里使用的ST-linkV2) 3.纽扣电池 软件 1.keil5 (MDK) 2.STM32CuBe MX(因为比较方便嘛,其实也可以拖库&…

STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一、STM32CubeMX RTC配置二、RTC初始化三、RTC日期掉电不更新(F1...这里暂时只考虑F103,其他系列未测…

STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能

STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能 目录 STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能(一)工程配置(二)代码编写(三)运行效果 本章实现效果: RTC时钟获取周期…

STM32G4之RTC实时时钟

文章目录 前言一、RTC介绍二、STM32CubeMX配置三、部分源码总结 前言 一、RTC介绍 STM32 的 RTC 外设(Real Time Clock) ,实质是一个掉电后还继续运行的定时器。STM32G4 的 RTC,是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历…

什么是RCT实时时钟?(STM32中RTC时钟源)

什么是RCT(Real Time Clock,实时时钟)? 一、RTC时钟简介 RTC(Real Time Clock,实时时钟)是指安装在电子设备或实现其功能的IC(集成电路)上的时钟,一般会是集成电路&am…

STM32:RTC实时时钟原理

RTC (Real Time Clock):实时时钟 RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。 两个32位寄存器包含二进码十进制格式…

STM32物联网项目-RTC时钟

RTC时钟 RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系…

十九、RTC实时时钟

一、.RTC实时时钟工作框图 RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动,用来与 APB1 总线连接。 RTC_PRL设置100&a…

STM32 RTC时钟读取时间

文章目录 一、RTC简介1.1 RTC1.2 RTC特征1.3 RTC原理框图1.4 RTC工作流程1.5 RTC时钟选择1.6 RTC复位过程1.7 RTC中断 二、CubeMX配置2.1 RCC配置2.2 SYS配置2.3 RTC配置2.4 串口配置2.5 时钟配置2.6 生成项目代码 三、代码编写3.1 重写printf3.2 RTC_HAL库函数/*设置系统时间*…

STM32 RTC实时时钟

我用的是STM32库函数:两个知识点: 一、RTC时钟框图分析(重要) 二、时间是怎样显示出来的(简析) 一、RTC时钟框图分析(重要) 先熟悉一下几个知识点: …

STM32之RTC时钟,闹钟,日历

RTC时钟的一些功能介绍 RTC时钟即实时时钟,它提供了用于管理所有低功耗模式的自动唤醒单元,还提供了具有可编程闹钟中断功能的日历时钟/日历。 并且可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时…

深入学习RTC时钟库 DS1302

❤️博主介绍❤️ 😬 作者:单片机菜鸟哥 👉火爆博客:ESP8266 Arduino教程 零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇…

深入学习 RTC时钟库 DS3231

❤️博主介绍❤️ 😬 作者:单片机菜鸟哥 👉火爆博客:ESP8266 Arduino教程 零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇…

rtc时钟

一、设计效果 配置RTC时钟,初始化为2000年1月1日00:00:00;通过RTC时钟秒中断串口每秒打印一次当前时刻,并切换一次流水灯状态;配置闹铃为10:00:05,在闹铃中断中每秒切换一次蜂鸣器状态闹铃,直到按KEY1关闭…

RTC时钟实现实时日历

文章目录 1、RTC时钟简介1.2、初识RTC1.2、相关寄存器 2、创建项目23、完善代码4、总结 1、RTC时钟简介 1.2、初识RTC 1、简介: RTC—real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使…

STM32之RTC时钟

前言 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求: 1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒; 2)将RTC时间调整为…

【STM32】HAL库 STM32CubeMX教程十三---RTC时钟

前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软…

【STM32】详解RTC实时时钟的概念和配置示例代码

一、什么是RTC RTC(Real-time Clock):实时时钟,本质上是一个支持BCD编码的定时器/计数器。主电源断电后能够由电池供电,使其时钟跳转依然正常。 二、STM32F4芯片内的RTC功能 ①日历时钟(时分秒、年月日、星期) ②两个闹…