如何实现H.264的实时传输?
#01
基本格式
01
H.264的RTP报头
图1 RTP报头
02
H.264的RTP负载类型
H.264的RTP负载可分为三大类,类型如下:
此类RTP负载中仅包含单个NAL单元。负载报头类型编号等于原始NAL单元类型,即从 1 到 23 的范围值,详见H.264规范。
此类型用于聚合多个NAL单元成为单个 RTP 负载。这类数据包有四个细分版本:单时间聚合包A (STAP-A)、单时间聚合包B (STAP-B)、16位偏移多时间聚合包 (MTAP16) 和24位偏移多时间聚合包 (MTAP24)。负载类型编号分配给 STAP-A、STAP-B、MTAP16 和 MTAP24 的值分别为 24、25、26 和27。
03
H.264的RTP打包模式
单NAL单元模式
所有的接收端都必须支持这种模式,主要应用于兼容低时延应用中的硬件设备。只有单NAL单元数据包可以在这种模式下使用。
非交错模式
建议接收端去支持这种模式,主要应用于低时延应用。只有单NAL单元、STAP-A和FU-A数据包可以在这种模式下使用。
交错模式
有需求的接收端可以去支持这种模式,主要应用于非低延时应用。STAP-B、两种MTAP、FU-A和FU-B数据包可以在这种模式下使用。
单NAL单元和非交错模式中,NAL单元必须以NAL单元解码顺序传输,这两种模式更适合低延时需求的交互系统。
交错模式中NAL单元的传输顺序和解码顺序可以是不一致的,导致接收端的解包过程中需要按照解码顺序重新排序,引入更多的时延,因此并不适合需要低时延的交互系统。
04
H.264的RTP负载报头
H.264的RTP负载报头位于负载的第1个字节,分成三个字段:
05
H.264的RTP负载格式
因为只有单NAL单元模式和非交错模式打包模式更适合应用于低时延交互系统中,而这两种打包模式所涉及的只有单NAL数据包、单时间聚合包A(STAP-A)和分片单元A(FU-A)三种RTP负载,所以在这里只对这三种负载格式做个简单的介绍。
单NAL数据包就是将原始的NAL单元直接放置到RTP的负载中,NAL单元头就是作为单NAL数据包的负载类型。
单时间聚合包A(STAP-A)
聚合数据包的负载中包含一个或者多个聚合单元。一个聚合包可以携带尽可能多的聚合单元;不过聚合数据包中的总数据量应该选择合适大小,以便生成的IP数据包小于MTU大小。聚合数据包负载报头中的NRI字段的值必须是所有聚合NAL单元中最大值。
#02
实践分享
图9 视频流工作流程
01
H.264打包
H.264的打包的基本流程大致如下:
输入H.264 NAL,判决当前的H.264 NAL的打包格式,可以选择单NAL单元包格式、STAP-A包格式,或者是FU-A格式。MTAP格式一般不在实时系统中使用,考量的重点在于兼顾打包效率和传输效率。 Single-NAL-Unit 打包比较简单,一个NAL封装为一个RTP包。 STAP-A在NAL包比较小的时候采用,多个相同时间戳的NAL包被打到一个RTP包。 FU在NAL包比较大的时候采用,限制RTP包的大小小于MTU。一个NAL包被拆成多个碎片(Fragment), 碎片被打成RTP包。
02
H.264解包
在此只对三种打包模式下的解包过程做一个大致的介绍。
参考文献
2、RFC 6184 – RTP Payload Format for H.264 Video