RTSP协议
目录
- FFmpeg源码对应⽬录
- RTSP协议概述
- RTSP协议与HTTP协议区别
- 推流过程
- 推流详细过程
- 第⼀步:OPTION 查询服务器端可⽤⽅法
- 第⼆步:ANNOUNCE 发送媒体描述信息
- 第三步:SETUP建⽴RTSP会话
- 第四步:RECORD请求传送数据
- 第五步: RTP数据推送
- 第六步:TEARDOWN关闭会话,退出
- 推流详细过程
- 推流过程总结
- 拉流过程
- 拉流详细过程
- 第⼀步:查询服务器端可⽤⽅法
- 第⼆步:DESCRIBE得到媒体描述信息
- 第三步:SETUP建⽴RTSP会话
- 第四步:PLAY请求开始传送数据
- 第五步: RTP数据传送播放中
- 第六步:TEARDOWN关闭会话,退出
- 拉流详细过程
- 总结
1. FFmpeg源码对应⽬录
- rtsp.c 是总⼊⼝,推流拉流都是该⽂件
- rtspenc.c:推流的时候使⽤
- rtspdec.c:拉流的时候使⽤
2. RTSP协议概述
- RTSP 很详细的英⽂⽂档 https://blog.csdn.net/u012519333/article/details/52746375
- RTSP(Real-Time Stream Protocol )是⼀种基于⽂本的应⽤层协议,在语法及⼀些消息参数等⽅⾯,RTSP协议与HTTP协议类似。
- RTSP被⽤于建⽴的控制媒体流的传输,它为多媒体服务扮演“⽹络远程控制”的⻆⾊,对流媒体提供了诸如暂停,快进等控制。尽管有时可以把RTSP控制信息和媒体数据流交织在⼀起传送,但⼀般情况RTSP本身并不⽤于转送媒体流数据。媒体数据的传送可通过RTP/RTCP等协议来完成。
- ⼀次基本的RTSP操作过程是:
- ⾸先,客户端连接到流服务器并发送⼀个RTSP描述命令(DESCRIBE)。
- 流服务器通过⼀个SDP描述来进⾏反馈,反馈信息包括流数量、媒体类型等信息。
- 客户端再分析该SDP描述,并为会话中的每⼀个流发送⼀个RTSP建⽴命令(SETUP),RTSP建⽴命令告诉服务器客户端⽤于接收媒体数据的端⼝。
- 流媒体连接建⽴完成后,客户端发送⼀个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。
- 在播放过程中客户端还可以向服务器发送命令来控制快进、快退和暂停等。
- 最后,客户端可发送⼀个终⽌命令(TERADOWN)来结束流媒体会话
3. RTSP协议与HTTP协议区别
- RTSP引⼊了⼏种新的⽅法,⽐如DESCRIBE、PLAY、SETUP 等,并且有不同的协议标识符,RTSP为rtsp 1.0,HTTP为http 1.1;
- HTTP是⽆状态的协议,⽽RTSP为每个会话保持状态,有session的概念;
- RTSP协议的客户端和服务器端都可以发送Request请求,⽽在HTTPF 协议中,只有客户端能发送Request请求。
- 在RTSP协议中,载荷数据⼀般是通过带外⽅式来传送的(除了交织的情况),及通过RTP协议在不同的通道中来传送载荷数据。⽽HTTP协议的载荷数据都是通过带内⽅式传送的,⽐如请求的⽹⻚数据是在回应的消息体中携带的。
- RTSP使⽤ISO 10646(UTF-8) ⽽不是ISO 8859-1,以配合当前HTML的国际化;
- RTSP协议使用554端口,http使用80端口。
- RTSP使⽤URI请求时包含绝对URI。⽽由于历史原因造成的向后兼容性问题,HTTP/1.1只在请求中包含绝对路径,把主机名放⼊单独的标题域中;
4. 推流过程
1. 推流详细过程
1. 第⼀步:OPTION 查询服务器端可⽤⽅法
- C->S:OPTION request,询问S有哪些⽅法可⽤
- S->C:OPTION response,S回应信息的public头字段中包括提供的所有可⽤⽅法
2. 第⼆步:ANNOUNCE 发送媒体描述信息
-
C->S:ANNOUNCE request,客户端发送媒体描述信息给服务器
-
S->C:ANNOUNCE response,S回应媒体描述信息,并返回了Session ID
3. 第三步:SETUP建⽴RTSP会话
- C->S:SETUP request,通过Transport头字段列出可接受的传输选项,请求S建⽴会话
- 其中client_port=31590-31591含义为:
- RTP客户端发送端口为 31590
- RTCP客户端发送端口为 31591
- S->C:SETUP response,S建⽴会话,通过Transport头字段返回选择的具体转输选项,并返回建⽴的Session ID;
- 其中client_port=31590-31591;server_port=59472-59473含义为
- 客户端发送到服务器,RTP端口是: 31590(C) -> 59472(S)
- 客户端发送到服务器,RTCP端口是: 31591(C) -> 59473 (S)
- 例如RTP包信息:
- C->S:SETUP request,通过Transport头字段列出可接受的传输选项,请求S建⽴会话(重复setup步骤,建立音频会话)
- 其中,streamid=0表示建立video会话,streamid=1表示建立audio会话
- 其中,streamid=0表示建立video会话,streamid=1表示建立audio会话
- S->C:SETUP response,S建⽴会话,通过Transport头字段返回选择的具体转输选项
4. 第四步:RECORD请求传送数据
- C->S:RECORD request,C向S请求发送数据
- S->C:RECORD response,S回应该允许的信息
5. 第五步: RTP数据推送
- C->S:发送流媒体数据,通过RTP协议传送数据
- 视频数据
- 音频数据
6. 第六步:TEARDOWN关闭会话,退出
- C->S:TEARDOWN request,C请求关闭会话
- S->C:TEARDOWN response,S回应该请求
5. 推流过程总结
6. 拉流过程
1. 拉流详细过程
1. 第⼀步:查询服务器端可⽤⽅法
- C->S:OPTION request,询问S有哪些⽅法可⽤
- S->C:OPTION response,S回应信息的public头字段中包括提供的所有可⽤⽅法
2. 第⼆步:DESCRIBE得到媒体描述信息
-
C->S:DESCRIBE request,要求得到S提供的媒体描述信息
-
S->C:DESCRIBE response,S回应媒体描述信息,⼀般是sdp信息
3. 第三步:SETUP建⽴RTSP会话
-
C->S:SETUP request,通过Transport头字段列出可接受的传输选项,请求S建⽴会话(视频)
-
S->C:SETUP response,S建⽴会话,通过Transport头字段返回选择的具体转输选项
- 和推流不同点在于拉流ssrc是具体值, 推流是000000
- 和推流不同点在于拉流ssrc是具体值, 推流是000000
-
C->S:SETUP request,通过Transport头字段列出可接受的传输选项,请求S建⽴会话(音频)
-
S->C:SETUP response,S建⽴会话,通过Transport头字段返回选择的具体转输选项
4. 第四步:PLAY请求开始传送数据
- C->S:PLAY request,C请求S开始发送数据
- S->C:PLAY response,S回应该请求的信息
5. 第五步: RTP数据传送播放中
- S->C:发送流媒体数据,通过RTP协议传送数据
- ssrc就是在setup返回的ssrc
- video的ssrc来⾃服务器,audio的ssrc也是来自服务器
- audio
6. 第六步:TEARDOWN关闭会话,退出
- C->S:TEARDOWN request,C请求关闭会话
- S->C:TEARDOWN response,S回应该请求
7. 总结
-
推拉流过程区别
第⼀步 option是⼀样的
第⼆步 有区别,推流:ANNOUNCE; 拉流:DESCRIBE
第三步: SETUP
第四步:推流:RECORD;拉流:PLAY
第五步:RTP传输,只是⽅向刚好相反
第六步:TEARDOWN -
SSRC由谁来定义,是client还是server?
推流是客户端⾃⼰定义的
拉流的时候是服务器发送过来的 -
session id由谁⽽来
推流来⾃server,当C->S ANNOUNCE后,server reply时附带session id