xjs.xjtu

H264 SVC:从编码到RTP打包

MOTIVATION

视频压缩两种主要应用场景:网络传输、存储。

在网络传输(如:多播)中,不同接收端由于网络带宽、终端设备的差异,往往希望获得不同分辨率、不同码率的码流。

在存储(如:视频监控)中,近期的视频,可以存储高质量的;长时间以前的视频,可以只存储质量一般的。

一种方案是Multi-Stream,即发送端用多个编码器,编码不同质量的码流。 另一种方案是使用SVC(Scalable Video Coding)。

SVC编码算法

这部分主要参考paper2007 Overview_SVC.

SVC根据Scalable类型的不同,使用不同的算法。 常见的有Temporal Scalable,Spatial Scalable, Quality Scalable(也称SNR Scalable)。 还有一种比较高级的玩法,叫ROI(Region Of Interest) Scalable,这里不谈。

由于本人理解浅显,这里的算法只贴图,更详细的算法可以参考2007年paper。

Temporal Scalable,即按帧率分层,Base Layer(T0)帧率最低,T(k)层编码时可以参考T0~T(k-1)层。 这样如果T(k)层如果解码失败(丢包等),仍然可以正确解码出T0~T(k-1)层,只是帧率稍低,但不会有明显卡顿。 temporal_scalable

Spatial Scalable,即按分辨率分层。 spatial_scalable

Quality Scalable,即按视频质量(常以PSNR衡量)分层,每层的分辨率、帧率都相同。 quality_scalable

相比于传统的H264(Single Layer encoder),三种算法的优劣大致为:

SVC算法 压缩效率(efficiency) 运算量(complexity)
Temporal 大部分情况下有提高(paper Fig3b) paper未提,但猜测变化不大,需要实验数据
Spatial 变差~10% paper未提,猜测变差很多
Quality 变差~10% paper未提,猜测变差很多

结论

SVC与RTP传输

在RFC6190中,提出了两种方式传输SVC,SST(Single Session Transmission)和MST(Multi Session Transmission)。

SST,是把SVC所有层的NALU都封装在一个RTP session里(RTP session的概念可以看这里。 NALU如何打包到RTP包里,严格遵守RFC6186. SST主要用于单播(unicast)。

MST,是把SVC不同层NALU封装在若干个RTP session里。每个session可以只有一层,也可以有多层。 如果某个RTP session只包含Base Layer,则必须严格遵守RFC6186的打包方式,为的是兼容传统H264接收端。 MST主要用于多播(mulicast),不同接收端可以根据自己的网络带宽、终端设备,通过协商(SDP等),让发送端只发送某一个或若干个session。

其他SVC与RTP更细节的规范,如NALU header等,可参考RFC6190。

WebRTC中SVC使用现状

这部分内容来源于WebRTC M59(2017.06)代码和部分文档,缺少实践数据,不保证完全可靠。

遗留问题

REFERENCE


xjs.xjtu@gmail.com

2017.06