共计 6444 个字符,预计需要花费 17 分钟才能阅读完成。
关注「Shopee 技术团队」公众号,摸索更多 Shopee 技术实际
目录
1. 背景
2. Shopee 视频技术落地产品
3. Shopee 视频相干后盾服务
3.1 直播 / 点播转码
3.2 直播连麦
3.3 多人会议混流
3.4 视频后盾编辑
4. 高清低码
4.1 视频解决的个别流程
4.2 Shopee 高清低码优化计划
5. 性能优化
5.1 编码器端上优化
5.2 一入多出编码
东南亚各市场的网络环境复杂多变、差别极大,如何在无限网络条件下提供稳固、高清的视频体验是咱们面临的一大挑战。基于此,本次分享将介绍 Shopee 在东南亚视频业务落地上的计划,在画质晋升上做出的致力,以及一些性能晋升老本管制方面的优化。
在 8 月 6 日举办的 LiveVideoStack 2022 上海站中,Shopee 视频技术团队负责人 Zhixing 分享了 Shopee 视频解决技术的后盾利用,本文依据演讲内容整顿而成。
1. 背景
随着 Shopee 电商业务在东南亚等市场开展,视频和电商联合的利用迅速落地。然而,当地许多用户应用的手机配置无限,这些手机在视频编解码、图像处理方面存在不小的性能瓶颈。
并且,当地网络基础设施建设还不太欠缺,在这样的网络条件下,如何稳固且高质量地传输媒体数据成为一大挑战。
另外,海量的视频文件和直播视频解决也给 Shopee 后盾带来了微小的压力。那么 Shopee 是如何通过技术手段来解决这一系列问题的呢?
本次分享的内容大抵分为四个局部:第一局部是 Shopee 视频相干的产品介绍;第二局部是 Shopee 视频业务后盾的技术计划;第三局部是 Shopee 高清低码转码技术,以及 RTC 场景视频编码技术;第四局部是咱们在性能晋升和节俭算力老本上做的一些优化。
2. Shopee 视频技术落地产品
先来看看 Shopee 有哪些与视频相干的产品。
作为电商平台,Shopee App 是咱们的次要业务,涵盖了 feeds 流、直播带货、点播等视频类服务。其中,短视频服务 Shopee Video 目前也曾经在东南亚个别市场上线。
Shopee 的数字银行业务 SeaBank 在局部场景下也用到了视频服务,例如在线开户环节。用户发动开户申请,客服接听,通过视频画面在线认证身份信息。
此外,公司外部的通信工具 SeaTalk 也打算在语音通信性能的根底上,新增视频会议能力。
3. Shopee 视频相干后盾服务
针对上述利用,咱们开发了哪些视频相干的后盾服务呢?
3.1 直播 / 点播转码
首先是 Shopee App 的转码服务,波及点播和直播转码两个转码平台。有一些 AI 加强类的前置解决,一帧耗时比拟长,对于点播业务来说,这不是什么问题,只是转码耗时增长。而对于直播业务来说,就须要思考效率问题了,比方帧率 30,最多一帧只能耗时 33ms,如果串行进行所有前置解决,就会使得出帧帧率小于输出帧率,导致视频帧沉积的问题。
于是,咱们设计了流水线的视频解决架构,将耗时较短、不影响主流程的解决节点放在同一个 region 中,串行解决,耗时长的节点独自一个 region,region 与 region 之间并行执行,两头通过队列通信。这样,只须要任意一个解决节点耗时保障在帧 duration 范畴内,就能满足业务要求。
咱们能够看到两头这张黑白的示意图,如果是串行解决,每一帧的耗时就等于每一个节点耗时相加。然而流水线解决的话,每一帧的耗时取决于耗时最大的解决节点。
上图为 Shopee 的直播 / 点播转码服务架构图。点播转码集群分为外部 Prado 容器集群和云主机集群,MMS 点播平台是咱们的上游服务,该平台能够依据负载自在调度,抉择应用 Prado 转码或是云主机转码。
说个题外话,为什么这里会有两种集群?近两年因为疫情,服务器洽购比拟艰难,于是公司的 SRE 倡议咱们,这类对数据安全性要求没有特地高的服务能够切到云主机,以放慢业务落地。
对于转码后的视频画面质量,咱们也有外部的画质数据平台 AWCY,提供编码画质监控能力。
3.2 直播连麦
上图是 Shopee App 的直播连麦服务架构。连麦单方通过 RTC-SFU 服务通信,观众通过 HTTP-FLV 观看直播。
这里值得注意的是,通常云厂商为了后盾的稳定性,将连麦服务的逻辑简单化了,不论房间是否有连麦主播,都采纳转码的形式解决视频流。而既然有转码,就波及到视频编码环节,若只有一路主播的时候也转码,会节约大量算力资源。
为了节俭计算资源,Shopee 主播视频采纳了 H.264 编码。在单个主播的时候,咱们采纳间接转封装的形式解决主播的视频;当有连麦者接入的时候,采纳混流转码的形式解决视频;连麦者来到后,再次返回到转封模式。
而 MCU 后盾解决了这种模式之间交替切换的问题,通过缓存 GOP 的形式解决从单主播切换到连麦模式的场景,通过期待新的 GOP 的形式解决从连麦模式切换到单人模式的场景。
线上大部分时候,在房间只有单个主播的场景下,CPU 的均匀负载较低,大大提高了集群的并发能力。单台机器如果进行转码,最多反对 20 路主播;如果不进行转码,目前通过压测数据来看,至多反对 200 路主播转发。
这一套计划也用于 SeaBank 在线开户零碎,对开户通话过程进行录制。区别在于 SeaBank 零碎只有混流模式。
3.3 多人会议混流
对于 Shopee 外部通信软件 SeaTalk,咱们提供了多人会议混流服务作为技术能力储备(目前该性能还未上线),混流模块中嵌入了开源软件 OWT 和 mediasoupclient 的外围模块,并且在 OWT 模块上减少了 3 帧的缓存队列,以平滑混流视频帧。会议混流零碎反对 RTMP 和 WebRTC 接入。
3.4 视频后盾编辑
针对 Shopee 的短视频产品 Shopee Video,咱们开发了一套后盾编辑服务,用于实现一些 2D 特效,例如图片序列转视频、增加背景音乐、画面切割、文字动画、视频转场、背景含糊等。目前通过 CPU 执行 Xvfb 虚构显存的形式实现 gltransition 的转场成果。
4. 高清低码
随着 Shopee App 中带货直播业务量逐步增长,晋升直播用户画质体验的需要也日益强烈。另一方面,在东南亚的网络条件下,直播分辨率很多还是 360p 或 270p,码率 300-500k。
起初,大部分 Shopee 带货主播流没有转码,为了适配直播观众上行错落不同的网络状况,主播甚至用更低的分辨率和码率开播,来进步观众侧的晦涩度,当然这种做法以就义清晰度为代价。
在思考用户观看体验,并综合视频转码老本等多种因素后,Shopee 决定投入自研视频转码业务。与业界常见做法相似,Shopee 的直播转码也分为一般转码和高清低码转码。
一般直播转码集群用 NVIDIA T4 显卡硬编码,来反对更多直播转码。测试数据显示,直播带货场景下,一张 NVIDIA T4 显卡能编码 30 路,相较于 CPU 老本有肯定劣势。另外一部分是高清低码转码,应用 CPU 转码,编码器是基于 x264 优化后的版本。
上图是 Shopee 直播高清低码和云厂商高清低码的画质比照,右边能够看进去 Shopee 转码画质显著优于云厂商 A,和左边的云厂商 B 相比,在块效应的解决上也有轻微劣势。那么 Shopee 的高清低码转码是如何做到的呢?
4.1 视频解决的个别流程
先来大略理解一下视频转码须要通过哪些环节:
- 第一步解码失去 YUV 画面数据;
- 而后通过前置解决,蕴含了 ROI 背景 gblur 滤波、锐化、AI 加强;
- 接着将 YUV 数据送进编码器,进入预编码环节,次要步骤是下采样、Scenecut 关键帧判断,帧类型决策、AC 能量值计算、MBTree 等;
- 下一步进入编码环节,包含帧内 / 帧间预测编码、RDO、Deblocking、参考帧治理等步骤;
- 最初就是进入量化和熵编码环节,最终输入 NALU 单元。
下面步骤中蓝色局部是 Shopee 在 x264 根底上做过优化的节点,接下来会一一解说。
4.2 Shopee 高清低码优化计划
4.2.1 前置解决
1)CDEF 算法
在前置解决时,参考 AV1 中实现的 CDEF 算法,抽出来作为一个 FFmpeg 滤镜,该算法次要用于解决因为适度压缩导致的物体边缘振铃效应。通过该滤波算法之后,画面中的物体边缘会更加平滑。
CDEF 大抵能够了解为首先计算以后 8×8 的块在预设的八个方向块上的残差,抉择残差最小的作为确定的角度方向,而后找到对应的角度方向矩阵进行滤波。图中最左边是滤波后的成果,能够看到树枝的边缘更加平滑了。
2)3D 降噪
常见的传统降噪算法 FFmpeg 中也有一些滤镜实现,比方 hqdn3d、bm3d 等。hqdn3d 参考的点较少,静止激烈时成果不佳。bm3d 须要额定计算静止向量,速度极慢。
咱们在编码器内置的 3D 降噪算法通过复用静止向量的办法躲避了成果差和速度慢的毛病。利用前后帧的预测信息,在预编码中失去的静止向量作为根据,找到被参考帧对应的块,作为滤波的参考块,而后通过双边滤波算法,对以后块进行滤波。
这样一来,因为复用了静止向量,从而可能较好地对以后的块进行降噪滤波,也缩小了计算复杂度。咱们在 x265 也实现了同样的算法。
4.2.2 分类参数
常见的分类编码参数往往通过人为主观分类,例如游戏、UGC 视频、影视剧等。而思考到主观分类对于编码器进步 BD-rate 不肯定是最佳的,Shopee 采纳了一种逆向的思维办法,先抽进去几个不减少编码复杂度,次要影响画质的参数:B 帧个数、B 帧决策算法、B-pyramid、B 帧层次结构、QComp 等。
首先将这些参数分成性价比最高的八组(当然这八组是通过咱们线上的视频跑进去的论断),而后别离得出图中几组参数的最佳 SSIM BD-rate 收益——这里的收益是绝对于咱们线上对立的编码参数而言,把最佳 BD-rate 视频,雷同参数的作为一组,而后针对这一组视频提取特色,进行训练,应用训练完的模型对线上视频进行分类。
手动参数分类测试 BD-rate 收益最大 2.6%,模型分类 BD-rate 晋升取决于模型分类的准确性,目前通过模型分类收益 1.4% 左右,模型还在进一步改良中,预期是靠近手动分类 BD-rate 收益最大 2.6% 的指标。
4.2.3 编码器优化
1)VBV – Adapt CRF
在编码器码控方面,咱们也做出了一些优化。如图,这是 VBV + CRF 码控模型示意图,一边注水,注水速度为 maxrate* 帧 duration
;一边放水,放水速度为理论编码码率。
当水位过低时,产生下溢,增大 QP 值,升高编码码率。当水位过高,产生上溢,减小 QP 值,增大编码码率。理论编码档位的 maxrate、bufsize 参数限度了水池的大小,使得简单视频画面为了达到目标 CRF 画质,常常产生下溢,当码率有余时,大幅度降低了高复杂度画面的画质,比方呈现重大块效应。
咱们通过动静调整 CRF 值的形式,让均匀画质始终处于 VBV 限度范畴内。当产生下溢时,增大 CRF 值,升高指标画质;当产生上溢时,减小 CRF 值,进步指标画质,以此达到晋升视频均匀品质的目标。通过线上大量视频测试,BD-rate 晋升了 1.2%。
2)Hierarchy B + 时域滤波
Shopee 编码器对 BD-rate 晋升最多的优化是分层 B 帧构造。
如图所示,右边是社区版本 x264 编码进去的 B 帧构造,左边是优化后的 B 帧构造。因为左边的 B 帧分了更多层,从图上能够很直观地看进去,参考帧和被参考帧的间隔更近,参考关系更优。
另外,分层 B 帧应用先确定 miniGOP,而后二分的形式决策参考关系和档次,相较于社区版的 Adapt B 和 Viterbi B 帧决策,速度更快。以下是咱们测试的 BD-rate 晋升和帧率晋升收益。
另外,决策完参考关系之后,还能够通过对编码帧进行时域滤波,让编码帧更靠近参考帧,减小残差,以进步 BD-rate,收益大略在 2% 左右。
3)ROI(GBlur 背景)
为了适配东南亚的网络品质,Shopee 转码服务提出了一种 ROI 转码档位。以往常见的 ROI 编码,单纯通过增大非 ROI 区域的 QP 值来升高非 ROI 区域的画质,而后把 bits 节省下来,减小 ROI 区域 QP 值来进步画质。
然而这样带来一个问题,非 ROI 区域看起来块效应非常明显,和 ROI 区域有显著割裂感。于是,咱们对非 ROI 区域进行高斯含糊滤波之后再 ROI 编码,成果看起来比原来的 ROI 编码好很多。
如图所示,右边是原图,两头是扣下来的 ROI 区域,右图是高斯含糊之后 ROI 编码的成果。
4)长期参考帧
为了反对后盾视频编辑的服务,咱们在编辑服务编码器中减少了长期参考帧。
在剪辑视频的时候,可能会呈现一段节目两头要植入广告的场景,如果依照原生的 x264 帧类型决策策略,会产生 scenecut,决策为 IDR 帧,然而咱们能够看到,这里两头植入的广告的前后画面很有关联性。
于是咱们把产生 scenecut 前额视频帧缓存在编码器参考帧队列中,并标记为长期参考帧,当前面的视频帧呈现 scenecut 的时候,再和队列中的长期参考帧 scenecut 决策一次,如果决策后果均为产生 scenecut,则标记为 IDR,反之编码为 P 帧。如此优化后,BD-rate 晋升 6% 左右,不过该策略仅实用于视频剪辑的场景。
5)分级 RDO
另外,咱们还在 RDO 方面做了一些优化。
RDO 是编码器进行二次编码,把重建块和原画之间的残差作为失真,为了尽量减小失真,对帧内 / 帧间预测模式、静止向量、QP 值从新决策的过程。它们的决策强度都是顺次递增的,意思是如果要关上 QP RD,就肯定要开静止向量,模式决策 refine。
/* mbrd == 1 -> RD mode decision */
/* mbrd == 2 -> RD refinement satd cost */
/* mbrd == 3 -> QPRD */
于是咱们把 QP RD 独自拿进去,通过新增的参数管制开关,在就义了肯定速度的条件下,达到了 BD-rate 3% 的收益。
6)时域 SVC
针对 RTC 场景,咱们也做了一些编码侧的优化。
RTC 个别是没有 B 帧的,为了解决群组会议用户网络品质参差不齐的问题。咱们将 P 帧也进行了分层。层级之间的参考关系如图所示,下层的 P 帧永远参考上层的帧。
这样一来,咱们在传输过程中能够任意抛弃上一层的 P 帧,而不影响解码播放。上行带宽有余的时候,在一个 miniGOP 外部,下层的 P 帧能够依据理论网络状况抛弃,以升高带宽,从而保障视频的流畅性。
5. 性能优化
5.1 编码器端上优化
在线上视频业务中,咱们曾遇到过一些问题。有一些配置较低的手机,在光线不是很好的状况下,拍进去的画面无奈看清画面中必要的的文字信息。于是咱们对手机上采集到的画面进行了锐化,让文字看起来更清晰一些。
然而测试发现,对于东南亚的手机配置,这样的算法发热太重大,即使锐化算法是参考了 FFmpeg 的 USM,曾经是通过横纵向状态机复用和多线程优化过的版本,锐化一帧 720p 广泛耗时还是有 15-20ms,而且手机发热重大。
于是咱们针对 3×3 的 USM 模版,用 NEON 汇编指令优化了锐化函数,把一些点积、累加运算通过 SIMD 指令并行处理,锐化解决的帧率进步了 7 倍,手机也不再发热。
5.2 一入多出编码
东南亚的机房机器老本同样很高,为了节俭服务器机器资源,在点播后盾转码服务中,咱们也做了一些老本优化。
Shopee App 须要将一个点播视频转码 6 个档位,不同的分辨率和码率。咱们通过对一些转码两头数据复用的形式很大水平上升高了转码服务集群的老本,首先咱们复用了前置解决,包含 AI 加强,把同一个视频文件转码多个档位的申请调度到同一台主机上,以复用前置处理结果。
其次,咱们通过复用编码器 lookahead 帧决策、MBTree 等信息。针对同一个视频文件的转码,咱们通常只须要对其中一个档位的视频做帧决策,其余的档位间接复用帧类型信息。在编码环节中复用静止向量,skip 块等信息来缩小运算量。
通过测试,有参考信息的转码档位能节俭 50% 的运算量。复用的转码档位越多,节俭的 CPU 算力也越多。
以上就是本次分享的次要内容,接下来咱们还会公布在 x265 编码器上的一些优化,在一些视频业务上反对 H.265 编码能力,进一步提高视频用户体验。
本文作者
Zhixing,来自 Shopee Multimedia Center 团队。