RTSP场景下RTP协议详解及音视频打包全流程

打印 上一主题 下一主题

主题 830|帖子 830|积分 2490

RTSP场景下RTP协议详解及音视频打包全流程


一、RTSP与RTP的关系



  • RTSP:负责媒了解话控制(DESCRIBE、SETUP、PLAY、PAUSE),通过SDP协商传输参数(端口、编码格式、封装模式)。
  • RTP:现实传输音视频数据,基于UDP/TCP,与RTCP配合实现同步和网络状态反馈。

二、RTP头字段详解(RFC 3550)

RTP头固定12字节,字段寄义及填写规则如下:
字段名位宽取值阐明Version (V)2 bits固定为2(0x80),表示RTP版本。Padding §1 bit载荷末尾是否有添补字节(如加密对齐)。RTSP场景通常为0Extension (X)1 bit是否启用头部扩展(如RFC 5285界说)。默认0,启用时需在SDP中声明。CSRC Count (CC)4 bits贡献源(CSRC)数量。单路流通常为0Marker (M)1 bit关键帧竣事标记:视频的最后一个分片包设为1;音频包通常为0。Payload Type (PT)7 bits载荷类型,SDP中动态映射(如96=H.264, 97=H.265, 8=PCMA, 14=MPEG Audio)。Sequence Number16 bits包序列号,每发送一个RTP包自增1(用于检测丢包和乱序)。Timestamp32 bits时间戳,基于编码时钟频率:<br>- 视频:90000 Hz(每帧增量=90000/fps)<br>- 音频:按采样率(如AAC=44100 Hz)。SSRC32 bits同步源标识符,随机天生,同一流中唯一。 示例:H.264视频包头(时间戳增量=3000,30fps):
  1. 80 60 00 01   // V=2, P=0, X=0, CC=0, M=0, PT=96 (H.264)
  2. 00 01          // Sequence Number = 1
  3. 00 00 0B B8    // Timestamp = 3000
  4. DE AD BE EF    // SSRC=0xDEADBEEF
复制代码

三、视频打包实现

1. H.264视频打包(RFC 6184)



  • NALU结构
  1.   +---------------+---------------+
  2.   |F|NRI| Type    | Payload Data  |
  3.   +---------------+---------------+
复制代码


  • 封装模式:由SDP参数packetization-mode界说。

    • Mode 0(单NALU) :直接封装小NALU(如SPS/PPS)。

  1.     RTP头 | NALU头(1B) | 数据
复制代码


  • Mode 1(FU-A分片) :大NALU分片传输,添加FU头和标记位。
  1.     RTP头 | FU Indicator(1B) | FU Header(1B) | 分片数据
复制代码


  • FU Indicator:F|NRI|Type=28(0x7C)。
  • FU Header:S|E|R|Type(S/E标记分片起止,Type为原始NALU类型)。

    • Mode 2(STAP-A组合) :聚合多个小NALU。

  1.     RTP头 | STAP头(1B) | NALU1长度(2B) | NALU1数据 | NALU2长度(2B) | NALU2数据
复制代码


  • 关键帧分片示例
  1.   // 第一个分片
  2.   RTP头(M=0) | 0x7C | 0x85(S=1, Type=5) | 分片数据
  3.   // 最后一个分片
  4.   RTP头(M=1) | 0x7C | 0x45(E=1, Type=5) | 分片数据
复制代码
2. H.265视频打包(RFC 7798)



  • NALU头扩展:2字节,包含层次标识(LayerID)和时域层级(TID)。
  1.   +---------------+---------------+---------------+
  2.   |F| Type(6b) | LayerID(6b) | TID(3b)     |
  3.   +---------------+---------------+---------------+
复制代码


  • 分片模式(FU-A)
  1.   RTP头 | FU Indicator(2B) | FU Header(1B) | 分片数据
复制代码


  • FU Indicator:Type=49(0x62)。
  • FU Header:同H.264的S/E标记,Type为原始NALU类型(如32=IDR)。
  • 示例
  1.   // 第一个分片
  2.   RTP头 | 0x62 0x80(LayerID=0, TID=1) | 0x80(S=1, Type=32) | 分片数据
复制代码
3. SDP配置示例

  1. m=video 0 RTP/AVP 96
  2. a=rtpmap:96 H264/90000
  3. a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0LAH9kAUAW6EAAAAwAQAAADA8PFRQ=,aM48gA==
复制代码

四、音频打包实现

1. G.711(PCMU/PCMA)



  • 静态PT:0(PCMU)、8(PCMA)。
  • 封装:直接添补裸数据,时间戳按样本数递增。
  1.   RTP头(PT=0/8) | 音频样本(每样本1字节)
复制代码
2. AAC(RFC 3640)



  • 动态PT:通过SDP协商(如96)。
  • 封装:添加AU头声明数据长度。
  1.   RTP头 | AU头长度(2b) | AU头(16b长度) | AAC数据
复制代码
3. Opus(RFC 7587)



  • 封装:直接添补Opus帧,支持分片。
  1.   RTP头 | TOC字段(配置参数) | Opus数据
复制代码

五、音视频同步机制


  • 时间戳对齐

    • 音频时间戳增量 = 采样数(如AAC每帧1024样本 → 增量=1024)。
    • 视频时间戳增量 = 90000 / 帧率(如30fps → 增量=3000)。

  • RTCP同步

    • 发送端通过SR包传递NTP时间与RTP时间戳的映射。
    • 吸收端盘算播放时序毛病,动态调解缓冲区。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表