介绍
我这个系列讲解音视频相关的协议,这部分内容比较多,我打算分成好几篇讲,感兴趣的读者可以关注一下。有了以上的基础,我就打算做一个音视频的网络服务器。如果您觉得读起来有点困难,可以先补一下计算机网络的知识,主要是TCP,UDP,HTTP相关的知识。
讲解
我们这篇文章讲解 RTSP (Real-Time Streaming Protocol)协议。这是一个应用层协议,位于 RTP/RTCP 协议之上。用于控制流媒体,可以发起,终结流媒体,也支持中断,回放等操作。
RTSP 分为客户端,服务端。客户端发送请求,服务端响应。通常有五个接口的方法,OPTIONS,DESCRIBE,SETUP,PLAY,TEARDOWN。下面我们接着详细解释一下这五个接口。
用于获取服务端提供的方法。
OPTIONS rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 2\r\n
\r\n
这段代码中,OPTIONS 是客户端请求的方法,要求服务端返回提供的方法类型。
rtsp://192.168.31.115:8554/live 是 url 地址,包括 ip 地址和端口号。
RTSP/1.0,是 RTSP 的版本号,表示 1.0 版本。
Cseq:序列号,每次请求和响应序列号一样,下一次请求、回应的序列号递增。
RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
\r\n
RTSP/1.0,与客户端一样,RTSP 版本号,1.0。
200 0K,说明成功返回结果。
Cseq:序列号,与请求的序列号一致。
Public:这就是回应的结果,说明服务端提供的方法有 OPTIONS,DESCRIBE,SETUP,TEARDOWN,PLAY。
用于获取媒体的描述信息。
DESCRIBE rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 3\r\n
Accept: application/sdp\r\n
\r\n
DESCRIBE 是客户端请求的方法。
Accept:是客户端指定的媒体描述信息类型,这里指请求格式为 sdp 的文件。
其他的上面讲过了。
RTSP/1.0 200 OK \r\n
CSeq: 2\r\n
Content-Base: rtsp://192.168.31.115:8554\r\n // 内容基础,反应url的地址
Content-type: application/sdp\r\n // 内容类型,格式为sdp
Content-length: 311\r\n // 内容长度,311
v=0\r\n
o=-91685885859 1 IN IP4 192.168.72.129\r\n
t=0 0\r\n
a=control:*\r\n
m=video 0 RTP/AVP 96\r\n
a=rtpmap:96 H264/90000\r\n //编码类型 H.264
a=control:track0\r\n
m=audio 1 RTP/AVP/TCP 97\r\n
a=rtpmap:97 mpeg4-generic/44100/2\r\n
a=fmtp:97 profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210;\r\n
a=control:track1\r\n
这里大家可以看一下注释,其余的也不展开讲。
用于向服务端发起建立连接请求
SETUP rtsp://192.168.31.115:8554/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:表示RTP通过UDP发送,如果是RTP/AVP/TCP则表示RTP通过TCP发送
unicast:表示单播,如果是multicast则表示多播
client_port:由于这里希望采用的是RTP OVER UDP,所以客户端发送了两个用于传输数据的端口,54492表示是RTP端口,54493表示RTCP端口(RTP端口为某个偶数,RTCP端口为RTP端口+1),客户端已经将这两个端口绑定到两个udp套接字上
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
Transport 中的 server_port 表示服务器中传输 RTP 的端口为 56400,传输 RTCP 的端口为 56401
Session 中的数字是 Session ID,是由服务器在SETUP的回应中选择的,客户端得到Session ID后,在以后的对Session 的操作请求消息中都要包含Session ID
用于向服务端发起播放请求
PLAY rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 5\r\n
Session: 66334873\r\n
Range: npt=0.000-\r\n
\r\n
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
用于向服务端发送关闭连接的请求
TEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 6\r\n
Session: 66334873\r\n
\r\n
TEARDOWN rtsp://192.168.31.115:8554/live RTSP/1.0\r\n
CSeq: 6\r\n
Session: 66334873\r\n
\r\n
好了,RTSP 的五种主要方法都介绍了。这里总结一下,在实际应用中,第一步:我们可以用 OPTIONS 查询支持的方法;第二步,我们用 DESCRIBE 描述媒体的信息;第三步,我们用 SETUP 与服务端建立连接;第四步,我们用 PLAY 请求播放视频;第五步,我们用 TEARDOWN 请求关闭连接。
这篇文章参考rtsp简单服务器,下一篇文章我们会讲解 RTMP。
欲知后事如何,请听下回分解。