一、rtsp分析 rtsp是通过tcp传输的,过滤数据包,分析如下: 追踪tcp流,可以得到如下: //tcp.port == 1234过滤得到:
OPTIONS rtsp://127.0.0.1:1234/ RTSP/1.0 CSeq: 2 User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
RTSP/1.0 200 OK Server: VLC/3.0.16 Content-Length: 0 Cseq: 2 Public: DESCRIBE,SETUP,TEARDOWN,PLAY,PAUSE,GET_PARAMETER
DESCRIBE rtsp://127.0.0.1:1234/ RTSP/1.0 CSeq: 3 User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28) Accept: application/sdp
RTSP/1.0 200 OK Server: VLC/3.0.16 Date: Wed, 09 Mar 2022 02:51:18 GMT Content-Type: application/sdp Content-Base: rtsp://127.0.0.1:1234/ Content-Length: 547 Cache-Control: no-cache Cseq: 3
v=0 o=- 16560462224506433247 16560462224506433247 IN IP4 LAPTOP-QF7IG4BT s=Unnamed i=N/A c=IN IP4 0.0.0.0 t=0 0 a=tool:vlc 3.0.16 a=recvonly a=type:broadcast a=charset:UTF-8 a=control:rtsp://127.0.0.1:1234/ m=audio 0 RTP/AVP 14 b=AS:128 b=RR:0 a=rtpmap:14 MPA/90000/2 a=control:rtsp://127.0.0.1:1234/trackID=4 m=video 0 RTP/AVP 96 b=RR:0 a=rtpmap:96 H264/90000 a=fmtp:96 packetization-mode=1;profile-level-id=64001f;sprop-parameter-sets=Z2QAH6zZQPARfvARAAADA+kAALuAjxgxlg==,aOvjyyLA; a=control:rtsp://127.0.0.1:1234/trackID=5 SETUP rtsp://127.0.0.1:1234/trackID=4 RTSP/1.0 CSeq: 4 User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28) Transport: RTP/AVP;unicast;client_port=57200-57201
RTSP/1.0 200 OK Server: VLC/3.0.16 Date: Wed, 09 Mar 2022 02:51:18 GMT Transport: RTP/AVP/UDP;unicast;client_port=57200-57201;server_port=57202-57203;ssrc=99917EDA;mode=play Session: c81572e98faef68e;timeout=60 Content-Length: 0 Cache-Control: no-cache Cseq: 4
SETUP rtsp://127.0.0.1:1234/trackID=5 RTSP/1.0 CSeq: 5 User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28) Transport: RTP/AVP;unicast;client_port=57204-57205 Session: c81572e98faef68e
RTSP/1.0 200 OK Server: VLC/3.0.16 Date: Wed, 09 Mar 2022 02:51:18 GMT //单播客户端 偶数端口rtp 奇数端口rtcp Transport: RTP/AVP/UDP;unicast;client_port=57204-57205;server_port=57206-57207;ssrc=33E4A5A5;mode=play Session: c81572e98faef68e;timeout=60 Content-Length: 0 Cache-Control: no-cache Cseq: 5
PLAY rtsp://127.0.0.1:1234/ RTSP/1.0 CSeq: 6 User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28) Session: c81572e98faef68e Range: npt=0.000-
RTSP/1.0 200 OK Server: VLC/3.0.16 Date: Wed, 09 Mar 2022 02:51:19 GMT RTP-Info: url=rtsp://127.0.0.1:1234/trackID=4;seq=33470;rtptime=673918348, url=rtsp://127.0.0.1:1234/trackID=5;seq=29052;rtptime=673918348 Range: npt=1636.471649- Session: c81572e98faef68e;timeout=60 Content-Length: 0 Cache-Control: no-cache Cseq: 6
===================================================
二、RTP报文分析 1.报文 三、rtcp包分析 RTCP也是用UDP来传送的,但RTCP封装的仅仅是一些控制信息,因而分组很短,所以可以将多个RTCP分组封装在一个UDP包中。RTCP有如下五种分组类型 下面只讲述SR类型 发送端报告分组SR(Sender Report)用来使发送端以多播方式向所有接收端报告发送情况。SR分组的主要内容有:相应的RTP流的SSRC,RTP流中最新产生的RTP分组的时间戳和NTP,RTP流包含的分组数,RTP流包含的字节数。SR包的封装如图所示 四、H264包分析 1.H264中NAL UNIT HEADER简介 原始码流都是由一个个的 NALU(Network Abstract Layer)网络抽象层 连续组成,其中NALU=[StartCode] + [NALU Header] + [NALU Payload]组成,其中 StartCode:表示一个NALU的开始,一般情况下是以4字节“00 00 00 01”或者3字节“00 00 01”,一般4字节居多。 NALU Header:表示一组视频编码的头部信息,具体下面分析。 Payload:表示原始字节序列的有效载荷。
NAL UNIT HEADER 下面对比一下原始码流的H264和H265的NAL unit header。其中H264的Nal Unit头是一个字节,具体每个位表示如下: VCL: Video Coding Layer 解析原始码流的H264 TYPE方式: //定义header[4]为去除掉“00 00 00 01”之后的那个字节 int type = header[4] & 0x1F 这里说明一下,有些编码是没有SEI帧的,SEI这个增强信息帧中一般填入一些,人脸识别的坐标等信息,也可以自定义一些信息。一般的流都是按照sps,pps,I ,p,I,P……的顺序发送的,其中流媒体发送的时候为了能够在任何点都能够解析编码,通常会在I帧前添加sps和pps两帧的单独包或者聚合包,之后再发送I帧。
RTP包发送的时候,就是将原始码流中的“00 00 00 01”去掉,按照封装格式封装,然后为每一个封装添加RTP header,再发送出去。 在RTP其中CC 很多情况下为0,即没有CSRC信息,所以通常情况下RTP header是由12个字节组成的。 如果使用UDP传输的话,直接使用这个RTP header;但是在tcp传输的时候会在header前在添加四个字节: ? [magic number]+[channel number]+[data length] H264数据包如下:
2.H.264 RTP 载荷封装格式 TYPE的类型说明 这里我们先说下Type的类型,RTP中增加了H264中23中以外的格式,先来看下这个header头部 这个Type类型用于区分封装的类型,H.264的帧类型1-23之间,之后RTP又有新增,如下: 这里有些类型分为A型和B型,区别在于是否含有(DON, DONB, DOND)信息,含有的为B型,不含有的为A型。我们一般情况下用到的都是A型,不含有(DON, DONB, DOND)信息的,是我们主要分析的对象。 所以从封装标准文档中看,分为三种格式分别为:Single NAL unit,aggregation packet,Fragmentation unit。
单个NAL包:SINGLE NAL UNIT PACKET 这种很简单,一个 RTP 包仅由一个完整的 NALU 组成. 这种情况下 RTP NAL 头类型字段和原始的 H.264的 NALU 头类型字段是一样的,即在范围1到23之间
聚合包:AGGREGATION PACKETS 单时间聚合包:SINGLE-TIME AGGREGATION PACKET
多时间聚合包:MULTI-TIME AGGREGATION PACKETS (MTAPS) 多时间聚合包分为两种:MTAP16和MTAP24,区别在于每个NALU TS offset的长度一个是16位,一个是24位。 MTAP16格式 MTAP24格式
分片单元:FRAGMENTATION UNITS (FUS) FU-A 的格式如下 下面是FU indicator,FU Indicator其实和NAL头部几乎一样,就是nal类型变成了分片包的类型28,原先的nal类型保存到了FU Header中的Type。 FU header 这些内容填充好之后,就和payload数据合成一个RTP包,然后发送出去。 这里S=0,E=1,R=0 TYPE= 0X5C & 0X1F = 28 TYPE = 0X81&0X1F = 1 (P帧) 10000001—》S=1, E=0,R=0 P的起始包;
参考:https://www.freesion.com/article/2309579039/
|