共计 2959 个字符,预计需要花费 8 分钟才能阅读完成。
弹幕穿人性能,能使用户在弹幕刷屏的状况下,又不错过人物画面。因而,弹幕穿人性能一经推出就受到了宽广用户的青睐。
就技术计划而言,弹幕穿人计划能够分为以下两大类:“云端离线人体宰割 + 端侧渲染”和“端侧实时人体宰割 + 端侧渲染”。在这里咱们别离简称为云端计划和端侧计划。
不论是云端计划还是端侧计划,高效的弹幕渲染及弹幕穿人成果的渲染都是其中不可或缺的重要组成部分。
本文次要聚焦在优酷弹幕穿人渲染相干技术介绍,包含弹幕渲染流程、弹幕穿人渲染实现及工程上的优化实际等相干方面。
一. 背景
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。在某一帧视频画面没有人体轮廓数据时,咱们会拿一个 1 ×1 的假数据作为伪 mask,而后去跟弹幕数据做 blend。这样既不会对弹幕画面产生任何影响,也不会减少渲染耗时,从而十分无效解决了频繁切换 render target 导致的性能急剧下降问题。
目前发现的影响弹幕穿人渲染性能的其余问题,咱们也都一一解决了。
**
查看系列文章:
优酷挪动端弹幕穿人架构设计与工程实战总结
PixelAI 挪动端实时人像宰割
四. 参考
**
https://developer.aliyun.com/…
https://www.khronos.org/openg…
https://developer.apple.com/l…
https://developer.apple.com/m…
https://developer.apple.com/d…