一、时域SVC
在视频编码中,有三种帧类型:
I帧:只能进行帧内预测,可以独立解码;
P帧:单假设参考帧,也就是通常说的前向预测帧,只能使用它之前的帧进行预测;
B帧:双假设参考帧, 一般为双向预测帧。
由于B帧会带来不可避免的延迟,因此在实时通信中通常只使用I帧和P帧这两种帧类型。
I帧只使用了本帧的信息进行预测,也就是说I帧的解码不依赖于其他帧,因此可以独立解码,但I帧的编码效率偏低,数据量较大。
P帧使用了帧间预测方法,可以参考之前的一些解码帧信息,能达到较高的压缩效率(帧大小比I帧小很多),但是解码时必须依赖于其他帧。
在实际的应用场景中,为了提升压缩效率,往往会使用IPPP的帧结构,即I帧之后编码N个P帧。但当网络情况不好时(如抖动,丢包,限速等),这种帧结构就会造成长时间的卡顿。
如下图所示,第0帧为I帧,后续7个帧均为P帧,且每个P帧只有一个参考帧(为其前一帧)。当网络发生丢包时,第3帧丢失,由于第4帧参考第3帧进行压缩,因此不能正确解码,5~7帧则类似。
这种情况下,即使丢包只造成个别帧的丢失,但由于接收端很多帧不能正确解码,会造成长时间的卡顿,只能通过申请I帧的机制进行恢复。
IPPP帧结构参考关系
为了解决这一问题,我们加入了时域SVC技术,对参考帧结构进行了调整。
时域SVC帧结构参考关系
我们可以将视频帧分为若干层,上图以3层为例:
Layer0的帧只能参考同样为Layer0的帧,不能参考Layer1和Layer2的帧;
Layer1的帧可以参考Layer0和Layer1的帧,不能参考Layer2的帧;
Layer2的帧可以参考Layer0~2的帧。
越低层级的帧被参考的可能性越大,因此重要性也越大。在网络发生丢包时,只要所丢的帧不是Layer0层,就不需要重新申请I帧,解码端就可以持续成功解码。如上图中第1帧丢失仅会影响2,3帧,其他帧不会受到影响。
此外还可以结合网络层的策略,对低层级的帧多加一些保护(如FEC),降低其丢失的概率,能有效地解决卡死的问题。在参会的下行人数很多时,可能会有小部分下行网络较差,如果采用传统的IPPP结构,则当某个下行损伤时就需要不断的申请I帧来恢复,这样就会影响到其他接收端的视频体验;如果采用时域SVC的结构,在能够保证少数的下行网络存在问题时,其他的下行端不会受到影响。
说了这么多,我们来看一下实际的效果吧!第一个视频示例是IPPP结构在网络损伤时的表现,卡顿感很明显;接下来是采用时域SVC的版本,帧率会有所影响但整体还算流畅。
IPPP帧结构网络损伤效果
时域SVC帧结构网络损伤效果
二、ROI检测以及基于ROI的编码
摄像头内容是腾讯会议中的一个主要视频场景。在此场景中,人眼往往比较关注人脸区域,对背景区域的关注度较低。因此,我们加入了人脸检测算法和基于感兴趣区域(Region of Interest, 简称ROI)的编码算法。
这类算法的主要思路是:实时地检测出当前视频中的ROI区域,将其传入到编码器内部,编码器进行单帧的码率重分配。对ROI区域,增大其码率,能使该区域编码的更好,提升主观质量;对于非ROI区域,降低其码率,则总的码率不会超出目标码率。
在ROI检测方面,因为腾讯会议是一个实时性要求很高的场景,对算法复杂度很敏感,我们使用一些传统的算法,结合编码器的一些预分析结果,确定最终的ROI-map,对于1080p的视频,单帧检测耗时在0.3ms以内,完全满足了实时性的要求。
基于ROI的检测和码率调整算法的优点在于:在低码率的情况下,能极大地提升主观质量;在高码率的场景下,可以保持主观质量基本不变,码率节省20%~30%,以下是一些对比效果:
低码率效果对比 (左)关闭ROI (右)开启ROI
高码率效果对比 (左) 300kbps, 关闭ROI (右) 210kbps, 开启ROI
|