rtsp协议的理解

一、rtsp协议概述

RTSP(Real Time Streaming Protocol)实时流传输协议,是TCP/IP协议体系中的一个应用层协议。该协议定义了一对多的应用程序如何有效地通过IP网络传送多媒体数据,用于C/S模式,使用RTSP时客户端和服务端都可以发出请求,故RTSP可以是双向的。RTSP默认使用UDP建立连接,端口是554。RTSP仅仅是使媒体播放器能够控制媒体流的传送,因此,RTSP又被称为带外协议,多媒体流是使用RTP在带内传送的。

1.rtsp网络架构

 2.交互流程

下图展示了基本的交互过程,交互是一来一回的,请求——响应,SETUP、PLAY、PAUSE、TEARDOWN一系列请求实现了对媒体流传送的控制; c/s模式  一对多  支持双向

二、rtsp报文

1.请求报文常用方法及作用

方法 作用

OPTIONS 获取服务器提供的可用方法

DESCRIBER 获取会话描述信息

SETUP 客户端提醒服务器建立会话,并确定传输模式

PLAY 客户端发送播放请求

TEARDOWN 客户端发起关闭请求

2.请求报文格式

请求报文由请求行、首部行和实体部分组成:

 3.响应报文格式

 响应报文由状态行、首部行和实体部分组成:

4.RTP-实时传输协议

RTP数据协议负责对流媒体数据进行封包并实现实时传输,每一个rtp数据报都由头部(header)和负载(Payload)两部分组成,其中头部前12个字节的含义是固定的,而负载则可以是音频或者视频数据。

RTP会话过程:当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。RTP的发送过程如下,接收过程则相反。

1)RTP协议从上层接收流媒体信息码流(如H.263),封装成RTP数据包;RTCP从上层接收控制信息,封装成RTCP控制包。

2)RTP将RTP数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。

5.RTCP-实时传输控制协议

RTP/RTCP是实际传输数据的协议,RTCP包括Sender Report和Receiver Report,用来进行音频/视频的同步以及其他用途,是一种控制协议。

RTCP的主要功能是:服务质量的监视与反馈、媒体间的同步,以及多播组中成员的标识。在RTP会话期 间,各参与者周期性地传送RTCP包。RTCP包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料,因此,各参与者可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。RTP和RTCP配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。

本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部↓↓

  

三、rtsp协议详解

这部分我将rtsp交互流程以及报文中用到的标识位都做了详细的解释,下面跟随我一起来看看吧~

1.OPTIONS

OPTIONS请求

OPTIONS rtsp://20.0.0.3/sample_300kbit.mp4 RTSP/1.0 //请求行:方法+url+版本

CSeq: 2 //应答序列号

User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22) //包含发起请求的用户代理的信息

OPTIONS应答

RTSP/1.0 200 OK //状态行:版本+状态码+短语

Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; ) //响应头域:包含了源服务器用于处理请求的软件信息

Cseq: 2 //应答序列号

Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD //服务端可提供的方法

注:上面是OPTIONS完整的交互,请求行中:方法为OPTIONS,url为 rtsp://20.0.0.3/sample_300kbit.mp4,版本为RTSP/1.0,

其中url里带的是协议、ip(或域名)、端口、路径;

CSeq:对于每一个包含了序列号的RTSP请求,它对应的响应会有相同的序列号,任何重传的请求必须包含和原来一样的序列号(也就是说,重传一个请求时,序列号不增加)

User-Agent:包含发起请求的用户代理的信息,此字段包含多个识别代理和子产品的产品标识和解释,通常,为了识别应用程序,产品标记按重用性排序

每一行结束都以CRLF(0d0a)结束,换行

状态行中:版本为RTSP/1.0,与请求行中一样;状态码为200 OK

Server:响应头域,包含了源服务器用于处理请求的软件信息;

Public:服务端可提供的方法

2.DESCRIBE
DESCRIBE请求:获取会话描述信息    
    DESCRIBE rtsp://20.0.0.3/sample_300kbit.mp4 RTSP/1.0 //请求行:方法+url+版本
    CSeq: 3      //应答序列号
    User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22) //发起请求的用户代理信息
    Accept: application/sdp //接收请求——头部域可以用来描述确切的响应可接收的表示描述的内容类型
DESCRIBE应答:
    RTSP/1.0 200 OK  //状态行:版本+状态码
    Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )//响应头域:包含了源服务器用于处理请求的软件信息
    Cseq: 3 //应答序列号
    Last-Modified: Mon, 07 Mar 2005 08:02:12 GMT
    Cache-Control: must-revalidate
    Content-length: 1205
    Date: Wed, 22 Jun 2016 15:42:33 GMT
    Expires: Wed, 22 Jun 2016 15:42:33 GMT
    Content-Type: application/sdp
    x-Accept-Retransmit: our-retransmit
    x-Accept-Dynamic-Rate: 1
    Content-Base: rtsp://20.0.0.3/sample_300kbit.mp4/

    v=0 //协议版本
    o=StreamingServer 3675598966 1110182532000 IN IP4 20.0.0.3 //所有者/创建者和会话标识符
    s=\sample_300kbit.mp4 //会话名称
    u=http:///  //url描述
    e=admin@ //Email地址
    c=IN IP4 0.0.0.0  //连接信息--如果包含在所有媒体中,则不需要该字段
    b=AS:258 //带宽信息
    t=0 0  //会话活动时间
    a=control:*  //会话属性
    a=mpeg4-iod:"data:application/mpeg4-iod;base64,AoJrAE///w/z
    a=isma-compliance:1,1.0,1
    a=range:npt=0-  70.00000 //媒体流的长度
    m=video 0 RTP/AVP 96  //媒体类型
    b=AS:209
    a=rtpmap:96 MP4V-ES/90000
    a=control:trackID=3
    a=cliprect:0,0,480,380
    a=framesize:96 380-480
    a=fmtp:96 profile-level-id=1;config=000001B0F3000001B50EE040C0CF0000010000000120008440FA285F21E0A21F
    a=mpeg4-esid:201
    m=audio 0 RTP/AVP 97
    b=AS:48
    a=rtpmap:97 mpeg4-generic/22050/2
    a=control:trackID=4
    a=fmtp:97 profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1390
    a=mpeg4-esid:101

3.SETUP
SETUP请求:客户端提醒服务器建立会话,并确定传输模式    
    SETUP rtsp://20.0.0.3/sample_300kbit.mp4/trackID=3 RTSP/1.0 //trackID:通常会有两个SETUP报文,分别是视频流和音频流,两个报文的trackID也不一样
    CSeq: 4  //应答序列号
    User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22) //发起请求的用户代理信息
    Transport: RTP/AVP;unicast;client_port=58516-58517    
            //Transport首部行指示要用哪个传输协议,并配置如目的地址、压缩、多播时的time-t-live和每个流的目的端口号这类参数。
            //它设置那些表示描述没有给定的值。低层传输参数的默认值是视上层而定的。对于RTP/AVP,默认是UDP。RTP/AVP/TCP是TCP
            //通用参数unicast(单播),默认是multicast(多播)。该参数提供客户端选择的接收媒体数据和控制信息的单播RTP/RTCP端口号对,它用范围的形式给出,RTP使用偶数口接受发数据流,RTCP则使用相邻的下一位奇数端口号。

SETUP应答:
    RTSP/1.0 200 OK    //状态行:版本+状态码
    Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )    //响应头域:包含了源服务器用于处理请求的软件信息
    Cseq: 4    //应答序列号
    Last-Modified: Mon, 07 Mar 2005 08:02:12 GMT
    Cache-Control: must-revalidate
    Session: 69475390988167    //是包括一次RTSP"事务"(transaction)的全过程。比如,一个电影的观看过程。会话(session)一般包括由客户端为连续媒体建立传输机制(SETUP),使用播放(PLAY)或录制(RECRD)开始传送流,用停止(TEARDWN)关闭流。
    Date: Wed, 22 Jun 2016 15:42:33 GMT
    Expires: Wed, 22 Jun 2016 15:42:33 GMT
    Transport: RTP/AVP;unicast;source=20.0.0.3;client_port=58516-58517;            server_port=6970-6971;ssrc=00004341
            //Transport:server_port参数提供服务器选择的用来接收媒体数据和控制信息的单播RTP/RTCP端口号对。
            //ssrc参数指示媒体服务器应该用的(请求)或将要用的(响应)RTP SSRC值,该参数只对单播传输有效,它是和媒体流关联的同步源的标识,该标识是随机选择的,参加同一视频的两个同步信源不能有相同的ssrc。

SETUP rtsp://20.0.0.3/sample_300kbit.mp4/trackID=4 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Transport: RTP/AVP;unicast;client_port=58518-58519
Session: 69475390988167

RTSP/1.0 200 OK
Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )
Cseq: 5
Session: 69475390988167
Last-Modified: Mon, 07 Mar 2005 08:02:12 GMT
Cache-Control: must-revalidate
Date: Wed, 22 Jun 2016 15:42:33 GMT
Expires: Wed, 22 Jun 2016 15:42:33 GMT
Transport: RTP/AVP;unicast;source=20.0.0.3;client_port=58518-58519;server_port=6970-6971;ssrc=00004CF1

4.PLAY

PLAY请求:

PLAY rtsp://20.0.0.3/sample_300kbit.mp4/ RTSP/1.0

CSeq: 6

User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

Session: 69475390988167

Range: npt=0.000- //Range定义了一个时间范围,播放在该范围内的视频帧

PLAY回应:

RTSP/1.0 200 OK

Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )

Cseq: 6

Session: 69475390988167

Range: npt=0.00000-70.00000 //服务器回应的播放时间范围

RTP-Info: url=rtsp://20.0.0.3/sample_300kbit.mp4/trackID=3;seq=10753;rtptime=20367,url=rtsp://20.0.0.3/sample_300kbit.mp4/trackID=4;seq=31323;rtptime=31819

//RTP-Info:用于设定PLAY响应中的RTP相关参数。

//URL指示后面的RTP参数跟哪个流相关联;

//seq:指示流的第一个包的序列号,这使得客户端在搜索 时方便地处理包,客户端使用该值来区分搜索位置前生成的包和搜索位置后生成的包;

//rtptime:客户端用此值来实现从RTP时间到NPT的映射计算。

5.PAUSE

PAUSE请求:暂停

PAUSE rtsp://20.0.0.3/sample_300kbit.mp4/ RTSP/1.0

CSeq: 7

User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

Session: 69475390988167

PAUSE响应:

RTSP/1.0 200 OK

Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )

Cseq: 7

Session: 69475390988167

6.PLAY
PLAY请求:播放
PLAY rtsp://20.0.0.3/sample_300kbit.mp4/ RTSP/1.0
CSeq: 8
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 69475390988167

PLAY响应:
RTSP/1.0 200 OK
Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )
Cseq: 8
Session: 69475390988167
Range: npt=7.98766-70.00000
RTP-Info: url=rtsp://20.0.0.3/sample_300kbit.mp4/trackID=3;seq=11067;rtptime=1177917,url=rtsp://20.0.0.3/sample_300kbit.mp4/trackID=4;seq=31410;rtptime=315881

7.TEARDOWN
TEARDOWN请求:客户端发请关闭请求
TEARDOWN rtsp://20.0.0.3/sample_300kbit.mp4/ RTSP/1.0
CSeq: 9
User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)
Session: 69475390988167

TEARDOWN响应:
RTSP/1.0 200 OK
Server: DSS/5.5.5 (Build/489.16; Platform/Win32; Release/Darwin; state/beta; )
Cseq: 9
Session: 69475390988167
Connection: Close

四、基于TCP的RTSP/RTP流媒体传输

在UDP 协议上的RTSP/RTP需要打开许多UDP端口,一个端口用于RTSP通信,n个端口用于RTP,n个端口用于RTCP。通常RTSP协议缺省端口554,UDP协议上,同一同步源的RTP端口与RTCP端口相邻,RTP端口通常为偶数,RTCP端口为奇数,且RTCP为RTP端口号+1。对于每一路流媒体,都需要一对UDP端口。

在TCP协议上的RTSP/RTP,RTSP/RTP的控制命令和数据都通过一个端口,即RTSP的端口(默认为554),进行交互。相较于UDP,TCP的优点在于可靠传输、节省端口、同时更容易穿透中间网络路由。

但是TCP协议上的RTSP/RTP采用二元交织(交错传输二进制)的方法传输数据,且可靠传输协议容易在实时媒体流中造成时延。

五、TCP与UDP上的RTSP/RTP协议的主要差异如下:

1.rtsp指令交互差异

与UDP rtsp指令集相比,TCP指令集在setup指令上存在差异:

下面是一个TCP示例:

请求部分如下:

SETUP rtsp://192.168.100.123:554/mpeg4cif/track1 RTSP/1.0

CSeq: 4

User-Agent: LibVLC/2.2.4 (LIVE555 Streaming Media v2016.02.22)

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

Transport头域中,UDP为RTP/AVP/UDP或RTP/AVP,而TCP为RTP/AVP/TCP。

同时TCP在Transport中没有像UDP一样指出RTP和RTCP端口号(因为数据和RTSP公用一个端口传输),同时多了一个Interleaved指出传输数据时使用的TCP信道。

使用偶数信道作为数据传输(rtp)信道,使用奇数信通道(rtcp)作为控制信道(数据信道 + 1)。

响应部分如下:

RTSP/1.0 200 OK

CSeq: 4

Date: Mon, Mar 06 2017 02:56:22 GMT

Transport: RTP/AVP/TCP;unicast;destination=192.168.100.145;source=192.168.100.123;interleaved=0-1

Session: 425EC42F

2.rtp数据接收差异

使用udp 接收数据时不需要对数据做rtp包解包处理,使用tcp接收数据时,由于rtp,rtcp,rtsp都在同一端口上,用户需要做tcp解包处理。

为了区分RTP通道和RTCP通道,在RTP层之上增加一层,即RTSP Interleaved Frame 层。

RTP数据将通过用来发送RTSP命令的TCP Socket进行发送。RTP数据将以如下格式进行封装:| 标识符 | 信道 |数据长度 | 数据 |

其中:

RTP数据标识符,"$" (0x24)这个一般是固定为0x24

信道数字 1个字节,用来指示信道。可以用来区分音视频等多路流媒体的通道,其中偶数通道为流媒体内容,奇数通道为RTCP(即0x00 一般代表rtp数据, 0x01 一般代表rtcp数据)

数据长度 2个字节,用来指示插入数据长度(数据包的长度减去开始的4个字节,即len字段之后的数据长度)

数据 - 数据包,比如说RTP包,总长度与上面的数据长度相同

本文福利, C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部↓↓

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值