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–>S
OPTIONS rtsp://127.0.0.1:1051/live RTSP/1.0\r\n
CSeq: 2\r\n
\r\n
客户端向服务器申请可用办法
S–>C
RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
\r\n
服务端回复客户端,以后可用办法 OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY
- DESCRIBE
C–>S
DESCRIBE rtsp://127.0.0.1:1051/live RTSP/1.0\r\n
CSeq: 3\r\n
Accept: application/sdp\r\n
\r\n
客户端向服务器申请媒体形容文件,格局为 sdp
S–>C
RTSP/1.0 200 OK\r\n
CSeq: 3\r\n
Content-length: 146\r\n
Content-type: application/sdp\r\n
\r\n
v=0\r\n
o=- 91565340853 1 in IP4 127.0.0.1\r\n
t=0 0\r\n
a=contol:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n
a=framerate:25\r\n
a=control:track0\r\n
服务器回复了 sdp 文件,这个文件通知客户端以后服务器有哪些音视频流,有什么属性,下文有介绍
这里只须要晓得客户端能够依据这些信息得悉有哪些音视频流能够发送
- SETUP
C–>S
SETUP rtsp://127.0.0.1:1051/live/track0 RTSP/1.0\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
\r\n
客户端发送建设申请,申请建设连贯会话,筹备接管音视频数据
解析一下 Transport: RTP/AVP;unicast;client_port=54492-54493\r\n
RTP/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–>C
RTSP/1.0 200 OK\r\n
CSeq: 4\r\n
Transport: RTP/AVP;unicast;client_port=54492-54493;server_port=56400-56401\r\n
Session: 66334873\r\n
\r\n
服务端接管到申请之后,得悉客户端要求采纳 RTP OVER UDP 发送数据,单播,客户端用于传输 RTP 数据的端口为 54492,RTCP 的端口为 54493 服务器也有两个 udp 套接字,绑定好两个端口,一个用于传输 RTP,一个用于传输 RTCP,这里的端口号为 56400-56401 之后客户端会应用 54492-54493 这两端口和服务器通过 udp 传输数据,服务器会应用 56400-56401 这两端口和这个客户端传输数据
- PLAY
C–>S
PLAY rtsp://127.0.0.1:1051/live RTSP/1.0\r\n
CSeq: 5\r\n
Session: 66334873\r\n
Range: npt=0.000-\r\n
\r\n
客户端申请播放媒体
S–>C
RTSP/1.0 200 OK\r\n
CSeq: 5\r\n
Range: npt=0.000-\r\n
Session: 66334873; timeout=60\r\n
\r\n
服务器回复之后,会开始应用 RTP 通过 udp 向客户端的 54492 端口发送数据
TEARDOWN
C–>S
TEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 6\r\n
Session: 66334873\r\n
\r\n
S–>C
RTSP/1.0 200 OK\r\n
CSeq: 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 为 0
m=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…