图为 vivo 视频处理技术中台架构。整个架构比较清晰、简单,包括整个视频的生命周期,从内容上传到视频处理,以及分发和播放。其中视频处理是最重要的核心模块。因为每天会面对用户 UCG 上传内容和 MCN 机构平台上传内容,这些内容质量参差不齐,码率和帧率都不一致。那么如何对这些视频进行转码和处理,以及画质增强,并呈现给用户,达到极致的体验,这是本模块最核心的使命。
视频分发是以 CDN 智能调度和质量检测为主。视频播放模块是以自研的播放器内核 SDK 为基础,包括自适应多码率和预加载策略等。QUIC 主要是应对弱网场景,保证端侧播放流畅性。
底层基础服务部分,主要讲一下实验平台。因为做任何一轮技术优化,都要经过严格的用户分流,保证 A/B 实验均衡,同时也会做一些 QoS 和 QoE 的分析。对一些常规的技术优化,我们会分析 QoS 指标包括百秒卡顿时长、起播耗时、秒开率等。在 QoE 方面,主要包括用户平均播放时长、完播率等。对于一些更复杂的技术优化,我们还会做进一步的拆分,包括未播离开率、未播 case 的归因分析,以及整体网络请求链路的耗时等。
在 vivo 短视频上线之初,我们只是提供了单一分辨率的服务。这样就会导致两个问题,一是针对高端机型,如果被分发到低分辨率的如 360p/480p 的视频,清晰度相对较差,而这部分用户对画质要求很高,那么他们对产品就不会很满意。另外对于低端机型的用户,这部分手机的硬解性能较低,如果被分发到 1080p 以上的视频,那么就会造成播放卡顿。
为了快速解决这个问题,我们设置了多分辨率以及固定码率的阶梯转码策略。整体的实践方案是根据实际码率和分辨率的情况来分档转码策略。同时客户端也会根据用户的实时网速情况,进行档位切换。为了进一步提升转码效率,并节省成本,如右图所示,我们会根据播放量的情况进行转码。
为了解决用户侧画质与流量的平衡问题,根据压缩比与 VMAF 分预测曲线及分档,我们自然就会联想到根据机型来制定不同的分发策略。对于高端机如 XFold、XNote、X80Pro、iQOO9 Pro 或新锐白领用户,他们对画质要求高且流量敏感度低,我们可以给其优先分发高档位视频,即 VMAF 与基准编码 VMAF 分差为 1 分,这些视频在用户侧播放表现更加流畅丝滑、观感也更好;对于中端机如 S15、iQOO Neo 等机型或一些小镇青年,这些用户群体对画质要求中等、流量敏感度一般,我们可以给其优先分发中档位视频;而对于千元机如 Y 系列机型,一般是下沉用户,比如资深蓝领或小镇中老年,这些用户往往会更在意流量使用,对画质要求不高,因此我们可以给其优先分发低档位视频。
首先我们看热点推送场景,它的特点是新闻热点突发,瞬时千万级 push,点击和并发量高。在没有预加载、客户端冷启动的情况下,对于起播速度要求也比较高。但这个场景下的码率是很低的,所以只对三特性中的两点有要求。
我们都知道,如果想保证起播速度快、能支持高并发量且画质最佳是一件非常难的事情,对技术难度和带宽成本来说要求都很高。
但是结合具体业务场景具体分析,似乎也没有一个场景很严苛地需要 3 个条件同时满足。拿热点推送场景来说,这类型的业务场景一般是大热点推送,往往是瞬时点击用户多,并发量高,客户端冷启动没有预加载的机会,因此对视频起播速度要求很高,画质方面,热点视频一般是新闻转发或编辑合成,此类视频画质要求并不高。
再者是外部引流场景,这类场景的特点是用户对视频感兴趣而被吸引到我们的 app 中,属于用户拉新,对于新用户来讲,画质高和起播快是必须同时具备的,对新用户的体验和留存也是最为关键的,但是拉新导流这种场景并发量不会太高。
最后是主推荐流场景,这也是我们最主要的场景,配合客户端灵活的预加载策略,我们只需要保证首条视频起播够快,剩下的视频由于已被提前加载,因此起播速度要求并不高,但是高画质和高并发是必须保证的。
从右图可以看出,码控策略会对视频的画质以及视频的码率波动产生较大的影响,对于点播 VOD 场景,业内常用的是 CRF 的码控模式,这种模式对视频的清晰度最为友好,但是通过线上实际的观察使用,我们发现,CRF 倾向于在视频开头分配较大的码率,会对起播耗时产生负向的作用。在客户端冷启动无预加载起播时,这种负向效果会对业务产生较大影响。
而热点推送场景要求起播快且瞬时并发量大,那么自适应决策优先分发低 / 中档视频,同时采用 ABR 的码控策略,以保证客户端冷启动能够秒播并节约带宽。外部引流场景要求起播快,那么我们采用 ABR 码控再优先分发中画质视频,保证导流的效率。最为重要的主推荐流场景,我们可以采用通用的 CRF 编码再优先分发高画质视频,保证用户的沉浸式浏览体验。
接下来看自适应编码的实验结果,通过播放 vv 加权,我们的视频整体平均码率与阶梯码率压缩方案相比,下降了 10%,相应带来了卡顿的下降,但是 VMAF 分数得到了提升,这是符合预期的。因为自适应编码的目的就是在保证视频原有画质的基础上,让视频播放更流畅,带宽成本更低。
对于业务指标,短时间内是很难看到非常可观的收益,我们做实验的基本原则,就是如果业务指标没有显著负向,技术指标提升了,就可以持续扩大灰度量级。用户体验的提升是一个漫长的过程,我们的实验也持续了 2 个月之久,全量后,播放完成度、完播率、有效播放率也有一定的涨幅,符合预期。
提升视频清晰度
接下来我们看如何提升视频清晰度。
首先,相对于下采样方式已知的非盲设定,内容库里真是视频的退化是未知且多样化的,有些视频可能会叠加了多种不同程度的退化。对于这种情况,我们需深入分析视频的低质成因,设计合理的退化策略来辅助制定数据集,模拟真实的退化过程,这样训练集才更有针对性。
第二,就是细节合成和退化抑制之间难以权衡。展开来讲,一些超分算法经过长期传播能够聚合有用信息,生成更多细节输出。虽然长期传播会在视频轻度退化的情况下提高性能,合成更多细节,但严重的退化可能会通过传播被放大,从而损害输出视频的质量。因此为了平衡细节合成和退化抑制之间的权衡,我们引入了退化监督模块,在传播之前对一些较为严重的退化进行适当清理,以抑制退化被长期传播过度放大。
第三,是单一的训练模型难以覆盖多品类视频。之前有提到,我们内容库里视频品类繁多,因此有必要结合视频的场景和分类来定制化地合理设计相应的网络和损失函数,以满足不同分类视频的增强要求。
混合叠加退化模块是针对原始视频叠加不同的退化,例如高斯噪声、泊松噪声、高斯模糊、视频压缩等,进一步模拟退化的复杂性和多样性。经过线上数据发现,不同场景的视频对于不同类型的退化敏感程度是不一样的,所以我们会辅以场景检测步骤,更真实模拟退化机制。
退化监督模块的目的是为了解决细节合成和退化抑制之间难以权衡的问题。
首先是损失函数调整
。我们对存在字幕的视频,在训练的过程中加入了文本先验损失,测量的是从 LR 图像中提取的文本序列和从 GT 中提取的文本序列之间的 L1 范数和 KL 散度。
第二点是控制退化程度
。对存在字幕的视频,减少模拟模糊退化的次数,以降低视频整体画质增强效果为代价,对视频的字幕进行保护。
第三点是数据集增强
。我们对存在字幕的视频,在训练集中添加了大量来自不同自然场景的带有文本的视频,进行针对性的训练集加强是一种非常有效的方式。
第四点是视频字幕检测
。通过字幕检测算法(预训练一个分类网络,判断视频中是否存在字幕)检测视频中是否存在字幕,再通过模型智能决策,对存在字幕的视频,选择经过上述三点针对性优化的模型进行画质增强。
画质增强工程链路包括为前置分析、核心处理和后向分发。工程链路中主要是后向分发,前二者偏算法。最终增强处理后的视频是要面向用户的,所以视频码率、增强后的画质分是非常重要的指标。我们会结合业务特点和用户画像进行一轮自适应编码,把码率控制在合理范围内。然后是画质分析,包括系统和人工分析,最终分发给用户。
在线上有两个收集 badcase 的入口,一是人工评测和画质分析,二是线上提供的用户反馈入口,以不断补充训练集,迭代优化模型,使用户更满意。