H264帧 通过 RTP 打包
多媒体实时通信(如语音或视频通话)一般会使用RTP/UDP进行传输,本文对H264视频在RTP传输的数据格式进行总结,RFC6184 《RTP Payload Format for H.264 Video》是H264 over RTP的规范文档,详细的内容和细节请参考该规范。
H264帧结构
RTP封包H264的方式
NALU打包成RTP的方式有三种:
- 单一 NAL 单元模式
即一个RTP 包仅由一个完整的 NALU 组成. 用于 NALU 的长度小于 MTU 大小的包. - 组合封包模式
NALU 的长度特别小时, 可以把几个 NALU 单元封在一个 RTP 包中. - 分片封包模式
用于把一个NALU 单元封装成多个 RTP 包,当 NALU 的长度超过 MTU 时, 就必须对 NALU 单元进行分片封包. 也称为 Fragmentation Units (FUs).
打包流程
-
从H264编码器读出一帧数据(一个完整的H264帧)
-
然后遍历H264的所有NALU
-
如果NALU长度小于MTU,则将该NALU打包为一个RTP包
-
否则,将NALU按照MTU大小进行分片(本文只用FU-A分片格式)
NALU打包到RTP
上图展示了如何将一个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
上一篇: H264 RTP包解析
下一篇: 从RTP包中解析H265数据