RTSP基本原理
实时流传输协议(RTSP:RealTimeStreaming Protocol1)是一种网络传输协议,旨在发送低延迟流。
 该协议由RealNetworks,Netscape和哥伦比亚大学的专家在1996年开发。它定义了应如何打包流中的数据以进行传输。
 类似一个控制命令的协议play teardown
 负责音视频的数据发送
 SDP是封装在RTSP里面
RTP协议
文档:3-RFC3550(英文)-RTPATransport Protocol for Real-Time Applications.pdf
 3-RFC3550(中文)-RTP协议中文版.pdf
推流详细过程
第一步:OPTION
1、C->S:OPTION request //询问S有哪些方法可用

 1、.S->C:OPTION response //S回应信息的public头字段中包括提供的所有可用方法

注:P—演示,C—客户端,S—服务器, S(对象栏)—流
第二步:ANNOUNCE 发送媒体描述信息
2.C->S:ANNOUNCE request //客户端发送媒体描述信息给服务器
 
 1.profile-level-id:
 profile-level-id是16进制表示的3个字节的整数,按顺序分成3个字节,每个字节分别表示不同的含义。
- profile_idc
- profile-iop: 前6位分别是constraint_set0_flag, constraint_set1_flag, constraint_set2_flag, constraint_set3_flag, constraint_set4_flag, constraint_set5_flag, 最后两位为保留位
- level_idc
 接收端默认支持哪种sub-profile由profile_idc和profile-iop中的几个bit共同决定。如下表:
 具体profile的名字含义如下:
 CB: Constrained Baseline profile,
 B: Baseline profile,
 M: Main profile,
 E: Extended profile,
 H: High profile,
 H10: High 10 profile,
 H42: High 4:2:2 profile,
 H44: High 4:4:4 Predictive profile,
 H10I: High 10 Intra profile,
 H42I: High 4:2:2 Intra profile,
 H44I: High 4:4:4 Intra profile,
 C44I: CAVLC 4:4:4 Intra profile
 2.packetization-mode:
 packetization-mode表示图像数据包分拆发送的方式。
 0: Single NAL (Network Abstraction Layer),每帧图像数据全部放在一个NAL单元传送;
 1: Not Interleaved,每帧图像数据被拆放到多个NAL单元传送,这些NAL单元传送的顺序是按照解码的顺序发送;
 2: Interleaved,每帧图像数据被拆放到多个NAL单元传送,但是这些NAL单元传送的顺序可以不按照解码的顺序发送
 实际上,只有I帧可以被拆分发送,P帧和B帧都不能被拆分发送。所以如果packetization-mode=1,则意味着I帧会被拆分发送。
 3.max-mbps:
 max-mbps表示每秒钟能处理的最大宏块数量。
 4.max-fs:
 max-fs表示接收端能够解码的一帧图像的最大尺寸,这个尺寸用这帧图像包含的宏块数来量化,即max-fs的数值。720p的max-fs典型值是3600, 1080p的max-fs典型值是8100。
 5.max-fps:
 max-fps表示接收端能够处理的最大帧率。如果发送端发送的帧率高于接收端设置的值,那么接受端会在解码后丢掉多余的帧。但是如果解码说可以支持1080p@30fps,其实它也是可以支持720p@60fps的。所以可以通过设置max-fps来提高处理的效率。
 6.max-br:
 max-br表示最大比特率,对VCL HRD参数是以1000bit为单位,对NAL HRD参数是以1200bit为单位。例子中max-br=1500,表示VCL HRD参数的最大比特率是1500 kbits/s,NAL HRD参数的最大比特率是1800 kbits/s。
 7.max-dpb:
 max-dpb(decoded picture buffer)表示用来存储解码后图像的buffer的最大尺寸。
 8.level-asymmetry-allowed:
 level-asymmetry-allowed表示是否允许两端编码的Level不一致。注意必须两端的SDP中该值都为1才生效。
 max-mbps,max-fs,max-fps,max-br和max-dpb这几个数值必须大于profile-level-id所指定的值,比如说level-id是Level 3.1,那么3.1规定的最大fs是3600,那么SDP中的max-fs必须要大于3600。但是如果真的按max-fs去编码,那你的帧率就要比profile-level-id规定的帧率要低。总之就是一个参数比规定的高,那其他方面参数就要比规定的要低,以此来平衡。
 9.sprop-parameter-sets
 禁止位,初始为0,当网络发现NAL单元有比特错误时可设置该比特为1,以便接收方纠错或丢掉该单元。
 fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;irdexlength=3;indexdeltalength=3; config=119056E500
m=audio 9832 RTP/AVP 97
 a=rtpmap:97 mpeg4-generic/48000/2
 a=fmtp:97 streamtype=5;profile-level-id=1;sizeLength=13;IndexLength=3;indexDeltaLength=3;mode=AAC-hbr;config=2190;
 c=IN IP4 10.143.44.169
 “m=” :video:媒体名称  9832:端口  RTP/AVP:传输协议  97:RTP协议中的pt值
 “a=rtpmap”:97:RTP协议中的pt值  mpeg4-generic:音频编码  48000:音频采样率  2:通道数
 “a=fmtp”:streamtype:aac为5  profile-level-id: 1表示低复杂度类型  sizeLength:表示AU-size占用位数  
 IndexLength:表示AU-Index占用位数  indexDeltaLength:表示AU-Index-delta占用位数  mode:表示编码模式
 config:16进制2190 转化为二进制:00100 0011 0010 000
 00100:aac的profile,这里为5
 0011:3,表示采样率为48000
 0010: 2,表示通道数
 采样率表格

 2.S->C:ANNOUNCE response //S回应媒体描述信息,并返回了Session ID

第三步:SETUP建立RTSP会话
3.1C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话

 RTP:30574
 RTCP:30575
 mode = record:推流
 3.1 S->C:SETUP response 回建立的Session ID; //S建立会话,通过Transport头字段返回选择的具体转输选项项,并返
  RTP:30574->31354
RTP:30574->31354
 
 RTCP:30575->31355

 3.2C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话

 C->S
 RTP:30576
 RTCP:30577
 3.2S->C:SETUP response //S建立会话,通过Transport头字段返回选择的具体转输选项
 
 C->S
 RTP:30576->32276
 
第四步:RECORD请求传送数据
4.C->S:RECORD request //C向S请求发送数据
 
4.S->C:RECORD response //S回应该允许的信息
 
第五步:RTP数据推送
C->S:发送流媒体数据 //通过RTP协议传送数据
第六步:TEARDOWN关闭会话,退出
6.C->S:TEARDOWN request //C请求关闭会话
 
总结
第一步:OPTION
 第二步:ANNOUNCE发送媒体描述信息
 第三步:SETUP建立RTSP会话
 第四步:RECORD请求传送数据
 第五步:RTP数据推送
 第六步:TEARDOWN关闭会话,退出
拉流详细流程
第一步:查询服务器端可用方法
1.C->S:OPTION request //询问S有哪些方法可用
 1.S->C:OPTION response //S回应信息的public头字段中包括提供的所有可用方法
第二步:DESCRIBE得到媒体描述信息
2.C->S:DESCRIBE request //要求得到S提供的媒体描述信息
 
 2.S->C:DESCRIBE response //S回应媒体描述信息,一般是sdp信息
 
 
第三步:SETUP建立RTSP会话
3.1C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建会话
 3.1 S->C:SETUP response //S建立会话,通过Transport头字段返回选择的具体转输选项
 3.2 C->S:SETUP request //通过Transport头字段列出可接受的传输选项,请求S建立会话
 3.2 S->C:SETUP response //S建立会话,通过Transport头字段返回选择的具体转输选项
第四步:PLAY请求开始传送数据
4.C->S:PLAY request //C请求S开始发送数据
 
 4.S->C:PLAYresponse //S回应该请求的信息

 可能流已经播放了一段时间,npt=起始时间,目前时先拉流在推流的
第五步:RTP数据传送播放中
S->C:发送流媒体数据 //通过RTP协议传送数据
第六步:TEARDOWN关闭会话,退出
6.C->S:TEARDOWN request //C请求关闭会话
 6.S->C:TEARDOWN response//S回应该请求
SSRC
同步信源(SSRC)标识符,32个bit。标记RTP的来源,
 推流:自己定义一个SSRC
 拉流:会获取SSRC,可以根据SSRC识别信息
总结:
第一步:查询服务器端可用方法
 第二步:DESCRIBE得到媒体描述信息
 第三步:SETUP建立RTSP会话
 第四步:PLAY请求开始传送数据
 第五步:RTP数据传送播放中
 第六步:TEARDOWN关闭会话,退出
推流拉流总结
第一步 option是一样的
 第二步 有区别,推流:ANNOUNCE; 拉流:DESCRIBE
 第三步: SETUP
 第四步:推流:RECORD;拉流:PLAY
 第五步:RTP传输,只是方向刚好相反
 第六步:TEARDOWN
参考
RTSP 很详细的英文文档_setserveraddressandportforsdp-CSDN博客
 最详细的音视频流媒体传输协议-rtsp协议详解 - 知乎 (zhihu.com)
 SDP中H264 RTP Payload各项参数含义_level-asymmetry-allowed-CSDN博客
 生成aac sdp文件 - Vzf - 博客园 (cnblogs.com)
 Session入门(非常详细),从零基础入门到精通,看完这一篇就够了_创建session-CSDN博客
 RTP报文头中 SSRC和CSRC区别-CSDN博客