由于业务需求,要实现rtsp协议下的视频流代理功能,此前对rtsp协议不了解,搜索了很多关于rtsp的文章,一点点的弄明白了,现在项目开发完成了,打算把自己总结的知识点分享给有需要的人,第一次在csdn上写文章,心情有些激动,我会把之前总结的各种资料都一一分享出来,独乐乐不如众乐乐。下面就是我总结的一些知识点。

一、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配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。

三、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包,总长度与上面的数据长度相同

这些就是我对rtsp协议的全部理解,希望可以对大家有所帮助,感谢大家的阅览,喜欢的朋友不妨点个关注,我会不定时的更新学到的内容,大家一起进步,愿永无bug。

个人对rtsp协议的理解相关推荐

  1. H.264NLU和RTSP协议理解

    h.264分为两部分组成:VCL 和 NAL VCL: 是指如何进行视频压缩算法的纯视频流的部分,这里不做说明(这里是大公司给完成的部分) NAL:是指网络抽象层部分(Network Abstract ...

  2. (转)RTSP协议详解

    转自:https://www.cnblogs.com/lidabo/p/6553212.html RTSP简介 RTSP(Real Time Streaming Protocol)是由Real Net ...

  3. RTSP协议-中文定义

    转自:http://blog.csdn.net/arau_sh/article/details/2982914 E-mail:bryanj@163.com 译者: Bryan.Wong(王晶,宁夏固原 ...

  4. RTSP再学习 -- RTSP协议分析(转载)

    最近一直在看 RTSP,但是RTSP协议是个啥?还没有搞清楚. 首先流媒体百度百科上有这样一段,从基本的名字上或多或少可以理解一下这些传输协议的区别.这很重要!! 传输协议 1.RSVP:资源预留协议 ...

  5. RTP/RTCP/RTSP协议初探

    From:http://apps.hi.baidu.com/share/detail/24794429 一.产生的背景 随着互连网的发展,人们已经不满足于传统的HTTP,FTP和电子邮件等文本信息和服 ...

  6. 音视频之RTSP协议简介

    音视频之RTSP协议简介 RTSP简介 RTSP协议以客户端/服务器方式工作,如:暂停/继续.后退.前进等.它是一个多媒体播放控制协议,用来控制用户在播放从因特网下载的实时数据,因此 RTSP 又称为 ...

  7. rtsp 协议读取视频进行分析并返回结果到websocket server

    一.rtsp 协议读取视频 1.1读取方法ffmpeg 这种方法和opencv是一样的,因为opencv使用的就是ffmpeg,结果不是很好,断线重连不是很好做,有一个好处是不用引入其他库,ffmpe ...

  8. RTP/RTCP协议与RTSP协议

    基本概念 流式传输 包括顺序流式传输(Progressive Streaming)和实时流式传输(Real-time Streaming).直播场景中使用progressive streaming和r ...

  9. RTSP 协议详细介绍

      RTSP协议分析 收藏 Network Working Group H. Schulzrinne Request for Comments: 2326 Columbia U. Category: ...

最新文章

  1. ASP.NET重用代码技术 - 代码绑定技术
  2. web请求判断客户端类型
  3. 挂起和阻塞区别以及sleep和wait的区别
  4. centos6 64位服务器的基本初始化
  5. Java并发工具类(闭锁CountDownLatch)
  6. html js什么作用,html錨點的作用和js選項卡錨點跳轉的使用
  7. [云炬创业基础笔记]第十一章创业计划书测试4
  8. php清空dns缓存文件,dns清空-windows刷新本地DNS缓存的几种方法
  9. WeChat微信小程序网易云音乐播放链接方法
  10. JS 数字左补零函数
  11. wince -- telnet登陆密码的取消
  12. python里os什么模块_python中os模块的主要方法
  13. python中使用正则模板匹配结果
  14. 《AIOps在360的落地实践》分享实录
  15. 谷歌发布 V8 Exploit 漏洞奖励计划,奖金加倍
  16. MSIL实用指南-一维数组的操作
  17. 自然语言处理核心期刊_计算机核心期刊
  18. canoco5主成分分析步骤_主成分分析(PCA)统计与MATLAB函数实现
  19. html希腊字符,希腊字母
  20. Hive总结及常见语法

热门文章

  1. 失业七个月,面试六十家公司的深圳体验
  2. 斗牛怎么玩法算法_逗牛牧场:斗牛游戏小程序,益智斗牛小游戏
  3. TOEFL听力2.28
  4. 八一建军节 | 致敬中国人民解放军
  5. 认识钉钉小程序_搭建一个简单的小程序---钉钉小程序开发教程001
  6. spring aop的@Before,@Around,@After,@AfterReturn,@AfterThrowing执行顺序
  7. txt文本转azw3(kindle格式)
  8. 纯CSS3做3D动画魔方
  9. 爬虫数据分析-美食网站最爱甜点top10
  10. “第五届”中南杯计算机设计大赛 获奖作品及选手信息