rtp载荷h264码流分析
H.264 的基本流由一系列NALU(Network Abstraction Layer Unit )组成,不同的NALU数据量各不相同。当数据流是储存在介质上时,在每个NALU 前添加起始码:0x000001,用来指示一个 NALU的起始和终止位置。在这样的机制下,在码流中检测起始码,作为一个NALU得起始标识,当检测到下一个起始码时,当前NALU结束。每个NALU单元由一个字节的 NALU头(NALU Header)和若干个字节的载荷数据(RBSP)组成。所以当数据量从存储介质中读出时才头四个自己是0x00 0x00 0x00 0x01,但在网络传输中,你就看不到0x00 0x00 0x00 0x01了。
RTP,RTCP数据和RTSP数据共享TCP数据通道,RTP和RTCP数据会以$符号+1个字节的通道编号+2字节长,共4个字节的前缀开始,流数据紧跟其后。RTSP数据是没有前缀数据的。RTP数据和RTCP数据的区别在于第二个字节的通道编号,据观察RTP通道编号是偶数,RTCP通道编号是奇数。(可参考RFC2326 10.12 Embedded (Interleaved) Binary Data)
Interleaved Fream包结构如下:
WireShark抓包具体分析如下:
RTSP Interleaved Frame
0x24 (魔法数) |
0x00 (通道0) |
0x00 0x26 (RTSP Interleaved Frame包含的数据的的大小) |
80 60 43 72 26 9f 23 94 89 34 23 ba (RTP头) |
67 64 00 1f ac 2c 6a 81 40 16 e9 b8 08 08 0a 00 00 03 00 02 00 00 03 00 65 08 (H264数据) |
RTP 头分析,下面的文章写的很详细:
https://blog.csdn.net/chen495810242/article/details/39207305
H264数据分析
(RFC3984 5.3. NAL Unit Octet Usage)
(https://tools.ietf.org/html/rfc3984#section-5.1)
单个单元包:第一个字节的低5位决定Type。
Type = 0x67 & 0x1F
其他参考链接:
https://blog.csdn.net/qq_25005909/article/details/78622326
https://blog.csdn.net/rankun1/article/details/52681629