RTSP
rtsp,英文全称 Real Time Streaming Protocol,RFC2326,实时流传输协定,是TCP/IP协定体系中的一个应用层协定!协定次要规定定了一对多应用程序如何无效地通过IP网络传送多媒体数据。RTSP体系结位于RTP和RTCP之上(RTCP用于控制传输,RTP用于数据传输),应用TCP或UDP实现数据传输!
RTSP交互过程
上面是一个简略的RTSP交互过程:
接下来顺次介绍应用到的申请办法与响应示例。(TODO: GET PARAMETER, PAUSE)
- OPTIONS
C–>SOPTIONS rtsp://127.0.0.1:1051/live RTSP/1.0\r\nCSeq: 2\r\n\r\n客户端向服务器申请可用办法S–>CRTSP/1.0 200 OK\r\nCSeq: 2\r\nPublic: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n\r\n服务端回复客户端,以后可用办法OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY
- DESCRIBE
C–>SDESCRIBE rtsp://127.0.0.1:1051/live RTSP/1.0\r\nCSeq: 3\r\nAccept: application/sdp\r\n\r\n客户端向服务器申请媒体形容文件,格局为sdpS–>CRTSP/1.0 200 OK\r\nCSeq: 3\r\nContent-length: 146\r\nContent-type: application/sdp\r\n\r\nv=0\r\no=- 91565340853 1 in IP4 127.0.0.1\r\nt=0 0\r\na=contol:*\r\nm=video 0 RTP/AVP 96\r\na=rtpmap:96 H264/90000\r\na=framerate:25\r\na=control:track0\r\n服务器回复了sdp文件,这个文件通知客户端以后服务器有哪些音视频流,有什么属性,下文有介绍这里只须要晓得客户端能够依据这些信息得悉有哪些音视频流能够发送
- SETUP
C–>SSETUP rtsp://127.0.0.1:1051/live/track0 RTSP/1.0\r\nCSeq: 4\r\nTransport: RTP/AVP;unicast;client_port=54492-54493\r\n\r\n客户端发送建设申请,申请建设连贯会话,筹备接管音视频数据解析一下Transport: RTP/AVP;unicast;client_port=54492-54493\r\nRTP/AVP:示意RTP通过UDP发送,如果是RTP/AVP/TCP则示意RTP通过TCP发送unicast:示意单播,如果是multicast则示意多播client_port=54492-54493:因为这里心愿采纳的是RTP OVER UDP,所以客户端发送了两个用于传输数据的端口,客户端曾经将这两个端口绑定到两个udp套接字上,54492示意是RTP端口,54493示意RTCP端口(RTP端口为某个偶数,RTCP端口为RTP端口+1)S–>CRTSP/1.0 200 OK\r\nCSeq: 4\r\nTransport: RTP/AVP;unicast;client_port=54492-54493;server_port=56400-56401\r\nSession: 66334873\r\n\r\n服务端接管到申请之后,得悉客户端要求采纳RTP OVER UDP发送数据,单播,客户端用于传输RTP数据的端口为54492,RTCP的端口为54493服务器也有两个udp套接字,绑定好两个端口,一个用于传输RTP,一个用于传输RTCP,这里的端口号为56400-56401之后客户端会应用54492-54493这两端口和服务器通过udp传输数据,服务器会应用56400-56401这两端口和这个客户端传输数据
- PLAY
C–>SPLAY rtsp://127.0.0.1:1051/live RTSP/1.0\r\nCSeq: 5\r\nSession: 66334873\r\nRange: npt=0.000-\r\n\r\n客户端申请播放媒体S–>CRTSP/1.0 200 OK\r\nCSeq: 5\r\nRange: npt=0.000-\r\nSession: 66334873; timeout=60\r\n\r\n服务器回复之后,会开始应用RTP通过udp向客户端的54492端口发送数据
TEARDOWN
C–>STEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\nCSeq: 6\r\nSession: 66334873\r\n\r\nS–>CRTSP/1.0 200 OK\r\nCSeq: 6\r\n\r\n
SDP协定
RFC4566
格局
<type>=<value>
其中:
<type>
:属性(大小写敏感),例如v
代表版本;<value>
:内容,它是结构化文本,对应的格局和属性关联,采纳 UTF8 编码;=
:符号,两边不能存在空格;=*
:示意可选。
会话形容参数
SDP会话形容由一个会话级形容(session_level description)和多个媒体级形容(media_level description)组成。
- 会话级(session_level)的作用域是整个会话。其地位是从’v=’行开始到下一个媒体形容为止。
- 媒体级(media_level)形容是对单个的媒体流进行形容,其地位是从’m=’行开始到下一个媒体形容为止。
- Version(必选)
协定版本,不包含次版本号,格局如下:
v=0
- origion(必选)
对会话的发起者进行了形容
o=<username> <sessionid> <version> <network type> <address type> <address>
<username>
:用户的登录名。如果主机不反对<username>
,则为 ”-”。留神:<username>
不能含空格。<session id>
::会话ID。在整个会话中,必须是惟一的<version>
:该会话布告的版本,供布告代理服务器检测同一会话的若干个布告哪个是最新布告.根本要求是会话数据批改后该版本值递增,倡议用NTP时戳。<networktype>
:网络类型,个别为”IN”,示意”internet”<address type>
:地址类型,个别为IP4<address>
:地址
- Session Name(必选)
会话名称,在整个会话中有且只有一个”s=”
s=<sessionname>
4. Connnection Data(可选)
示意媒体的连贯信息, 一个会话申明中,会话级形容中必须有”c=”项或者在每个媒体级形容中有一个”c=”项。也有可能在会话级形容和每个媒体级形容中都有”c=”项。
c=<networktype> <address type> <connection address>
5. Bandwidth(可选)
带宽信息,单位kilobits per second
b=<modifier>:<bandwidth-value>
<modifier>
:包含两种CT和AS。CT:ConferenceTotal,总带宽。AS:Application-SpecificMaximum,单个媒体带宽的最大值
- Times(必选)
形容了会话的开始工夫和完结工夫
t=<start time> <stop time>
<start time>
和<stop time>
为NTP工夫,单位是秒。如果<stop time>
为零,示意过了<start time>
工夫后会话始终继续。当<start time>
和<stoptime>
均为零时示意长久会话。倡议start time和stoptime不要设为0。因为不晓得此会话的开始和完结工夫,减少了调度(scheduling)的难度。
- Media Announcement(必选)
媒体名称和传输地址。一个媒体形容以”m=”开始到下一个”m=”完结。
m=<media><port> <transport> <fmt list>
<media>
:示意媒体类型。有"audio"、 "video"、"application"(例白板信息)、"data"(不向用户显示的数据)和"control"(形容额定的管制通道)。
<port>
:媒体流发往传输层的端口。取决于c=行规定的网络类型和接下来的传送层协定:对UDP为1024-65535;对于RTP为偶数。当分层编码流被发送到一个单播地址时,须要列出多个端口。
对于RTP,偶数端口被用来传输数据,奇数端口用来传输RTCP包。例:
/*端口49170和49171为第一对RTP/RTCP端口,49172和49173为第二对的端口。传输协定是RTP/AVP,媒体格式为31(媒体格式是rtp头中payload参数对应的)*/m=video49170/2 RTP/AVP 31
<transport>
:传输协定,与c=行的地址类型无关。两种: RTP/AVP,示意RealtimeTransport Protocol using the Audio/Video profile carried over UDP;
<fmt list>
:媒体格式。对于音频和视频就是在RTP Audio/Video Profile定义的负载类型(payload type)。但第一个为缺省值,分为动态绑定和动静绑定:动态绑定即媒体编码方式与RTP负载类型有确定的一一对应关系,动静绑定即媒体编码方式(如时钟频率,音频信道数等)没有齐全确定,须要进一步的属性阐明(用rtpmap)。动态绑定举例如下:
//u_law的PCM编码单信道Audio,采样率8KHZ。在RTPAudio/Video profile中对应的payload type为0m=audio49232 RTP/AVP 0
动静绑定的例子:16位线形编码,采样率为16KHZ,如果咱们心愿动静RTP/AVP 类型98示意此此流,写法如下:
m=video49232 RTP/AVP 98 a=rtpmap:98 L16/16000/2
- rtpmap(可选)
0 个或多个会话属性行
a=rtpmap:<payload type><encoding name>/<clock rate>[/<encodingparameters>]
JS实现SDP解析器(TODO)
RTSP数据封装格局 - UDO形式(TODO)
RTSP数据封装格局 - TCP形式
客户端解析申请格局示例
- Option
{ protocolVersion: 'RTSP/1.0', statusCode: 200, statusMessage: 'OK', messageSize: 128, headersSize: 103, bodySize: 0, headers: [ { name: 'CSeq', values: [Array] }, { name: 'Public', values: [Array] }, // 服务端可用的办法 { name: 'Server', values: [Array] } ]}
- Describe
{ protocolVersion: 'RTSP/1.0', statusCode: 200, statusMessage: 'OK', messageSize: 595, headersSize: 117, bodySize: 449, headers: [ { name: 'CSeq', values: [Array] }, { name: 'Content-Base', values: [Array] }, { name: 'Content-Length', values: [Array] }, { name: 'Content-Type', values: [Array] }, { name: 'Server', values: [Array] } ], body: { contentType: 'application/sdp', // DESCRIBE是客户端向服务器申请媒体信息,这是服务器须要回复sdp形容文件, plain: 'v=0\r\n' + 'o=- 0 0 IN IP4 127.0.0.1\r\n' + 's=Stream\r\n' + 'c=IN IP4 0.0.0.0\r\n' + 't=0 0\r\n' + 'm=video 0 RTP/AVP 96\r\n' + 'a=rtpmap:96 H264/90000\r\n' + 'a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z2QAH6xyBEFwUbARAAADAAEAAAMAYA8YMYRg,aOhDssiw; profile-level-id=64001F\r\n' + 'a=control:trackID=0\r\n' + 'm=audio 0 RTP/AVP 97\r\n' + 'a=rtpmap:97 mpeg4-generic/48000/2\r\n' + 'a=fmtp:97 profile-level-id=1; mode=AAC-hbr; sizelength=13; indexlength=3; indexdeltalength=3; config=119056e500\r\n' + 'a=control:trackID=1\r\n' }}
- Setup
SETUP是客户端申请建设会话连贯, 传输头部(Transport header)具体列出了客户端能承受的数据传输参数 ;响应中会蕴含服务器选定的传输参数。
{ protocolVersion: 'RTSP/1.0', statusCode: 200, statusMessage: 'OK', messageSize: 165, headersSize: 138, bodySize: 0, headers: [ { name: 'CSeq', values: [Array] }, { name: 'Server', values: [Array] }, { name: 'Session', values: [Array] }, { name: 'Transport', values: [Array] } ]}
参考文章
- RTSP协定的一些剖析
- 会话形容协定---SDP协定【详解】
https://blog.csdn.net/weixin_...
https://blog.csdn.net/Chiang2...
https://cloud.tencent.com/dev...