rtp扩展头的使用

rtp确定头(rtp fixed header field)

通常情况下是12字节,如下图
rtp扩展头的使用_第1张图片

  • 版本(V):2bits。当前版本是2。
  • 填充(P):1bit。一般没有填充,是0。
  • 扩展位(X):1bit。如果有扩展,会在rtp头之后,payload之前增加rtp扩展头。
  • CSRC count(CC):4bits。一般为0。所以rtp固定头一般是12字节。
  • 上面是1byte
  • 标志位(M):1bit。The interpretation of the marker is defined by a profile.不太好翻译,先用原文。在打包h264数据时,表示一个frame的结束。
  • 负载类型(PT):7bits。范围是96-127。
  • 上面是1byte
  • 序列号(sequence number):16bits。一般是从0开始,但是没有强制要求。每发一个包,加一。
  • 上面是2bytes
  • 时间戳(timestamp):32bits。如果是视频,就是视频帧时间戳(单位秒)值乘以90000;如果是音频,就是音频帧时间戳(单位秒)乘以采样率,比如48k、16k。
  • 上面是4bytes
  • 同步源(SSRC):32bits。是一个随机值,用于区分每一路流。
rfc3550链接

https://tools.ietf.org/html/rfc3550#section-5.1

抓包举例(marker位)

rtp扩展头的使用_第2张图片

代码实现可以参考
    typedef struct
    {
        /* byte 0 */
        uint8_t csrc_len : 4; /* CC expect 0 */
        uint8_t extension : 1;/* X  expect 1, see RTP_OP below */
        uint8_t padding : 1;  /* P  expect 0 */
        uint8_t version : 2;  /* V  expect 2 */
        /* byte 1 */
        uint8_t payload : 7; /* PT  RTP_PAYLOAD_RTSP */
        uint8_t marker : 1;  /* M   expect 1 */
        /* byte 2,3 */
        uint16_t seq_no;   /*sequence number*/
        /* byte 4-7 */
        uint32_t timestamp;
        /* byte 8-11 */
        uint32_t ssrc; /* stream number is used here. */
        uint8_t data[0];
    } RTP_FIXED_HEADER;/*12 bytes*/

rtp扩展头

当确定头的扩展位是1的时候,就会有扩展头。

  • 扩展头是跟在确定头后的。
  • 如果有CSRC,就跟在CSRC后。
    rtp扩展头的使用_第3张图片
rtp扩展头格式
扩展头长度 扩展头内容
16bits 自定义
假设为L(rfc文档没有定义) 长度32bits*L(其中,L可以为0)
rfc3550链接

https://tools.ietf.org/html/rfc3550#section-5.3.1

抓包举例

rtp扩展头的使用_第4张图片

你可能感兴趣的:(其他)