RTP分析

参考

RTP(A Transport Protocol for Real-Time Applications–实时传输协议,rfc3550)
RTP Payload Format for H.264 Video(rfc6184)
https://en.wikipedia.org/wiki/Real-time_Transport_Protocol
RTP包组成:
image.png

头部

RTP头部最小12字节(没有CSRC没有扩展头部)
image.png

  • V (Version): (2位) RTP协议版本号,rfc3550规定是2。
  • P (Padding): (1位) 如果设置了padding位,则数据包的末尾包含一个或多个额外的填充字节(八位),它们不是有效负载的一部分。填充的最后一个八位字节包含应忽略的字节数,包括其本身。某些具有固定块大小的加密算法或在较低层协议数据单元中承载多个RTP数据包可能需要填充。
  • X (Extension): (1位) 如果设置了扩展位,则RTP头部后面必须紧跟一个扩展头部,格式见第5.3.1节。
  • CC (CSRC count): (4位) 表示SSRC后面的CSRC数量。
  • M (Marker): (1位) 标记一帧的结束,由负载类型决定含义。当多个RTP包携带1帧数据时,前面的RTP包的marker标志设置为0,最后一个RTP包marker标志设置为1。
  • PT (Payload type): (7位) 表示RTP负载类型。可以被动态赋值,例如在RTSP的Describe响应的SDP媒体描述中包含a=rtpmap:96 H264/90000行,表明RTP负载类型96对应的是H264。
  • Sequence number: (16位) RTP包的序列号,每发送一个RTP包,序列号加1。接收器可使用序列号检测数据包丢失并恢复数据包序列。序列号的初始值应该是随机的(不可预测的),以使对加密的已知明文攻击更加困难。RTSP PLAY响应包括序列号和时间戳的初始值。
  • Timestamp: (32位) 时间戳反映RTP数据包中第一个八位字节的采样瞬间。时间戳的初始值应该是随机的。RTP时间戳在RTP同步中是非常重要的,它确保接收方能够以正确的速率和顺序播放媒体数据,并保持与发送方的同步。
  • SSRC: (32位) 同步源标识符。应随机选择该标识符,确保同一个RTP会话的两个同步源(音频流和视频流)不会有相同的SSRC标识符。
  • CSRC: (32位) 可选的,当CC大于0存在该字段。用于标识当前RTP数据包中参与数据生成和发送的所有同步源(标识参与当前媒体数据采集、编码或发送的所有同步源)。它可以帮助接收方进行同步和混音,并提高RTP流的安全性和可靠性。CSRC的数量由CC字段表示。在一个RTP会话中,每个RTP数据包可以包含多个CSRC值,最多可以包含15个。
  • Header extension: 可选的,当设置了扩展标志位,存在该扩展头部。第一个32位包括配置文件特定的标识符(16位)和长度标识符。

image.png

H.264的RTP负载格式

对于单个NALU和非交错分组模式,序列号用于确定NALU的解码顺序。
RTP时间戳设置为内容的采样时间戳。必须使用90 kHz的时钟频率。

负载结构有三种,根据RTP负载的第一个字节的后5位来判断

  1. Single NAL Unit Packet(单个NAL单元数据包)
  2. Aggregation Packet(聚合数据包)
  3. Fragmentation Unit(分片单元)

Single NAL Unit Packet即1个RTP包承载1个NALU
Aggregation Packet即1个RTP包承载多个NALU
Fragmentation Unit即多个RTP包承载1个NALU(例如1个IDR帧很大,需要分成多个RTP包)
image.png

RTP包负载的第一个字节

forbidden_zero_bit

占1位,禁止位,H.264规定为0。rfc6184规定为1时表示NALU有比特错误或者语法错误。

nal_ref_idc

占2位,表示该NALU的重要程度。SPS,PPS,IDR不应该为0,值越大越重要。为0表示该NALU不用来重建参考图像,可能会被某些解码器丢弃。

nal_unit_type

占5位,指定了NALU单元的数据类型。1-23是Single NAL Unit Packet,24-27是Aggregation Packet,28-29是Fragmentation Unit。
image.png
其中NAL unit和FU-A最常见。

Single NAL Unit Packet(单NAL单元数据包)

image.png

FU-A分片

image.png

FU indicator

FU indicator字节的格式如下:
image.png
Type字段中等于28和29的值分别表示FU-A和FU-B。

FU header

FU header具有以下格式:
image.png
S:1位,起始位。设置为1时表示分片NAL单元的开始。
E:1位,结束位。设置为1时表示分片NAL单元的结束。
R:1位,保留位。必须等于0,并且必须被接收者忽略。
Type:5位,NAL单元负载类型。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值