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 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
单元结构图
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。