在这里并不讲解rtp/rtcp、rtsp、264等协议,只是分析记录一下rtsp流程报文,也不对报文进行过多的解析,因为已经被Wireshark分析的很彻底了。
本文更多的是做一个备忘录使用,图片堆叠而成。
1.基本描述
一个摄像头IPC,ip 192.168.1.88
PC的ip 192.168.1.2
PC上VLC软件,在网络串流输入:
- 首先当然是TCP的三次握手建连接了
- 然后开始rtsp的交互流程,从Option到Play
- 然后开始rtp传音视频数据,rtcp做控制
- 最后VLC上停止播放,也就是发个TearDown,停止传输,RTCP的goodbye,还有TCP的断开连接
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/