Per-Title(按主题)编码并不是很新的技术,本文是Netflix于2015年发布的。但直到今天,Per-Title编码的思想仍在发挥着重要作用,通过Per-Frame甚至Per-Block 更细粒度的切分,能够实现更高的编码效率。LiveVideoStack对文章进行摘译。
文 / Anne Aaron, Zhi Li, Megha Manohara, Jan De Cock and David Ronca
译 / 金歌
原文 :https://medium.com/netflix-techblog/per-title-encode-optimization-7e99442b62a2
我们花了数年时间开发出这种名为“Per-Title”的编码方法,其核心是对每一主题(的视频)进行独立分析,根据其复杂度选择最佳编码方式。设想一下,针对一个非常复杂的动作场景,我们将更多比特位用来封装动作信息,而只用较少的比特位封装固定不变的风景及动画部分。这种方法使我们能够在降低带宽占用的情况下,为用户提供同样优质的视频观看体验。对于带宽较低的国家,以及用户经常在移动网络上观看视频的地区,这一特质尤为重要。
相关背景
在地面无线电视、有线电视或卫星电视这些传统电视传媒方式下,广播公司会拥有自己固定可用的带宽。他们提供的节目(或同时提供的多个节目)在编码后得到的视频流需要合理地占用这部分带宽。广播公司通常会利用统计复用的方法,将比特率高效地分配给同时播放的多个节目,但其使用的总比特率仍然受制于有限的带宽总量。在多数情况下,广播公司甚至会通过填充空(视频)包的方式来确保某一固定频道的对应比特率严格不变,因此浪费了宝贵的数据传输速率。此外,通过预先设定好的频道分配,收视率较低的电视节目或电影剧集会被分配到较低的比特率(因此视频流质量较差),而高收视率的节目则会在比特率较高的频道中进行传输。
凭借着互联网流媒体的优势,Netflix不受预先分配频道的限制。相反,我们可以向会员提供质量最佳的视频流,无论是哪种节目都可以根据会员的可用带宽和观看设备进行量身定制。我们使用优化后的编码方式,以多种比特率对视频流进行预编码。客户端能够基于自适应流媒体算法即时选择最佳分辨率的视频流,最大限度地提高视频质量,同时避免因视频加载而造成的播放中断。
如何才能选择最佳的编码方式呢?这个问题可并不简单。例如,假设用户的可用带宽为1Mbps,我们应该以哪种分辨率来传输H.264/AVC视频呢?480p、720p还是1080p呢?
如果使用480p,1Mbps带宽条件下视频可能不会出现块失真或环失真等现象。但如果该会员正在使用高清设备观看视频,那么经过超采样的视频清晰度会较低。相反,如果我们以1080p编码,传输的视频分辨率会更高,但同时传输比特率可能会过低,以至于大多数画面都会出现令人厌烦的编码失真。
普适的最佳编码方式
我们于2010年末首次部署H.264/AVC编码,那时我们的视频工程师针对我们提供的所有视频类别,选择了(当时)最佳的编码方式。他们测试了多种编码器配置,通过实际观看比较的方法对编码器的各项参数进行了设定,从而让不同类型的视频都达到最佳质量。最终我们选择了下表中所列出的这组比特率-分辨率阶梯对视频进行编码,以确保视频不会出现严重的失真。
对于大多数内容来说,这种“一刀切”的方式在给定比特率限制的情况下确实实现了高质量的编码。然而,在一些特殊情况下,例如摄像机噪点或胶片颗粒噪点较多的场景,以最高比特率5800kbps传输的视频流仍会在噪点多的区域出现块失真。而对于动画片这类简单内容,以5800kbps传输1080p的视频流又是非常浪费的。此外,网络带宽限制为1750kbps的用户也许能够在高清分辨率下观看动画片,而不该受限于比特率阶梯所指定的标清分辨率。
Netflix视频集中的众多主题(的视频)具有很高的信号特征多样性。下图中我们展示了100个随机抽样的主题的多样性。我们使用x264编码器在恒定量化参数(QP)比率控制的条件下,以1080p分辨率编码了100个源。在每一个量化参数下,我们将计算出的每类主题对应的比特率(以kbps为单位)作为x轴数值,以衡量视频质量的PSNR(峰值信噪比,以dB为单位)作为y轴数值,从而得到这些数据点。
从这些曲线可以看出,某些主题在2500kbps或更低的比特率下即可达到非常高的PSNR(45dB或更高)。而与此同时,另一些主题需要以8000kbps或更高的比特率传输,才能使PSNR达到38dB这一可接受的最低限度。
鉴于不同主题的信号特征多样性及用户限定带宽情况各异,显然我们很难找到一个普适的方案使每种主题的视频都能达到最佳观看质量。在某些情况下,(使用普适方案)还会造成分配的比特率过高,大大超出提升视频质量所需要的比特率,从而导致存储空间与传输比特位的浪费。
关于视频质量度量的附注:在上图与后文中的诸多图表里,我们以PSNR作为视频质量的度量。 PSNR是视频压缩中最常用的度量。 尽管PSNR并不总能反映出人眼所感知的视频质量,但它是衡量视频保真度的一种简单指标(即45dB表示视频保真,35dB表示视频失真),同时它也很好地表示出了每个主题内视频质量的(分布)趋势。我们还可以利用其他质量度量进行分析,如VMAF感知度量。VMAF是由Netflix与南加州大学研究人员合作开发的一种新的感知质量度量。
适合视频内容的最佳编码方案
Why Per-Title?
对于一个内容”简单”的动画主题来说,视频的每一帧主要由平坦区域组成,不含摄像机或胶片颗粒噪点,帧间运动也非常小。下面我们来比较一下利用固定比特率阶梯与利用针对主题优化后的比特率阶梯分别得到的质量曲线:
如上图所示,以不同比特率编码分辨率为1920×1080的视频片段,比特率为2350kbps时(A,按主题比特率阶梯)视频质量较高(PSNR约为45dB),当比特率增加到4300kbps(B,固定比特率阶梯)甚至5800kbps(C,固定比特率阶梯)时,视频的视觉质量并不会有明显的提升(PSNR大于等于45dB时,人眼不能感受到明显失真)。 利用固定比特率阶梯,在2350kbps比特率(D)下我们只能编码分辨率为1280×720的视频片段。 因此,那些可用带宽约为2350kbps的用户就只能观看720p的视频,而不是质量更好的1080p的视频了。
另一方面,对于动作片来说,其帧间运动信息和空间纹理信息都要多于动画片。 动作片中具有快速移动的物体,频繁变化的场景,爆炸和水花四溅等镜头。下图显示了我们基于某一动作片而获得的质量曲线。
如果在1920×1080分辨率下,以4300kbps(A)比特率对这些高复杂度的场景进行编码,则会导致编码失真,例如块失真、环失真和轮廓失真。另一种质量折衷的方法是以较低的分辨率1280x720(B)进行编码,以增加缩放比例为代价消除编码失真。编码失真通常比降采样(编码前)和超采样(解码后)导致的模糊现象更加令人厌烦也更容易被发现。对于这一具有高度复杂场景的动作片来说,可能最好的方式是在1920×1080分辨率下以超过5800kbps的比特率进行编码,例如7500kbps,从而完全消除编码失真现象。
为了向我们的会员提供最佳质量的视频,每个主题的视频都应当对应一个针对其复杂特性而特别设计的比特率阶梯。为了回答以下这几个问题,Netflix的编码团队在过去这几年中投入了大量精力进行研究和开发:
算法
为了设计最优的按主题比特率阶梯,我们在确定质量等级的总数,以及每个质量等级对应的比特率 - 分辨率对时,受到了一些实际条件的限制。 例如,我们需要确保反向兼容性(视频流需要支持所有以前认证过的Netflix设备),因此可选择的分辨率被限制在 - 1920×1080,1280×720,720×480,512×384,384×288和320×240这些选项中。而可选择的比特率也是有限的,其中相邻比特率的增量大约为5%。
此外,我们还考虑到了其他一些优化标准。
- 选择的比特率 - 分辨率对应该是有效的,即给定比特率下得到的编码结果应具有尽可能高的质量。
- 相邻比特率(对应编码结果)之间应有视觉上的感知差异。 理想情况下,两个相邻比特率之间的感知差异应该恰好低于一个最小可觉差。这确保了在比特率之间进行切换时视频质量转换的平稳性。鉴于比特率梯需要覆盖的感知质量范围很广,我们还应确保质量等级的数量不要太多。
为了更加直观地解释这个问题,我们在下面这个例子中用三种不同的分辨率搭配各种比特率对视频源进行了编码。
以三种分辨率搭配各种比特率进行编码。 蓝色标记表示编码点,红色曲线表示PSNR - 比特率凸包
在每种分辨率下,编码质量随比特率增加而单调递增,但当比特率超过某一阈值后,曲线开始趋于平坦(A和B),其原因是每个分辨率都对应一个感知质量的上限。 当视频被降采样到低分辨率进行编码,而后超采样到全分辨率进行播放时,其高频成分将会丢失。
另一方面,在比特率相同的条件下,以高分辨率编码的视频质量可能反而低于以较低分辨率编码的视频质量(请参见C和D)。这是因为以较低的精度编码更多的像素,和以较高的精度结合升采样和插值来编码更少的像素,前者所得到的图像质量更低。此外,在比特率非常低的情况下,与每个固定尺寸编码块相关的编码消耗开始在比特率消耗中占领主导地位,余下能够用于编码实际信号的比特位非常少。在比特率不足的情况下进行高分辨率编码将会造成编码失真,如块失真、环失真和轮廓失真。
我们可以发现,每个分辨率都对应一段优于其他分辨率的比特率区域。如果我们汇集所有可用分辨率所对应的这些区域,它们会共同形成一个称为凸包的边界。从经济意义的角度来看,凸包是编码点达到帕累托(最优)效率的区域。理想情况下,我们希望能够精确地在凸包上进行操作,但由于实际条件的限制(例如能够选择的分辨率有限),我们将会选择与凸包尽可能接近的比特率 - 分辨率对。
为我们视频库中的每类视频构建覆盖整个质量区域的完整比特率 - 质量图是不切实际的。 为了寻找更加实用的解决方案,我们在一组有限的分辨率下对不同的量化参数(QP)进行了试验编码。量化参数的选择依据是“相邻量化参数之间存在一个最小可觉差”。我们测量记录了每个试验编码的比特率和质量。在根据采样点对曲线进行插值后,我们得到了每个候选分辨率对应的比特率 - 质量曲线。通过选择最接近凸包的点,我们最终得到了按主题比特率阶梯。
成果
以动画片BoJack Horseman例,它的帧主要由平坦区域构成,帧间运动也很低。 在固定比特率阶梯方案中,我们使用1750kbps比特率在480p下进行编码和传输。而在按主题比特率阶梯方案中,我们首先以1540kbps的比特率传输1080p的视频。下面我们来比较一下这两个版本的截图(上图:1750kbps,下图:新的1540kbps)(假设显示器为1080p)。 不难看出,利用新编码方法得到的结果更加清晰,视觉质量更好。
美剧Orange is the New Black的视频特性平均复杂度更高。 在低比特率区域,新的按主题编码方案并没有显著改善编码质量。而在高比特率区域,新方案为最高分辨率1080p配置了4640kbps的比特率。相比于固定阶梯方案中所使用的5800kbps,新方案节省了20%的比特率。对于这一主题的视频,我们在避免浪费比特数的同时,为会员保证了极佳的视觉质量。下面是比特率分别为5800kbps(上图)与4640kbps(下图)时的截图。
适合您设备的最佳编码方案
在上文描述中,我们选择了优化后的按主题比特率阶梯,这其中存在一个假设前提,即观看设备可以接收和播放(支持)任何分辨率的编码视频。然而,由于硬件限制,某些设备可能会将分辨率限制在低于视频源原始分辨率的数值。如果我们将最高凸包分辨率设定为1080p,则可能导致用户在仅限720p解码的平板电脑上观看体验欠佳。例如,对于一个动画主题的视频,如果用户可用带宽为2000kbps,我们可能会将视频流的分辨率切换到1080p,因为它的质量会比2000kbps下720p的视频流更好。然而用户的平板电脑并不支持1080p编码,即使可用带宽支持更高质量(更高比特率)720p编码,用户最终接收到的视频流的比特率也会受限于2000kbps。
为了解决上述这一问题,我们针对设备最高可播放分辨率设计了另外一种按主题比特率阶梯。 更确切地说,我们是为480p和720p的设备设计了最佳按主题比特率阶梯。虽然这些额外的编码会降低每个主题视频库的整体存储效率,但这一举措为我们的客户获得最佳观看体验提供了保障。
对于Netflix的用户这意味着什么?
按主题编码方案使我们能够通过以下两种方式提供更高质量的视频:在低带宽条件下,按主题编码能为您提供质量更好的“简单”主题视频,因为该类视频(如BoJack Horseman)现在将会在相同比特率下以更高分辨率呈现。而当可用带宽适合高比特率编码时,按主题编码能为您提供质量更优的复杂主题视频,例如Marvel的Daredevil,因为该类视频将会以更高的最大比特率进行编码。在降低带宽占用的同时为会员提供最佳的观看体验,成为更好的互联网管家,这始终引领着我们不断进行创新。
本文分享自 LiveVideoStack 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!