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)层,只是帧率稍低,但不会有明显卡顿。
Spatial Scalable,即按分辨率分层。
Quality Scalable,即按视频质量(常以PSNR衡量)分层,每层的分辨率、帧率都相同。
相比于传统的H264(Single Layer encoder),三种算法的优劣大致为:
SVC算法 | 压缩效率(efficiency) | 运算量(complexity) |
---|---|---|
Temporal | 大部分情况下有提高(paper Fig3b) | paper未提,但猜测变化不大,需要实验数据 |
Spatial | 变差~10% | paper未提,猜测变差很多 |
Quality | 变差~10% | paper未提,猜测变差很多 |
结论
- Temporal Scalable的压缩效率提升,猜测是不同层用了不同的QP值,使低层的图像质量更好,相比于Single Layer,减小了量化误差的扩散。
- 由于Temporal Scalable在压缩效率和运算量上都没有变差,猜测应该可以作为一种抗丢包策略。
- 应用上最需要的应该是Spatial和Quality Scalable,可惜压缩效率和运算量都变差了。怪不得有些厂商宁可选择multi-stream,而不是SVC。
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)代码和部分文档,缺少实践数据,不保证完全可靠。
- 编码端
- openh264:支持。
- MediaCodec、VideoToolbox硬件编码器:官方文档没有看到SVC相关内容,猜测不支持。
- RTP打包、解包:
- 只支持SST,即所有Layer的NALU都封装在一个session里,详见:h264_encoder_impl.cc RtpFragmentize函数.
- 解码端
- FFMPEG软件解码器:不支持
- MediaCodec、VideoToolbox硬件解码器:同编码,猜测不支持。
遗留问题
- SVC码率控制算法和QP参数的确定
REFERENCE
- paper2007__cited3678__Overview_SVC_IEEE07
- RFC6190:RTP Payload Format for Scalable Video Coding
- RFC6184:RTP Payload Format for H.264 Video
- H264 wiki
xjs.xjtu@gmail.com
2017.06