欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

H264帧 通过 RTP 打包

程序员文章站 2022-07-14 18:48:11
...

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

H264帧结构

H264帧 通过 RTP 打包

RTP封包H264的方式

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

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

打包流程

H264帧 通过 RTP 打包

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

  • 然后遍历H264的所有NALU

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

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

NALU打包到RTP

H264帧 通过 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                                   
相关标签: 音视频