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).

打包流程

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

  • 从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                                   
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H.264和H.265(HEVC)是两种常用的视频编码标准,用于压缩和编码视频数据。RTP(Real-time Transport Protocol)是一种用于实时传输音视频数据的协议,常用于实时通信应用中。 封装H.264和H.265视频数据为RTP流的主要区别在于以下几个方面: 1. RTP负载类型:H.264和H.265在RTP中的负载类型不同。H.264的RTP负载类型为96,而H.265的RTP负载类型为265。这些负载类型用于标识传输的数据类型,以便接收方能够正确解析和处理数据。 2. NAL单元:H.264和H.265编码的视频数据被划分为多个NAL单元(Network Abstraction Layer Units),每个NAL单元包含一部分视频数据。封装为RTP流时,需要将NAL单元进行打包。对于H.264,常用的打包方式是将多个NAL单元打包为一个RTP包,或者将一个NAL单元拆分为多个RTP包进行传输。而H.265在打包方面引入了更多的灵活性,允许将多个NAL单元一起打包为一个RTP包,或者将一个NAL单元拆分为多个RTP包。 3. RTP扩展头:H.265引入了RTP扩展头(RTP header extension),用于在RTP头部中传输一些额外的信息,如类型、解码时间戳等。这些信息在H.265的RTP封装中可以使用RTP扩展头进行传输,而在H.264的RTP封装中需要使用其他方式进行传输。 总体而言,H.264和H.265在RTP封装方面存在一些细微的区别,主要体现在负载类型的不同,NAL单元的打包方式以及H.265引入的RTP扩展头。这些区别需要根据具体的应用场景和要求来选择适当的封装方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值