在这里并不讲解rtp/rtcp、rtsp、264等协议,只是分析记录一下rtsp流程报文,也不对报文进行过多的解析,因为已经被Wireshark分析的很彻底了。

本文更多的是做一个备忘录使用,图片堆叠而成。

 

1.基本描述

一个摄像头IPC,ip 192.168.1.88

PC的ip 192.168.1.2

PC上VLC软件,在网络串流输入:

然后Wireshark抓报文来分析吧。
  • 首先当然是TCP的三次握手建连接了
  • 然后开始rtsp的交互流程,从Option到Play
  • 然后开始rtp传音视频数据,rtcp做控制
  • 最后VLC上停止播放,也就是发个TearDown,停止传输,RTCP的goodbye,还有TCP的断开连接
 
 
2.RTSP细节
下面开始具体分析一下RTSP具体流程:

Opiton—Describe–Setup-Play——–………….——-Teardown

 

C表示RTSP客户端即PC,S表示RTSP服务端即摄像头
2.1 Option

 C->S: OPTION request            //询问S有哪些方法可用
S->C: OPTION response        //S回应信息中包括提供的所有可用方法

 

这里提供的方法有如上。

2.2 Describe

 C->S: DESCRIBE request      //要求得到S提供的媒体初始化描述信息
S->C: DESCRIBE response      //S回应媒体初始化描述信息,主要是sdp,这里面有个简单的SDP协议

 

2.3 Setup

C->S: SETUP request         //设置会话属性,以及传输模式,提醒S建立会话
S->C: SETUP response         //S建立会话,返回会话标识符及会话相关信息

这里的setup有两个,即分别对应前面的trackID=1、trackID=2,也就是Describe中的视频与音频了。

 

2.4 Play

C->S: PLAY request          //C请求播放
S->C: PLAY response          //S回应请求信息

 

 

2.5 发送数据

S->C: 发送流媒体数据

在上面的play命令后将开始流传输,这块与rtp/rtcp相关,单独摘出来在后面介绍。

 

2.6 Teardown

C->S: TEARDOWN request     //C请求关闭会话

S->C: TEARDOWN response     //S回应请求

 

这之后还会有:rtcp发送goodbye、tcp断开连接。

 

2.6  其他

在这里补充一个get_parameter:

 

 

3.流传输

在上面RTSP细节第4步摄像头回应了Play Response后,将会开始传输流数据,这里包括了视频流与音频流,在Describe中看到为:

 

 

3.1视频传输

 

在H264协议里定义了三种帧,完整编码的帧叫I帧,参考之前的I帧生成的只包含差异部分编码的帧叫P帧,还有一种参考前后的帧编码的帧叫B帧,对定义的理解以及264的处理方法可以在网上进一步了解。

于是刚开始传输的是第一个I帧,而I帧数据前会有一个参数集传输:

这三条具体为:

  根据本RTP荷载规范, 大于00的NRI值指示相对传输优先级, 象编码器决定的一样。 MANE可以使用本信息保护更重要的NAL单元。最高的传输优先级是11, 依次是 10, 01;00 最低。H.264编码器必须根据H.264规范设置NRI值(subclause 7.4.1)当nal_unit_type 范围的是1到12. 特别是, H.264规范要求对于nal_unit_type为6,9,10,11,12的NAL单元的NRI的值应该为0。对于nal_unit_type等于7,8 (指示顺序参数集或图像参数集)的NAL单元,H.264编码器应该设置NRI为11 (二进制格式)对于nal_unit_type等于5的主编码图像的编码片NAL单元(指示编码片属于一个IDR图像), H.264编码器应设置NRI为11。这也就对上面做出了解释。

 

后面开始真正的图像数据传输,I帧分片传输,P帧分片传输。

I帧的第一片:

I帧的中间片:

I帧的最后一片:

 

然后开始P帧,同样列举开始中间结尾三片:

 

再看第一帧与第二帧,也就是上面提到的第一个I帧,和紧跟其后的第一个P帧,这两帧的Timestamp相差360,也就是9000/25。

随后图像大变动后会有新的一个I帧开始,然后再尾随一串P帧:

 

 

3.2音频传输

 

3.2 RTCP控制

补充:

1、RFC3984里提到的三种H.264 over RTP封装,分别是Single NALU(一个RTP含一个NALU)、STAP-A(一个RTP包含多个NALU)、FU-A(一个NALU分布到多个RTP包)三种封装格式,且会自动把SPS和PPS放到裸码流文件头部。

2、查看rtp包的payload type,比如说type是96,那么在wireshark工具栏选择Edit->preferences->protocols->H264, 把H264 dynamic payload types设成96,就可以在wireshark中看到,payload types 为96的数据自动被解析为h264的nalu单元

 转自:https://www.pianshen.com/article/33381630608/