流媒体协议-RTSP简介

目录

1. **RTSP概述**:   

2. **RTSP协议交互过程**:

3. **RTSP拉流详解**:

3.1 OPTION请求响应示例:

3.2 DESCRIBE方法获取媒体流信息

3.3 SETUP方法建立传输通道:

3.4 PLAY方法开始播放

3.5 TEARDOWN方法结束播放

4. **RTSP推流方式说明**:

5. **RTSP方法详解**:

6. **RTSP交互注意事项**:


1. **RTSP概述**:
   

- RTSP(Real Time Streaming Protocol)是实时流媒体协议,用于在IP网络上控制流媒体服务器。
   - 遵循IETF RFC 2326, 4567, 6064规范,语法和操作参考HTTP/1.1。
   - 基于文本的协议,使用ISO 10646字符集和UTF-8编码。
   - 默认承载协议为TCP,端口554;RTSP-over-HTTP tunneling默认TCP端口为8080。
   - 支持的方法包括OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN, SET_PARAMETER, GET_PARAMETER等。

2. **RTSP协议交互过程**:

- 通常基于TCP进行交互,也可以基于HTTP(RTSP-over-HTTP tunneling)。

基于http交互示意图:


   - 交互过程包括流媒体信息描述、码流通道建立、流媒体控制等。
   - 流媒体码流传输通常通过RTP/RTCP协议,可以使用UDP或TCP作为传输层协议。

3. **RTSP拉流详解**:

    - 拉流过程包括使用OPTION方法询问支持的方法、DESCRIBE方法获取媒体流信息、SETUP方法建立传输通道、PLAY方法开始播放、TEARDOWN方法结束播放。
   - DESCRIBE方法使用SDP(Session Description Protocol)描述媒体流信息。
   - SETUP方法根据SDP信息建立码流通道,可以选择RTP over UDP或RTP over TCP。
   - PLAY方法指定播放范围,控制媒体流的播放。
   - TEARDOWN方法用于停止媒体流并释放资源。

其他的:

        - PAUSE方法:录像回放时会用到,用以暂停流媒体传输

        -SET_PARAMETER/GET_PARAMETER,用来作为心跳使用,也 是用option来维持心跳

3.1 OPTION请求响应示例:
OPTIONS rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)

RTSP/1.0 200 OK
CSeq: 2
Public: OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER
Date:  Wed, Jul 27 2022 10:37:06 GMT

这里可以看到查询后得到的响应中,服务器支持的rtsp方法:OPTIONS, DESCRIBE, PLAY, PAUSE, SETUP, TEARDOWN, SET_PARAMETER, GET_PARAMETER

3.2 DESCRIBE方法获取媒体流信息
DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

RTSP/1.0 401 Unauthorized
CSeq: 3
WWW-Authenticate: Digest realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", stale="FALSE"
Date:  Wed, Jul 27 2022 10:37:06 GMT

DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0
CSeq: 4
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream", response="be7cde07af4a08db991dd58a89db7621"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

RTSP/1.0 200 OK
CSeq: 4
Content-Type: application/sdp
Content-Base: rtsp://10.45.12.141:554/h264/ch1/main/av_stream/
Content-Length: 574

v=0
o=- 1658918226996159 1658918226996159 IN IP4 10.45.12.141
s=Media Presentation
e=NONE
b=AS:5050
t=0 0
a=control:rtsp://10.45.12.141:554/h264/ch1/main/av_stream/
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:5000
a=recvonly
a=x-dimensions:1920,1080
a=control:rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1
a=rtpmap:96 H265/90000
a=fmtp:96 sprop-sps=QgEBAWAAAAMAsAAAAwAAAwB7oAPAgBDlja5JMvTcBAQEAg==; sprop-pps=RAHA8vA8kAA=
a=Media_header:MEDIAINFO=494D4B48010300000400050000000000000000000000000000000000000000000000000000000000;
a=appversion:1.0

上面可以看到 客户端发送describe时,服务器要求鉴权,并且返回了401的响应,这时客户端再次根据鉴权信息,生成Authorization后再次发送describe。如果认证成功则返回 sdp信息。

详细解释如下:

  1. DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0:描述请求的RTSP URL以及协议版本。

  2. CSeq: 3:指定请求的序列号。

  3. User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28):发送请求的用户代理信息。

  4. Accept: application/sdp:指定请求的媒体类型,即希望接收SDP(Session Description Protocol)格式的描述信息。

接收到的响应信息如下:

  1. RTSP/1.0 401 Unauthorized:未授权的响应,需要进行身份验证。

  2. CSeq: 3:对应的请求序列号。

  3. WWW-Authenticate: Digest realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", stale="FALSE":包含身份验证所需的参数,包括realm(领域)、nonce(一次性数字)、stale(指示客户端是否可以重新使用上一次未完成的请求)等。

接着,发送了第二个DESCRIBE请求,包含了授权信息:

  1. DESCRIBE rtsp://10.45.12.141:554/h264/ch1/main/av_stream RTSP/1.0:描述请求的RTSP URL以及协议版本。

  2. CSeq: 4:指定请求的序列号。

  3. Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream", response="be7cde07af4a08db991dd58a89db7621":包含了进行身份验证所需的授权信息,包括用户名、领域、一次性数字、请求的URI以及响应。

  4. User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28):发送请求的用户代理信息。

  5. Accept: application/sdp:指定请求的媒体类型,即希望接收SDP格式的描述信息。

响应信息包含了SDP格式的描述信息:

  1. RTSP/1.0 200 OK:请求成功的响应。

  2. CSeq: 4:对应的请求序列号。

  3. Content-Type: application/sdp:响应中包含的媒体类型,即SDP格式的描述信息。

  4. Content-Base: rtsp://10.45.12.141:554/h264/ch1/main/av_stream/:描述信息中的基本URL。

  5. Content-Length: 574:描述信息的长度。

接着是SDP格式的描述信息,其中包含了媒体的相关信息,如音视频的编码格式、传输协议、媒体参数等。

3.3 SETUP方法建立传输通道:

有两种传输方式,一种是基于tcp的一种是基于udp的。

基于udp方式示例:

SETUP rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0
CSeq: 5
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="ac52cf287fe4aa6be5bb168bc9d01446"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=63538-63539

RTSP/1.0 200 OK
CSeq: 5
Session:       1279114011;timeout=60
Transport: RTP/AVP;unicast;client_port=63538-63539;server_port=8312-8313;ssrc=3cc5faf7;mode="play"
Date:  Wed, Jul 27 2022 10:37:07 GMT

这段RTSP SETUP阶段的请求和响应的字段解释如下:

请求(SETUP):

SETUP rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1 RTSP/1.0:指定了要建立的媒体流的URL以及协议版本。

CSeq: 5:请求序列号,用于唯一标识请求和对应的响应。

Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="c4c4e29b1620211e44ec28b077e2eb52", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="ac52cf287fe4aa6be5bb168bc9d01446":授权信息,包括用户名、领域、一次性数字、请求的URI以及响应。

User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28):发送请求的用户代理信息。

Transport: RTP/AVP;unicast;client_port=63538-63539:指定传输参数,包括传输协议(RTP/AVP)、传输方式(unicast)、客户端端口范围。

响应:

RTSP/1.0 200 OK:请求成功的响应。

CSeq: 5:对应的请求序列号。

Session: 1279114011;timeout=60:指定了会话标识符(Session)以及超时时间。该会话标识符用于关联此后的请求和会话,超时时间指示了会话的有效期限。

Transport: RTP/AVP;unicast;client_port=63538-63539;server_port=8312-8313;ssrc=3cc5faf7;mode="play":描述了媒体流的传输参数,包括传输协议(RTP/AVP)、传输方式(unicast)、客户端和服务端的端口范围、SSRC标识符(同步源标识符)以及模式(play表示播放模式)。

Date: Wed, Jul 27 2022 10:37:07 GMT:响应产生的日期和时间。

基于tcp方式示例:

......没有....可以查阅其他资料

3.4 PLAY方法开始播放

PLAY消息用于通知服务器开始传送数据,包括媒体的播放时间范围。具体来说,对于实时流,一般会使用Range字段来指定播放的时间范围。在这个场景下,Range字段的值通常是npt=0.000

注意:客户端在发送PLAY请求之前应该确保所有的SETUP请求都已经被服务器成功解析和处理。换句话说,客户端在发送PLAY请求之前,必须要确保所有与媒体流相关的资源都已经被成功设置和准备好了,包括传输参数、端口设置、会话标识等。这样做可以确保在播放媒体流之前所有的必要条件都已经具备,避免出现播放过程中的错误或异常

PLAY示例:

PLAY rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 6
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="59db6d7ba1acb14582356c8bb8e61ce8", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="0eef224891c12e902ca9185c70f969cc"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Session: 2095163832
Range: npt=0.000-

RTSP/1.0 200 OK
CSeq: 6
Session:       2095163832
RTP-Info: url=rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1;seq=29458;rtptime=2518517708
Date:  Fri, Aug 26 2022 14:35:46 GMT

在RTSP协议中,客户端发送PLAY方法时,需要包含Session字段来指定对应的会话标识符,以便服务器知道哪个会话需要开始播放流媒体数据。这个Session字段通常是在SETUP阶段由服务器返回的,客户端在发送PLAY请求时需要将其携带上去,确保与正确的会话建立关联。

一旦服务器接收到PLAY请求并识别了对应的会话,它就可以打开与客户端的通信通道,并开始发送流媒体数据。然而,为了更好地协调和控制流媒体的传输,服务器在发送PLAY方法的响应时,通常会携带RTP-Info字段。

RTP-Info字段包含了将要发送的流媒体数据的一些关键信息,比如第一包RTP数据包的序列号(seq)和RTP时间戳(rtptime)。客户端收到服务器的响应后,可以根据这些信息来确定接收和解码流媒体数据的方式,确保正确地解复用流媒体数据。例如,客户端可以根据RTP时间戳来进行播放速度的调整或者确保音视频同步。

PLAY请求消息:

   PLAY rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0:指示播放指定的RTSP   流。

   CSeq: 6:序列号,用于标识请求消息的顺序。

   Authorization: Digest:使用摘要认证方式进行身份验证。

   Session: 2095163832:RTSP会话标识,用于标识当前会话。

   Range: npt=0.000-:指定播放的时间范围,这里表示从媒体的起始点开始播放。

服务器响应消息:

   RTSP/1.0 200 OK:服务器成功处理了请求。

   CSeq: 6:对应请求消息的序列号。

   Session: 2095163832:与请求消息中的Session字段对应,表示当前会话标识。

   RTP-Info:       url=rtsp://10.45.12.141:554/h264/ch1/main/av_stream/trackID=1;seq=29458;rtptime=2518517708:指示RTP流的相关信息,包括URL、序列号和RTP时间戳。

   Date: Fri, Aug 26 2022 14:35:46 GMT:响应消息的发送时间。

3.5 TEARDOWN方法结束播放

这条消息是RTSP协议中的TEARDOWN方法,用于结束流媒体会话。当客户端不再需要与服务器通信时,或者希望停止播放流媒体时,可以发送TEARDOWN请求。并释放相关资源,其实例如下:

TEARDOWN rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0
CSeq: 7
Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="e3dfa4549e00a1d53c0e9f28c3348e2c", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="0c530cba910c33ea3ef7a554dda8d0b2"
User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28)
Session: 391346974

TEARDOWN rtsp://10.45.12.141:554/h264/ch1/main/av_stream/ RTSP/1.0: 这是TEARDOWN方法的请求行,指定了要关闭的流媒体的RTSP URL以及协议版本。

CSeq: 7: 表示这是第7个RTSP请求,用于序列化请求和响应的顺序。

Authorization: Digest username="admin", realm="IP Camera(C7627)", nonce="e3dfa4549e00a1d53c0e9f28c3348e2c", uri="rtsp://10.45.12.141:554/h264/ch1/main/av_stream/", response="0c530cba910c33ea3ef7a554dda8d0b2": 表示客户端对此请求进行了身份验证,使用的是Digest方式。其中,username是用户名,realm是领域,nonce是随机数,uri是请求的URI,response是摘要认证的响应值。

User-Agent: LibVLC/3.0.12 (LIVE555 Streaming Media v2016.11.28): 指定了客户端的User-Agent信息,表示使用的是LibVLC工具。

Session: 391346974: 表示要结束的流媒体会话的标识符,用来指定要关闭的会话。

4. **RTSP推流方式说明**:

   - 推流由客户端发起,视频由客户端推送给服务器。
   - 使用ANNOUNCE方法通知服务器流媒体描述,RECORD方法开始推送流。
   - 推流常用于流媒体代理、CDN等场景。

示例:

OPTIONS rtsp://10.45.12.141:554/live/0001 RTSP/1.0
CSeq: 1
User-Agent: znv
 
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 1
Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD
 
ANNOUNCE rtsp://10.45.12.141:554/live/0001 RTSP/1.0
Content-Type: application/sdp
CSeq: 2
User-Agent: znv
Content-Length: 325
 
v=0
o=- 0 0 IN IP4 127.0.0.1
s=Media Server
c=IN IP4 192.168.1.108
t=0 0
a=tool:libavformat 57.71.100
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAHqw0ygsBJ/wFuCgoKgAAB9AAAYah0MALFAALE9d5caGAFigAFieu8uFA,aO48MA==; profile-level-id=64001E
a=control:streamid=0
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 (Build/17.0325; Platform/Win32; Release/EasyDarwin; State/Development; )
Cseq: 2
 
SETUP rtsp://10.45.12.141:554/live/0001/trackid=0 RTSP/1.0
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;mode=record
CSeq: 3
User-Agent: znv
 
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 3
Cache-Control: no-cache
Session: 132169028622239
Date: Tue, 13 Nov 2018 02:49:48 GMT
Expires: Tue, 13 Nov 2018 02:49:48 GMT
Transport: RTP/AVP/TCP;unicast;mode=record;interleaved=0-1
 
RECORD rtsp://10.45.12.141:554/live/0001 RTSP/1.0
Range: npt=0.000-
CSeq: 4
User-Agent:znv
Session: 132169028622239
 
RTSP/1.0 200 OK
Server: EasyDarwin/7.3 
Cseq: 4
Session: 132169028622239
RTP-Info: url=rtsp://192.168.1.108:554/live.sdp/live.sdp

OPTIONS rtsp://10.45.12.141:554/live/0001 RTSP/1.0

  • 客户端向服务器发送OPTIONS请求,询问服务器支持的命令。
  • 服务器返回200 OK,表示支持的命令列表,其中包括DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、OPTIONS、ANNOUNCE、RECORD等命令。

ANNOUNCE rtsp://10.45.12.141:554/live/0001 RTSP/1.0

  • 客户端发送ANNOUNCE请求,用于向服务器通告媒体信息,包括媒体类型、IP地址、端口等。
  • 服务器返回200 OK,表示接收到媒体信息。

SETUP rtsp://10.45.12.141:554/live/0001/trackid=0 RTSP/1.0

  • 客户端发送SETUP请求,用于设置媒体流传输参数,指定传输方式为RTP/AVP/TCP。
  • 服务器返回200 OK,表示设置成功,同时返回Session标识符和传输参数。

RECORD rtsp://10.45.12.141:554/live/0001 RTSP/1.0

  • 客户端发送RECORD请求,用于开始录制媒体流。
  • 服务器返回200 OK,表示录制开始,并返回Session标识符和RTP信息。

5. **RTSP方法详解**:


   - OPTION:询问服务器支持的RTSP方法。
   - DESCRIBE:获取媒体流相关信息,如编码格式、封装格式、payload type等。
   - SETUP:建立码流通道,指定传输方式(UDP或TCP)和端口。
   - PLAY:开始播放媒体流,指定播放范围。
   - TEARDOWN:结束播放,释放会话和资源。

6. **RTSP交互注意事项**:


   - 客户端在发送PLAY请求前应确保所有SETUP消息成功解析。
   - 服务器在响应PLAY时最好包含RTP-Info字段,描述即将发送的码流信息。
   - SETUP响应中会生成一个session ID,后续消息必须携带此字段。
   - RTP/RTCP通过TCP传输时,需要使用特定的包头标识以区分数据类型。

  • 29
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值