H264帧 通过 RTP 打包

多媒体实时通信(如语音或视频通话)一般会使用RTP/UDP进行传输,本文对H264视频在RTP传输的数据格式进行总结,RFC6184 《RTP Payload Format for H.264 Video》是H264 over RTP的规范文档,详细的内容和细节请参考该规范。

H264帧结构

H264帧 通过 RTP 打包_第1张图片

RTP封包H264的方式

NALU打包成RTP的方式有三种:

  • 单一 NAL 单元模式
    即一个RTP 包仅由一个完整的 NALU 组成. 用于 NALU 的长度小于 MTU 大小的包.
  • 组合封包模式
    NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中.
  • 分片封包模式
    用于把一个NALU 单元封装成多个 RTP 包,当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs).

打包流程

NALU的大小是不一样的,如果是非视频数据的SPS PPS才十几个字节,对于IDR帧,则有可能几十KB。这样把NALU打包到RTP方式就很多:分为一个RTP包承载一个NALU,多个NALU合并到一个RTP,一个大的NALU切分成多个RTP。
H264帧 通过 RTP 打包_第2张图片

  • 从H264编码器读出一帧数据(一个完整的H264帧)

  • 然后遍历H264的所有NALU

  • 如果NALU长度小于MTU,则将该NALU打包为一个RTP包

  • 否则,将NALU按照MTU大小进行分片(本文只用FU-A分片格式)

NALU打包到RTP

H264帧 通过 RTP 打包_第3张图片
上图展示了如何将一个NALU打包到RTP的payload;上图的左边的打包流程对应的场景是“NALU的长度 <= MTU”,直接将NALU的header拷贝到H264 RTP Payload Header上,将NALU的RBSP拷贝到H264 RTP Payload Content上。

上图右边的打包流程对应的场景是“NALU的长度 > MTU”,要将NALU的RBSP进行分片,以保证打包后的RTP报文长度不大于MTU,H264 RTP Payload Header由FU-identity + FU Header组成;FU-identity字段和NALU header字段的格式一样,其最低的5bits表示payload的类型(不同的取值表示RTP的类型不同,见下表);FU payload就是NALU的RBSP(一部分);另外,属于同一H264帧的所有RTP头的时间戳都要打成相同的,接收端根据时间戳来判断哪些包是属于同一个H264帧的。

 	Type   Packet      Typename                      
    ---------------------------------------------------------
    0      undefined                                   -
    1-23   NAL unit    Single NAL unit packet perH.264  
    24     STAP-A      Single-timeaggregation packet    
    25     STAP-B      Single-timeaggregation packet    
    26     MTAP16      Multi-time aggregationpacket     
    27     MTAP24      Multi-time aggregationpacket     
    28     FU-A        Fragmentationunit               
    29     FU-B        Fragmentationunit                
    30-31  undefined                                   

你可能感兴趣的:(AVBase)