iOS

# SVC说明

# 1.空间层SVC

# 基础概念

SVC 是一种分层编码方式,主要是为了一次编码实现多流输出,但多流输出实际上还可以直接用非SVC编码器同时编码出多个流。如下图,引用 WebRTC 的说法,Multicast 是一多路流分别独立编码的方式;Simulcast是多路流一路源分别编码的方式;SVC是多路流一路源整合编码的方式,且解码有层间依赖性,不可独立解码。三种方式其实各有优缺点,无法将其它两种完全替换。

img
优点 缺点 适用场合
Multicast 完全分离的多个编码实例,高分辨率层可利用硬件编码模块的输出,或视频采集设备直接输出,因此在利用外部编码的情况下CPU性能消耗可大大降低,并提高视频吞吐量。系统跟第三方非SVC编码对接方便。每层独立压缩率较高。 编码端通常一次全编,有时候计算资源浪费。集成高度定制化,非通用化。 需要使用硬件编码或直接使用外部非SVC流
Simulcast 使用方法跟Multicast类似,非异构编码,系统跟第三方编码对接方便。可按需编出特定层,不浪费计算资源。 依赖软件实现,通常不支持硬件编码。 JSM需要跟第三方系统对接,且不希望转码
SVC 灵活多层编码,参考不同层的信息,总体压缩率相对较高。 依赖软件实现,通常不支持硬件编码。跟第三方对接比较麻烦,通常需要转码。每层之间的依赖性,反而不灵活。 JSM系统内部纯软件实现

JSM同时支持Multicast、Simulcast和SVC(编解码采用H.264、AV1和H.265),默认使用Simulcast。如下图,会议服务器将混音后的音频和多流视频分发给各个观众。服务器发送到终端的视频根据终端屏幕大小和传输网络带宽,可动态调整不同的分辨率、帧率实现对不同带宽的适应。

img

以视频会议应用为例,其预制了3种视频规格配置:360p、720p、1080p:

在360p下,视频从空间上分为三层: 640360,320180,160*90

在720p下,视频从空间上分为四层:1280720,640360,320180,16090

在1080p下,视频从空间上分为四层:19201080,960540,640360,16090

在会议创建时也可根据需要指定具体的视频配置,设置方法见后面章节介绍。

# 空间层码率分配及其编码效率衰减

以H264视频会议为例,其3种视频规格的空间层码率分配如下图所示:

imgimgimg

图. 3种视频规格空间层码率分配

我们将视频源进行重新采样得到不同分辨率的测试源,以此来模拟Simulcast编码机制,经过R-D测试最终得到以下测试结果:

img

图. 不同分辨率下码率权重及其变化趋势

以X264-Superfast档为对照组,Wzav1-SVC-3T和H264-SVC-4T是我们目前在会议中使用的编码器及编码模式,我们分别计算了不同分辨率下这两个编码器所需的码率权重。例如720P下,假设x264所需码率为1000kbps,那么H264-SVC-4T则需要 10001.61=1610kbps,Wzav1-SVC-3T则需要 10000.57=570kbps。从该图表中,我们可以得出以下结论:

  • 从2条线性变化线上看,wzav1编码效率随视频源分辨率增大而递增;h264在空间上的编码效率变化不大。
  • 从柱状图上看,在各分辨率下,wzav1的编码效率几乎占有绝对优势,分辨率越高优势越明显。例如720P和1080P下,其编码效率较h264高出约65%。

注:支持以上结论的数据均由R-D测试得到。

# 2. 时间层SVC概念

# 基础概念

SVC时间域可伸缩性是基于编码器的LTR(long time reference)机制实现的,如下图描述可以通过抽帧实现变化的帧率和码率。

img

图 时间可伸缩的一个实例——视频序列的依赖关系及抽帧顺序

注意通常讲的时间层SVC的层数和码率分配的级数不是同一个概念,以上图为例,SVC时间层数为5层,抽帧帧率如果以2个基础层为单位的话,则有30个抽帧梯度,即可实现30个码率梯度。但是一般情况下,考虑到压缩效率的损耗,我们不会分这么多SVC的层级。

# 时间层码率分配及其编码效率衰减

按照基础概念中的描述,我们可以按照参考顺序将每一帧划分为t0/t1/t2/t3。以视频会议为例,不同层数的时间层码率配置及720P视频下其编码效率衰减关系如下:

img

图. 时间层码率配置

img

图. 720P视频时间层层数与压缩效率关系(wzav1目前只有3层时间层编码)

从上图可以看出:

  • wzav1在时间层上的编码损失要小于h264。
  • 各编码器从关闭SVC到打开损失约1.5-2个时间层的压缩效率,也就是说损失比值为 SVC-Off : 2T : 3T : 4T = 1.15-2 : 1 : 1 : 1。

注:支持以上结论的数据均由R-D测试得到。

# Screen编码只支持时间层SVC

适用于屏幕共享的Screen内容编码是有一些特殊优化的技术,以屏幕共享模式进行编码能比普通视频编码模式提高一倍以上的压缩效率。另外,屏幕共享的视频编码具有保证屏幕清晰度的需求,特别是讲PPT的时候屏幕的文字字体比较小,被共享端也应该能跟原屏幕一样能够清楚的看到。因此,我们设计屏幕共享的视频编码有2个基本策略,1.确保原有屏幕1:1分辨率(1080p以下为原分辨率,以上考虑性能问题为下采样到1080p),避免失真;2.允许刷新帧率适当降低,以便适应不同网络带宽。

# 3. 订阅流程原理

以下图流程介绍举例说明订阅流程的原理。

img

通话开始后,每个客户端向服务器订阅其他成员的视频等级。如下图步骤“1 A订阅B”、“2 带宽估计S->A” 描述成员A目前想看成员B的大图,那么A就向服务器订阅B的视频空间最高层。服务器通过动态码率算法估计服务器到客户端A的单向带宽,综合A的原始订阅信息,决定A的实际订阅信息。如果server到A的带宽能满足A的订阅需求,那么A的实际订阅信息就等于A的原始订阅信息。如果server到A的带宽小于A的原始订阅信息所需要的带宽,那么服务器就降低A的订阅需求,通过降低帧速率和视频空间层保证适应当前带宽。

步骤“3 C订阅B”、“4 带宽估计S->C” ,描述成员C想看成员B的小图,并报告服务器到C的带宽。

步骤“5 合并订阅”服务器结合每个客户端的下行带宽和原始订阅信息,得出实际订阅信息后,合并每个客户端向客户端B的实际订阅请求,产生服务器对客户端B的订阅信息。

步骤“6 服务器S订阅B”、“7 带宽估计B->S”,客户端B收到服务器的订阅信息,并且服务器告诉B的上行带宽。

步骤“8 根据带宽确定视频层”、“9 上传视频流”,结合当前上行带宽和视频配置,B决定实际生效的订阅信息,并且按照这个订阅信息发送视频。

步骤“10 转发视频”、“11 转发视频”,表示服务器收到客户端B的上传视频流后,按照每个客户端向B的实际订阅信息,转发不同层级的视频流。