RTP包头分析(H.264)
h.264规范中使用了在NAL层使用了RTP的包头形式,下面对RTP的包头做一下解释:
首先我们来看一下H.264中对于RPT的结构封装如下:
typedef struct
{
unsigned int v;
//!< Version, 2 bits, MUST be 0x2
unsigned int p;
//!< Padding bit, Padding MUST NOT be used
unsigned int x;
//!< Extension, MUST be zero
unsigned int cc; /*!<
CSRC count, normally 0 in the
absence
of RTP mixers */
unsigned int m;
//!< Marker bit
unsigned int pt; //!<
7 bits, Payload Type, dynamically established
unsigned int seq; /*!< RTP
sequence number, incremented by one for
each sent packet */
unsigned int old_seq; //!< to detect wether packets
were lost
unsigned int timestamp; //!< timestamp, 27 MHz for H.26L
unsigned int ssrc; //!<
Synchronization Source, chosen randomly
byte * payload;
//!< the payload including payload headers
unsigned int paylen; //!< length of payload
in bytes
byte * packet;
//!< complete packet including header and payload
unsigned int packlen; //!< length of packet,
typically paylen+12
} RTPpacket_t;
对于RTP包头格式如下:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X| CC |M| PT | sequence number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| timestamp |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| synchronization source (SSRC) identifier |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
| contributing source (CSRC) identifiers |
| .... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
前12个字节在每个RTP包中都存在,他们是:V、P、X、CC、M、PT、sequence number、timestamp、SSRC.其中V是版本号(占2个bit);P是填充位(占1个bit);X是扩展位(占1个bit);CC是CSRC的记数位(占4个bit);M是标记位(占1个bit);PT是有效载荷的类型(占7个bit);sequence number是RTP包记数位(占16个bit);timestamp是时间戳位(占4个字节);SSRC是同步标志位(占4个字节)。
CSRC不是RTP必须的(占4个字节)。
rtp包头的意思:
CSRC记数(CC) 表示CSRC标识的数目。CSRC标识紧跟在RTP固定头部之后,用来表示RTP数据报的来源,RTP协议允许在同一个会话中存在多个数据源,它们可以通过RTP混合器合并为一个数据源。例如,可以产生一个CSRC列表来表示一个电话会议,该会议通过一个RTP混合器将所有讲话者的语音数据组合为一个RTP数据源。
负载类型(PT) 标明RTP负载的格式,包括所采用的编码算法、采样频率、承载通道等。例如,类型2表明该RTP数据包中承载的是用ITU G.721算法编码的语音数据,采样频率为8000Hz,并且采用单声道。
序列号 用来为接收方提供探测数据丢失的方法,但如何处理丢失的数据则是应用程序自己的事情,RTP协议本身并不负责数据的重传。
时间戳 记录了负载中第一个字节的采样时间,接收方能够时间戳能够确定数据的到达是否受到了延迟抖动的影响,但具体如何来补偿延迟抖动则是应用程序自己的事情。
RTP:实时传输协议
(RTP:Real Time Transport Protocol)
实时传输协议(RTP)为数据提供了具有实时特征的端对端传送服务,如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务;这两种协议都提供了传输层协议的功能。但是 RTP 可以与其它适合的底层网络或传输协议一起使用。如果底层网络提供组播方式,那么 RTP 可以使用该组播表传输数据到多个目的地。
RTP 本身并没有提供按时发送机制或其它服务质量(QoS)保证,它依赖于低层服务去实现这一过程。 RTP 并不保证传送或防止无序传送,也不确定底层网络的可靠性。
RTP 实行有序传送, RTP 中的序列号允许接收方重组发送方的包序列,同时序列号也能用于决定适当的包位置,例如:在视频解码中,就不需要顺序解码。
RTP 由两个紧密链接部分组成:
- RTP ――传送具有实时属性的数据;
- RTP 控制协议(RTCP)――监控服务质量并传送正在进行的会话参与者的相关信息。 RTCP 第二方面的功能对于“松散受控”会话是足够的,也就是说,在没有明确的成员控制和组织的情况下,它并不非得用来支持一个应用程序的所有控制通信请求。
协议结构
1
|
2
|
3
|
8
|
9
|
16bit
|
V
|
P
|
X
|
CSRC Count
|
M
|
Payload Type
|
Sequence number
|
Timestamp
|
SSRC
|
CSRC (variable 0 – 15
items 32bits each)
|
- V ― 版本。识别 RTP 版本。
- P ― 间隙(Padding)。设置时,数据包包含一个或多个附加间隙位组,其中这部分不属于有效载荷。
- X ― 扩展位。设置时,在固定头后面,根据指定格式设置一个扩展头。
- CSRC Count
― 包含 CSRC 标识符(在固定头后)的编号。
- M ― 标记。标记由 Profile 文件定义。允许重要事件如帧边界在数据包流中进行标记。
- Payload
Type ― 识别 RTP 有效载荷的格式,并通过应用程序决定其解释。Profile 文件规定了从 Payload 编码到 Payload 格式的缺省静态映射。另外的 Payload Type 编码可能通过非 RTP 方法实现动态定义。
- Sequence
Number ― 每发送一个 RTP 数据包,序列号增加1。接收方可以依次检测数据包的丢失并恢复数据包序列。
- Timestamp
― 反映 RTP 数据包中的第一个八位组的采样时间。采样时间必须通过时钟及时提供线性无变化增量获取,以支持同步和抖动计算。
- SSRC ― 同步源。该标识符随机选择,旨在确保在同一个 RTP 会话中不存在两个同步源具有相同的 SSRC 标识符。
- CSRC ― 贡献源标识符。识别该数据包中的有效载荷的贡献源。