RTP

RTP #

报文结构 #

  • Ver.(2 bits)是目前协议的版本号码,目前版号是 2。
  • P(1 bit)是用于 RTP 报文(packet)结束点的预留空间,视报文是否需要多余的填塞空间。
  • X(1 bit)是否在使用延伸空间于报文之中。
  • CC(4 bits)包含了 CSRC 数目用于修正标头(fixed header)。
  • M(1 bit)是用于应用等级以及其原型(profile)的定义。如果不为零表示目前的数据有特别的程序解译。
  • PT(7 bits)是指 payload 的格式并决定将如何去由应用程序加以解译。
  • SSRC 是同步化来源。

RTP Header #

前 12 个字节出现在每个 RTP 包中,仅仅在被混合器插入时,才出现 CSRC 识别符列表。


RTP/PS/H.264 #

基于 RTP 的 PS 封装 首先按照 ISO/IEC 13818-1:2000 将视音频封装成 PS 包, 再将 PS 包以负载的方式封装成 RTP 包

PS 包 #

进行 PS 封装时,将每个视频帧封装为一个PS 包, 且每个关键帧的 PS 包中包含系统头(System Header)和 PSM(Program Stream Map)。

系统头和 PSM 放置于 PS 包头之后,第一个 PES 包之前。

RTP 包 #

首条数据结构:RTP Header + PS Header + PS System Header + PSM + PESVHeader + Payload

非首条数据结构:RTP Header + PS Header + PESVHeader + Payload

少了 PS System Header + PSM

  • PESV: 视频
  • PESA: 音频

知道了 PS 包的结构,就可以用处理程序解析数据, 从而把原始流 ES(H264)从 PES 包中解析出来

PES Payload 就是 H264 数据

RTP 头部 #

去掉 12 字节的 RTP 头部,保存下来的就是 H264 PS 流, VLC 可播放

第 1 字节

第 2 字节

第 3-4 字节

第 5-8 字节

第 9-12 字节

RTP Payload #

  • RTP Payload 中承载的即为 PS 数据
  • 起始的 00 00 01 ba 代表 PS 包的开始
  • 接下来跳过 9 个字节,暂时不关心它的内容
  • 看第 10 个字节 fe,对应着二进制数据的 1111 1110
    • 它的后三位为 110 为十进制的 6,即接下来的六个字节是扩展内容
  • 跳过 6 个字节后,遇到了 00 00 01 bb,这时来到了 PS System Header 部分
  • 紧邻的 00 12 两个字节表示 System Header 的长度,换算为十进制,即为 18 个字节
  • 在 header_length 后共有 6 个字节的数据
  • 之后就是 stream_id 字段(码流种类
    • system_id 值为 e0
    • 0xE0: 视频流
    • 0xC0: 音频流


  • payload type: PS (96)
  • SSRC: Synchronization source
    • Synchronization Source identifier (32 bits)
  • CSRC: Contributing source
    • Contributing source IDs (32 bits each)


RTP -> RTSP/RTMP #

需要遇到 sps pps idr 才能生成

NALU (NAL Units) 组成

  • NALU 头(00 00 00 01 或者 00 00 01
  • sps (序列参数集)
  • pps (图像参数集合)
  • slice
  • sei
  • IDR 帧
  • I 帧(在图像运动变化较少时,I 帧后面是 7 个 P 帧,如果图像运动变化大时,一个序列就短了,I 帧后面可能是 3 个或者 4 个 P 帧)
  • P 帧
  • B 帧等数据。

一个完整的 NALU 单元结构图

参考:


参考 #


本文访问量

本站总访问量

本站总访客数