【转载】RTP头结构定义

本文详细解析了RTP协议的关键字段,包括版本(V)、填充标志(P)、扩展头标识(X)、CSRC计数(CC)、标记(M)、负载格式(PT)、序列号(Squencenumber)、时间戳(Timestamp)、同步源(SSRC)及贡献源(CSRC)等,阐述了它们的功能及应用。

     CC        PT                   sequence number

Timestamp

SSRC

CSRC

 

注:

            2 bit    版本.                  

            1 bit    填充标志,包的后面是否跟有一些填充字节。一般为0。

            1 bit    后面是否跟扩展头。跟在CSRC的后面。扩展头用于存储用户的私有信息。一般为0。

CC            4 bit   CSRC头计数,最大值16。一般为0。

            1 bit   标志位,由应用程序定义它的具体含义,如果为1,则应用程序定义了特定的事件。一般为0。

PT            7 bit    RTP负载格式。

Squence number 16 bit  序列号。用于侦测是否有丢包现象。每个包加1,基于安全考虑,其初始值应该是一个随机值。

Timestamp     32 bit  时间戳  RTP包中的头一个字节的采样时刻。对于固定频率的音频采样,每经过一个采样周期,改值加1。每增加一个数据包,Timestamp就增加一个采样间隔(改间隔内有多少个采样周期),无论数据还是静音都要增加。拿G.723来说,它的采样率为8KHz,如果是一段30ms的数据,那么采样间隔内有: 30ms * 8000/s=240个采样周期,这样,每得到一段30ms的数据,Timestamp增加240。对于不同的编码方式,如果采样率为16Khz,那么采样间隔为:30ms *16000=480. 这样,每得到一段30ms的数据,Timestamp增加480。Timestamp的初始值是一个随机数。

SSRC         32 bit   同步源,不同的音频源有不同的SSRC。该值随机的选择,用于唯一的标示一个音频源。

CSRC         32 bit   0~15个,具体个数由CC决定,对SSRC起作用的音频源。比如说:如果2个人说话,混音以后,就会有唯一的一个SSRC,但是相对的会有两个CSRC对应着两个最初的音频源。

 

转自http://blog.sina.com.cn/s/blog_497076df01000a5p.html

<think>好的,我现在需要帮助用户了解如何在RTP协议中定义和使用扩展头字段。首先,我得回忆一下RTP协议的基本结构,特别是关于扩展头的部分。根据用户提供的引用内容,引用[1]提到当RTP固定头中的扩展比特位置为1时,会有一个可变长度的头扩展部分。这部分包含16位的长度域,指示扩展项中的32位字数,不包括扩展头本身。这说明扩展头的存在是由固定头中的一个标志位控制的。 接下来,引用[3]详细说明了扩展头的结构,包括ID、传输方向和描述URI。特别是ID在不同的头类型中有不同的保留值,比如one-byte头中0和15是保留的。此外,扩展头需要在SDP中通过a=extmap行进行声明,例如指定URI和方向。这里可能需要解释SDP的作用,以及如何通过它来协商扩展头的使用。 用户可能想知道具体的定义步骤,所以需要分点说明。首先,设置固定头中的扩展标志位,然后构造扩展头部分,包括长度、标识符和扩展内容。使用SDP进行协商也是关键步骤,需要举例说明a=extmap的格式,如引用[3]中的例子。 另外,要注意的是RTP扩展头的设计原则,引用[2]提到RTP是故意不完整的协议框架,允许通过修改或添加报头来定制。这意味着扩展头可以根据应用需求灵活定义,但需要遵循规范,比如在IANA注册URI或使用临时URI。 用户可能还会关心实际应用中的注意事项,比如扩展头的长度限制,如何避免冲突,以及是否需要标准化的URI。这时候需要提到IANA注册的重要性,以及如何确保不同实现之间的互操作性。 总结下来,回答的结构应该是:首先说明扩展头的基本结构和触发条件,然后分步骤讲解如何定义和声明扩展头,接着举例说明SDP中的配置,最后提到设计时的注意事项。同时,要确保引用正确的参考资料,比如引用[1]、[2]、[3]中的相关内容,并在适当的位置添加引用标识。</think>在RTP协议中定义和使用扩展头字段需要遵循以下核心规范: ### 一、扩展头触发条件 当RTP固定头的$X$标志位设置为$1$时,报文将包含头扩展部分[^1]。扩展头结构为: $$ 0 1 2 3 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 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ID | length | extension content | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ $$ ### 二、扩展头定义步骤 1. **设置X标志位** 在RTP固定头中将$X$比特置$1$,声明扩展头的存在[^1] 2. **构造扩展头** - **16位标识符**:前$16$比特定义扩展类型(ID),需避免使用保留值0和15(one-byte模式)[^3] - **16位长度域**:以$32$比特字为单位声明扩展内容长度 - **自定义内容**:遵循上层协议定义的格式,例如时间戳元数据、加密参数等 3. **SDP协商声明** 在会话描述协议中通过`a=extmap`行声明扩展头: ```sdp a=extmap:<ID>[/<direction>] <URI> [extension attributes] ``` 如会议时间扩展声明: ```sdp a=extmap:2/sendrecv http://example.com/time-metadata ``` ### 三、设计注意事项 1. **互操作性**:扩展ID在会话范围内必须唯一,建议通过信令协商分配 2. **标准化扩展**:公共扩展应在IANA注册URI(格式为`urn:ietf:params:rtp-hdrext:*`) 3. **长度限制**:扩展总长度不得超过$2^{16}-1$个32位字 4. **方向控制**:通过`sendonly/recvonly`等限定符控制扩展头的传输方向
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值