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 + PESV(Header + Payload)
非首条数据结构:RTP Header + PS Header + PESV(Header + 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部分- PS 数据格式的标准文档可以参考这个 PDF:iso13818-1:2000.pdf
- 紧邻的
00 12两个字节表示 System Header 的长度,换算为十进制,即为 18 个字节 - 在 header_length 后共有 6 个字节的数据
- 之后就是 stream_id 字段(码流种类)
- system_id 值为
e0 - 0xE0: 视频流
- 0xC0: 音频流
- system_id 值为

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

RTP -> RTSP/RTMP #
需要遇到
spsppsidr才能生成
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 单元结构图

参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。