摘要
分层视频编码将视频片段压缩成若干层(附加代码位)。每一个附加层的解码都会逐步提高视频质量。这种方法有可能实现非常细粒度的速率适应。
然而,由于其跨层压缩开销和解码延迟,分层编码在实践中没有看到多少成功。
我们通过利用深度学习技术在视频编码方面的最新进展,对分层视频编码采取了新的方法。我们开发了Swift,一个自适应视频流系统,其中包括:
i)一个分层编码器,通过对前几层的残留物进行纯粹的编码,学习将视频帧编码为分层代码,而不引入任何跨层压缩开销;
ii)一个解码器,可以将这些代码的子集(基于可用性)融合在一起,并一次性解码;以及
iii)一个自适应比特率(ABR)协议,根据可用网络和客户端计算能力,协同适应视频质量。
当客户端有适当的GPU或类似的加速器功能时,Swift可以很容易地集成到当前的流媒体生态系统中,而不需要对网络协议和应用程序做任何改变,只需用提议的分层神经视频编解码器替换当前的编解码器。广泛的评估显示了Swift与之前的视频流系统相比具有多维度的优势。
1 Introduction
互联网视频传输经常遇到高度可变和不可预测的网络条件。尽管取得了各种进展,但由于这种不确定性,提供尽可能高的视频质量仍然是一个具有挑战性的问题。这个问题在无线网络中更为严重,因为信道条件和移动性增加了不确定性[39,46]。有趣的是,下一代无线网络甚至可能使这个问题更具挑战性(例如,60GHz/mmWave)[10,11,38]
为了应对这种不同网络容量带来的挑战,目前的视频传输解决方案主要采用自适应流媒体(如DASH[50]),其中源视频被分割成多个片段,在服务器上被编码为多个比特率,提供不同的视频质量,客户端运行自适应比特率(ABR)算法,动态地选择适合估计网络容量的最高质量,以下载下一个片段。
·分层编码
目前大多数商业ABR算法都采用一体化编码的做法(H.265),其中,同一视频段在每个质量级别都是 **"独立 "**编码的。一旦ABR算法在估计网络容量的基础上做出决定,那么以某种质量获取一个片段的决定被认为是最终的。然而,这些估计远远不够准确,导致网络容量的利用不足或过剩。例如,ABR算法可能因为低估了网络容量而以低质量获取,也可能因为高估了网络容量而以高质量获取导致视频停滞。因此,即使是最优的ABR算法也无法提供良好的体验质量(QoE),因为这种僵化的方法不适合流媒体条件的需要。
一种被称为分层编码的替代技术已经被长期研究[12, 14, 36, 47, 67],可以避免上述流媒体问题。这里的关键思想是,不是独立地对片段进行不同质量的编码,而是将片段分层编码;基础层提供一定的视频质量,附加层在基础层上应用时提高视频质量
。
这意味着,如果网络吞吐量提高,人们可以以比普通编解码器低得多的成本获取额外的层来提高视频质量。我们使用常规编码一词来表示当前在多种质量中独立编码的做法(当前标准如H.265/HEVC)
· 分层编码的挑战
然而,分层编码面临着两个不小的挑战:压缩开销和编码延时。压缩开销主要来自于没有层间帧预测以避免质量的重建漂移[29,42,61,67] 。.另一方面,解码延迟是层数的一个函数,因为每层都需要单独解码。
尽管有这些问题,一些研究确实在流媒体中应用了分层编码,并显示与常规编码方法相比,其质量效益略好,这得益于其动态质量升级的能力[31]。然而,他们并没有直接解决开销或延迟问题。工业流媒体解决方案继续采用常规的编解码器,在硬件中运送这些编解码器以避免计算上的挑战,这使得采用新的创新更加困难
· 神经视频编解码器
视频编码的学习方法在短短几年内显示出压缩效率的巨大提高[43,60,65]。
图2显示了两类几代编解码器的比特-每像素与PSNR图(使用深度学习的神经编解码器和使用流行的H.26x标准的传统算法编解码器)。算法编解码器花了18年时间才取得了与神经编解码器在过去4年中所取得的相同的进展。这种快速发展的原因之一是,神经编解码器可以在软件中运行,可以作为应用的一部分进行整合,支持敏捷的编解码器开发,并提供免版税编解码器。
此外,它们在数据并行平台上运行,如GPU,这些平台越来越多,也越来越强大。
使用神经编解码器进行视频编码有几点启示:
1)与传统的分层编码方法不同,手工制作的每一层都有独特的信息,而神经网络的损失函数可以被优化,通过纯粹编码从前面几层的残余,将视频帧编码为独特的分层代码,而不引入重建漂移。
2)神经网络可以被训练成接受分层编码的一个子集,并在一次拍摄中解码所有的分层编码,由于编码之间的非线性关系,这在传统上也是很难用手工算法做到的。此外,
3)神经编解码器可以实现软驱动编码。
我们在此注意到,用于神经网络计算的GPU或类似加速器对于神经编解码器的成功至关重要。幸运的是,它们在现代设备中越来越常见。
Swift
基于上述见解,我们提出了Swift,一个使用分层编码的新型视频流系统,它建立在神经视频编解码器[32,60,65]的原理之上。我们表明,学习可以解决前面提到的分层编码的挑战:进一步分层没有额外的压缩开销,解码延迟与层数无关。
Swift包括三个设计组件:i)服务器端编码器加解码器,ii)客户端解码器,以及iii)适应分层编码和不同计算能力的ABR协议(除了不同的网络容量)。
我们用不同的视频内容和FCC发布的现实世界的网络痕迹[8]来评估Swift。我们将Swift与将常规编码[35,51,52]或分层编码[31]与先进的ABR算法相结合的先进流媒体算法进行比较。就QoE而言,Swift比次好的流媒体方案高出45%。它使用的带宽减少了16%,对网络条件变化的反应时间也更短。就神经编解码器而言,Swift的分层编码在压缩率方面优于最先进的分层编解码器(SHVC[12])58%,在解码延迟方面优于×4(对于6层)。综上所述,我们的贡献如下:
- 我们展示了基于深度学习的编码如何使分层编码既实用又高性能,同时解决了阻碍人们对分层编码兴趣的现有挑战。
- 我们设计并构建了Swift,以展示一个实用的基于分层编码的视频流系统。Swift是基于深度学习的编码和解码方法以及特制的ABR协议的一个体现。
- 我们全面评估并展示了Swift在质量效益、带宽使用、反应时间和压缩效率方面的多维优势。
2 Motivation
2.1 今天的视频流由于常规编码而存在的局限性
今天的视频供应商主要使用源速率适应(如MPEG-DASH[50]),视频片段在服务器上以不同质量编码,自适应比特率(ABR)算法根据网络容量选择最佳质量的片段进行下载。
被广泛部署的流媒体解决方案,使用常规的、标准驱动的、算法编码方法,如H.265/HEVC[53]或VP9[4]对视频片段进行编码。这些编码方法不允许根据网络条件对片段进行升级或降级。
图3用一个实验例子说明了这个问题(关于方法的更多细节在§6.1中描述)。
该图显示了由不同的最先进的ABR算法获取的片段的质量,这些算法使用常规的编码。在实验过程中,吞吐量在100秒的时候有了大幅度的提高。两种最先进的流媒体算法,Pensieve[35]和BOLA[52],一旦片段被下载,就不能升级其质量。这就造成了适应改进后的吞吐量的缓慢反应。然而,在图3(b)中,BOLA-FS[51],BOLA的一个版本,确实允许在网络条件改善时重新下载更高质量的片段。然而,先前下载的低质量段被丢弃,导致带宽的浪费。
2.2 分层编码
解决上述问题的更合适的编码方法是分层编码,如图1所示,一个视频片段被编码成一个基础层(提供最低的播放质量水平)和多个增强层。显然,与常规编码相比,分层编码对速率适应的控制要精细得多。例如,同一片段的多个增强层可以随着网络容量的提高而逐步获取,这在常规编码的情况下是不可能的。
2.3 在视频流中采用传统的分层编码所面临的挑战
分层编码通常是作为常规编码技术的延伸而被开发和实施的。已发布的标准证明了这种依赖性。SHVC[12]是作为H.265[53]的扩展而开发的,同样,较早的SVC[47]是作为H.264[57]的扩展。开发分层编码作为常规编码的扩展,在实际部署中引入了多种挑战。
**1)跨层压缩开销。**在当前一代视频编码标准中,大的压缩效益的关键(例如,H.265[53]的压缩率≈2000倍)是帧间预测:连续的帧是相似的,因此简单地对连续帧之间的差异进行编码是有效的。然而,使用跨增强层的当前帧相对于前一帧的帧间预测会使视频质量在解码过程中发生漂移[29,42,61,67]。为了最小化或避免漂移,大多数分层编码方法不使用跨层的帧间预测,因此失去了其压缩优势[11, 17, 31]。实际上,为了达到同样的质量,分层编码(如SHVC)与常规的对应方法(如H.265)相比,需要明显更多的比特。在我们的研究中,我们发现一个4层的SHVC编码方法与普通编码对应的H.265相比,每个像素需要2.5倍的比特(见图4)。
**2) 编码和解码延迟高。**这些算法编解码器的计算复杂性主要来自于帧间预测时的运动估计过程[53,57]。在运动估计过程中,对于每个像素来说,对其运动矢量进行编码是非常有用的,也就是说,它在前一帧中的相对位置是什么。每一帧的运动矢量都是通过将该帧划分为数千个像素块并在之前的帧中搜索类似的块来计算的。一般来说,编解码器使用一组先前的帧来搜索每一帧中的块,这使得计算成本很高。在分层编码的情况下,这个过程变得更加复杂,因为每一层都必须一个接一个地解码,因为每一层都依赖于前一层(利用内容冗余)[11,27,30]。
分层编码的这种串行过程使延迟成为层数的函数,因此,随着层数的增加,延迟也逐渐增加。
图5显示了最先进的分层编码(即SHVC)在桌面上对1分钟视频的每帧解码延迟,配置见第6.1节。
如图所示,5层的每一帧解码需要100多毫秒,与普通对应的H.265(x265[7]实现)相比,编码延迟增加了一个数量级。
尽管在过去进行了一些优化,但这样的延迟范围使得在异构平台上实现实时解码是不可行的。最近的研究(如Jigsaw[11])通过提出轻量级的分层编码方法(使用GPU实现)来应对这一挑战,但延迟仍然是层数的函数。
由于这些挑战,传统的分层编码在今天的实践中没有被使用。在这项工作中,我们不是用另一个扩展来处理这个问题,而是试图通过一个干净的、基于学习的方法来探索分层编码,目标是通过拥抱新的硬件能力(例如,GPU和其他数据并行加速器)的机会来实现高效的分层压缩。
2.4 使用神经编解码器的分层编码
由于深度学习的新进展,视频压缩最近在计算机视觉界经历了一次范式转变[32, 43, 60, 65]。压缩/解压缩在这里是使用神经网络实现的,我们称之为神经视频编解码器。其基本思想是使用自动编码器(AE),这是一种用于学习有效编码的神经网络结构,长期以来一直被用于减重目的[20]。
AE由一个编码器和一个解码器组成。编码器将输入视频转换为维度低于输入尺寸的代码向量,而解码器则从低维代码向量中重建(可能有小的误差)原始输入视频。神经网络的权重参数(Wifor编码器和W′ifor解码器)是通过最小化重建误差来训练的,也就是说,最小化输入和解码器输出之间的差异。
编码越小,压缩系数就越大,但重建误差越大。
我们在使用自动编码器方面的见解是,他们的损失函数可以被优化,通过纯粹编码前几层的残留物,将视频帧编码成独特的分层编码,而不像传统的分层编码那样,手工制作每一层都有独特的信息是不容易的。
3 Swift
3.1 概述
相对于传统的编解码器,自动编码器已经被证明可以提供类似或更好的性能[32,43,60]。最近的工作,如Elf-vc[43]也能够使用自动编码器来提供灵活的视频编码速率,以适应目标网络容量或实现目标压缩质量。然而,目前的工作并没有提供一种在视频中以递增的可解码层进行编码的方法。为了做到这一点,我们利用残差来形成分层编码。残差是指一个编码器的输入和相应的解码器的输出之间的差异。残差在过去被用于识别和压缩等任务,以提高应用的效率(例如,分类精度或压缩效率)[19,55,60]。
Swift使用残差来设计视频流的分层编解码器。这个想法是采用一个结构相同的自动编码器链。链上的每个自动编码器都对上一层的残差进行编码,链上的第一个自动编码器(实现基础层)对输入视频帧进行编码。
图6显示了一个例子,其中显示了从一个原始帧到一系列逐步压缩-然后解码的帧的残差。第一个解码帧(标记为MS_SSIM = 0.9)与原始帧相比有一个相对较高的损失。因此,残留的r0有更多的信息。当这个残余信息被用于下一层的压缩时,产生的解码帧更接近原始帧,反过来,残余的信息更少,以此类推。
上述 "迭代 "链隐含地代表了一种分层编码机制。每个迭代(即层)都会产生一个原始视频的压缩版本,我们称之为 “代码”。这些代码编码的信息是递增的,随着更多这样的代码被解码,重建的视频会逐渐接近原版。Swift本质上是利用这种残差机制来创建分层编码。这种对残差的迭代最小化也作为一种隐含的正则化来指导重建(在给定的带宽下),而不是像Elf-vc[43]中那样紧跟经典的压缩方法。
图7显示了服务器侧的自动编码器架构(更多细节见第3.2节)。该架构在每一层中共同学习编码器和解码器。和以前一样,自动编码器的权重参数被训练为最小化解码器的输入和输出之间的重建误差。在这个过程中,编码器在每一层生成一个紧凑的代码,这是输入视频帧的压缩版本。这些代码被传输到客户端,在那里它们可以被解码以逐步实现更好的重建。
然后,在服务器上学习到的解码器被进一步优化(第3.3节),以便在客户端使用。客户端解码器最初从第一个代码中重构基础层。然后,如果从服务器上下载了更多的层/代码,解码器将从第二层开始重建残余,并与之前的重建相结合,生成输出视频帧。
总的来说,Swift有三个主要组成部分。
- 一个基于学习的分层编码器-解码器对在一个神经网络中,在服务器端创建基于残差的分层编码(§3.2)。
- 在客户端有一个单独的基于学习的解码器。这个解码器可以一次性解码任何分层编码的组合,以实现实时解码(§3.3)。
- 扩展ABR算法,可以将编解码器整合到一个完整的端到端系统中(§4)。
3.2 分层神经编码器
我们首先描述编码器和解码器是如何在服务器端进行训练的。假设,它是时间t的图像或视频帧,对于t∈{0,1,…}。编码器(E)将每一帧作为输入,为每一帧生成一个紧凑的代码向量(c),即ct= E(It)。每一帧的代码是通过利用视频中多个先前帧的冗余度来构建的。因此,编码器将一组先前的帧作为参考,以便对每一帧进行编码。解码器(D)重建给定ct的帧ˆIt,即ˆIt= D(ct)。这里的优化问题是训练E和D对,以使ˆIt和It之间的差异最小。由于我们将我们的分层编码作为一个通用扩展添加到任何神经编解码器中,而不改变其内部逻辑,所以E和D可以被假定为黑盒子。附录A中介绍了一个神经编解码器的例子。
图7显示了我们在服务器端设计的分层编码器-解码器网络。这里,每个迭代(或层)都将残差riin编码为代码ci,其中残差ri是前几层中编码器输入和解码器输出之间的差异。对于第一次迭代,编码器直接对原始视频帧进行编码。用数学方法表示:ci= E(ri) and ri= ri-1-ˆ ri-1 with ˆ ri= D(ci), for i = 0,…,L, with the exception that for i = 0 (base layer), r0= I.
在每个迭代中,解码器可以用所有先前迭代的输出与基础层输出的普通算术和来提高视频帧的质量。这里的关键是,E和D都有独立的隐藏状态(hE∗和hD∗),它们被迭代更新,在迭代之间共享信息。事实上,这种跨迭代共享的权重子集可以更好地重建残差。熵(即信息)在初始层非常高,但由于隐藏连接的存在而逐渐减少,因此代码大小逐渐变小。这些迭代编码器-解码器对的训练目标是使残差的L1重构损失最小。
$$
\begin{equation}\mathcal{L}{\mathrm{rec}}=\frac{1}{L} \sum{i=0}^{L-1}\left|\mathcal{D}\left(c_i\right)-r_i\right|_1\end{equation}
$$
该链中的所有自动编码器E和D共享相同的网络,因此具有相同的输入和输出大小。它们在所有迭代中产生相同的代码大小。Swift依靠一个单独的熵编码阶段(图7)来创建剩余码,在每个迭代中按比例分配比特数以匹配熵。来自编码器E输出的固定长度的代码向量被二进制化,并通过一个类似于CABAC[54]的传统熵编码器。
请注意,学到的编解码器可以与各种输入视频分辨率一起工作,因此我们不需要为每个视频分辨率训练一个单独的模型。这主要是因为这里的自动编码器将一个或多个视频帧作为输入,并通过卷积(例如Conv2D[41])提取特征。每个卷积核(固定大小为k×k像素,远小于输入分辨率)以滑动窗口的方式应用于k×k像素块,以减少尺寸,形成自动编码器的紧凑的代码向量。在我们的编解码器中,我们使用4个下采样卷积块来减少尺寸。这使得任何输入分辨率(w×h)在编码阶段后被下采样为(w/16)×(h/16)分辨率乘以自动编码器的瓶颈位(b)(见附录A)。因此,在测试过程中,编码器在352×288分辨率下的输出为22×18×b,而在1280×720分辨率下为80×45×b。同样,在测试过程中,编解码器也会对其他分辨率进行调整。
3.3 分层神经解码器
上述迭代编码设计已经包括了解码器(图7),可以从分层编码中重构视频。原则上,客户端可以使用已经在服务器端设计和学习的相同解码器。然而,迭代法产生的解码延迟与迭代次数成正比。这是因为残余码在每个迭代中都是单独创建的,解码器不能解码一个码(ci),除非前一个迭代的编码器编码ci-1,并由相应的解码器解码,形成残余的ri。
这个延迟对于视频服务器/CDN来说是可以接受的,它们对视频进行离线编码,并将其存储起来,以便按需播放,但客户端需要对视频进行实时解码(≈30 fps)。为了解决这个问题,我们开发了一个单独设计的单次解码器,在客户端使用,它可以采取任何编码组合作为输入,并在一次解码中解码相应的帧。见图8。
客户端可用的代码被融合,并用零填充,直到预先确定的代码长度(相当于L级),以考虑不可用的代码。然后,它们被送入一个 "多头 "解码器(H),如图8所示。
在每个头中,每个代码的填充版本ci在合并到一个共同的网络之前,分别通过单独的神经网络进行处理。当高层不可用时,相应的头将对重建没有影响,而当可用时,会产生一个理想的残余映射。本质上,这些多头是轻量级的,共同网络(在合并多头后的残余编码后)遵循§3.2中相同的解码器架构D,但在一个模型中。头部或共同解码器不共享任何参数,与迭代解码器在不同的迭代中共享隐藏状态相反。
请注意,在服务器端准备残余编码时,我们仍然需要§3.2中描述的迭代E-D结构。为了区别于服务器端的解码器(D),我们把这个客户端的单次解码器表示为Dss。
我们通过扩展在服务器端使用的目标函数来训练Dss。具体来说,除了服务器端解码器(D)的损失函数(重建一个残差)之外,我们还增加了一个损失函数,对应于客户端解码器(Dss)使用可用代码层进行的实际图像重建。使用L1损失函数,两个目标如下所示。
$$
\begin{equation}\mathcal{L}{\mathrm{rec}}=\frac{1}{L} \sum{i=0}^{L-1}[\underbrace{\left|\mathcal{D}\left(c_i\right)-r_i\right|1}{\text {residual quality loss }}+\underbrace{\left|\mathcal{D}^{\mathrm{ss}}\left(\oplus_{k=0}^i c_k\right)-I\right|1}{\text {image quality loss }}]\end{equation}
$$
这里,服务器端的解码器(D)在每次迭代时基于代码ci重建残余图像ri,而客户端的Dss重建原始图像I基于相应迭代时可用的代码子集,即c0…ci。这个函数允许我们在一个训练循环中训练编码器和两个解码器(服务器和客户端)。在训练过程中,所有三个模型E、D和Dss都是联合优化的,方法是将**§3.2中为E和D计算的损失和为Dsst计算的直接损失相加**,对应于原始图像重建。这种具有更复杂目标(即多个损失函数)的联合训练确实影响了服务器端解码器的性能。来自第3.2节的迭代解码器的目标比Dss简单,因此它的性能在独立训练时(在这种情况下,只有损失函数的第二项对Dss来说是足够的)比联合训练要好。在我们的实验中,我们观察到联合训练的平均质量下降很少–这对用户来说几乎是无法察觉的。此外,训练这些模型中的每一个也会在服务器上产生额外的计算成本。
4 使用分层神经编解码器的流媒体
Swift的分层神经编码给端到端流媒体带来了两个挑战。第一个挑战出现了,因为Swift在客户端的解码器预计将在GPU或其他类似的数据并行加速器上运行,并以软件形式运行,而不是像常规编解码器那样的专用固定硬件解码器。即使软件编解码器在按需升级编解码器和敏捷开发方面有优势,但它引起了与其他应用争夺资源的可能性。由于GPU资源的可用性可能不同[33,45],客户端需要能够适应可用资源。
第二个挑战是在比特率选择方面。视频流协议将每个视频段编码为不同的质量,并使用ABR来选择下一个最佳质量的视频段进行流。然而,Swift中的ABR算法有一个更复杂的选择–应该以尽可能高的质量获取下一个片段,还是通过获取额外的层来升级当前的片段?这个问题变得更加复杂,因为端到端的流媒体性能同时受到网络和客户端的计算变化的影响(见上文)。传统的比特率适应技术被设计为只适应网络的变化。
在本节中,我们描述了一个可扩展的解码器和神经适应的ABR算法的设计,以应对这些挑战。
4.1 基于计算能力的解码器scale化
解码器架构(如图8所示)使用具有一定深度的网络。正如自动编码器中常见的那样,深度越大,解码精度越高,但深度越低,计算要求就越低。
Swift通过在网络的不同深度设计多个轻量级的输出头来利用这种权衡。
然后,解码器在精度与计算要求的权衡中在不同的设计点运行,根据GPU的容量在不同的深度退出。
我们将GPU容量定义为在过去的样本期(在我们的案例中为1秒)中一个或多个核心在GPU上执行的时间百分比。例如,100%的GPU利用率意味着所有的GPU核心在过去的样本期中都在忙于其他应用程序。为此,我们在Dss decoder中引入了一些提前退出的头(hdj,其中j=1…S),它们对应于不同的输出视频质量。
见图9。例如,如果网络中有5个出口,那么每个出口深度输出的分辨率比原始图像小×16、×8、×4和×2,最后的出口为原始重建。这里,最开始的早期出口输出的质量较低,而最后的出口输出的质量较高。文献中已经有类似的早期退出网络用于各种任务[28,37]。在Swift中,我们在每个出口处定义一个损失函数,并在所有出口处优化解码器的训练目标。解码器的训练是通过引入额外的L1重建损失,从而使每个提前出头的输出与原始输入(I)的差值最小。目标函数如下所示。
$$
\begin{equation}\mathcal{L}{\mathrm{rec}}=\frac{1}{L} \sum{i=0}^{L-1}[\underbrace{\left|\mathcal{D}\left(c_i\right)-r_i\right|1}{\text {residual quality loss }}+\underbrace{\left.\frac{1}{S+1} \sum_{j=0}^S\left|\mathcal{D}{h d_j}^{\mathrm{ss}}\left(\oplus{k=0}^i c_k\right)-I\right|1\right]}{\text {image quality loss }}\end{equation}
$$
这里,S是出口的数量。给定这些多个退出和下载的代码的组合,解码器输出对应于两个维度的质量。图10显示了当客户端解码不同数量的分层代码,同时在不同深度退出时,对于§6.1中描述的UVG视频,平均视频质量的热图。例如,如果客户端只获取基础层(图中显示为1)并在深度1处退出,解码后的片段质量为28dB。然而,如果客户端解码4层并解码完成(在深度4处退出),则解码段的质量增加到32dB。这里要注意的是,可以获取的分层编码的数量取决于网络容量,而退出深度则取决于计算能力。
在运行时,Swift decoder根据GPU的容量来决定何时退出。GPU容量决定了通过计算直到不同的深度来解码一个片段的延迟。给定一个GPU容量,Swift会选择最大的深度,这样该段就会被解码而不会因为缓冲区是空的而产生任何停顿。在第5节中,我们讨论了客户端如何选择解码器并获得解码延迟和退出深度之间的关系。
4.2 分层神经编解码的自适应码率
使用常规编解码器的传统ABR算法[31,35,52]将可用的吞吐量、缓冲区水平和关于未来视频段的细节作为输入。该算法输出接下来要下载的视频片段的质量。Swift需要调整现有的ABR算法,以便与分层神经编解码器一起工作。我们用ABR的输出、输入和目标函数的变化来描述这种适应。然后我们讨论如何用这些变化来实例化ABR算法。概况见图11。在下面的讨论中,我们假设ABR算法是在服务器上运行的;但它也可以调整为在客户端运行。
**输出:**Swift的ABR的关键变化是,与传统的ABR不同,我们的算法可以做出两种选择之一:下载未来片段的基础层(即质量最低的代码),或者,下载一个缓冲视频片段(尚未播放)的增强层以提高质量。它根据一组(新的)输入和目标函数做出这一决定。对于使用分层编码的流媒体算法,包括使用分层编码的最先进的流媒体Grad[31],需要对输出进行这种改变。我们在第6节中比较了Swift和Grad的性能。
**输入:**Swift为ABR引入了两个额外的输入,以考虑到解码时的计算变化。
ABR将一个矩阵作为输入,该矩阵将解码片段的质量与该解码所需的计算能力进行对比(类似于图10)。
这个质量矩阵是在服务器上为每个视频段的不同计算能力生成的,即为所有的层和出口深度组合。下一个输入是客户端的当前GPU容量。由于我们在服务器上运行ABR算法,这一信息是由客户端在段请求包中发送的。
如果ABR算法是在客户端运行的,那么GPU的容量在那里是现成的。在这种情况下,服务器上的质量矩阵可以作为清单文件的一部分发送。
第二个变化是关于在客户端下载/缓冲但尚未播放的片段。Swift的ABR需要这些片段的信息来做出选择。具体来说,这包括:
i)当前/缓冲段的剩余层的大小;
ii)缓冲区内所有段的播放时间,以确定该段是否可以在播放前进行增强。除此之外,我们还输入了最后k个显示片段的解码质量历史,以减少质量的变化(这通常被称为平滑度,是提高QoE的一个重要指标)。
目标函数。视频体验质量(QoE)通常用三个指标来衡量:
i)播放质量(Q),即下载片段的质量;
ii)重建率(R),衡量视频因缓冲器为空而停滞的频率;
iii)平滑度(S),衡量质量的波动。形式上,QoE = Q - αR - βS,其中α和β是控制重新缓冲和平滑度惩罚的系数[31, 35, 52]。由于Swift的解码性能是可变的,它不一定能从下载的片段中提供可能的最佳质量。
因此,Swift的目标函数考虑到了解码段的质量(Qd),而不是下载段的质量。同样地,我们从解码段的质量(Sd)而不是下载的质量来计算平滑度。