RTSP与SDP
简介
RTSP是RTP中负责定义具体的控制消息、操作方法、状态码等的协议,但它本身并不传输数据,而是必须依赖于下层传输协议所提供的某些服务。
RTSP 可以实现如下的指令集,这些指令是面向客户端编写的。1
2
3
4
5enum Method
{
OPTIONS, DESCRIBE, ANNOUNCE, SETUP, PLAY, RECORD, PAUSE, GET_PARAMETER, TEARDOWN,
NONE,
};
本文仅实现下面的子集1
2
3
4
5enum Method
{
OPTIONS, DESCRIBE, SETUP, PLAY,
NONE,
};
指令集
每个指令对应一个字符串,在每次调用之后,需要将字符串发送给客户端。
为了代码阅读方便、美观,每一个字符串最后都省略了"\r\n"
每个指令都有相同的头部:
1 | "RTSP/1.0 200 OK" |
- RTSP/1.0 200 OK 用于回应请求成功
- CSeq 代表该消息的序列号
和相同的尾部:1
"\r\n"
OPTION
该指令主要用于展示服务器提供给客户端可调用的指令
在相同的头部后添加:
1 | "Public: DESCRIBE, SETUP, PLAY, TEARDOWN" |
- Public 用于展示服务器有哪些指令
- Server 是服务器的名字
DESCRIBE
该指令用于描述整个会话,视频和音频的描述配置都存放在里面
在相同的头部后添加:
1 | "Content-Length: %u" |
- Content-length代表 SDP(Session Description Protocol) 大小
在相同的尾部后添加 SDP(Session Description Protocol),会话描述协议。
SDP
SDP的描述信息是纯文本格式,每行都以一个字母开头,后面紧跟一个等号,后面是相关的参数内容。
格式为:<字符>=<参数值>
sdp会话描述包含一个会话级描述和多个媒体级描述
会话级描述的作用域是整个会话,其位置从”v=”行开始到第一个媒体描述为止;
媒体级描述是对单个的媒体流进行描述,如传输过程中的视频流信息、音频流信息,从m=开始到下一个媒体描述为止,
会话级描述包含:
- v=(协议版本)
- o=(所有者/创建者及会话标识符)
- s=(会话名)
- i=*(会话信息,可选)
- u=*(URI详情, 可选)
- e=*(Email地址,可选)
- p=*(电话号码,可选)
- c=*(连接信息,通常为IP地址,可选)
- b=*(带宽信息,可选)
- One or more time descriptions (see below)
- z=*(时间区改动,可选)
- k=*(加密密码,可选)
- a=*(零个或多个会话属性行,可选)
- t=(会话激活时间)
- r=*(零个或多个重复时间,可选)
会话级描述如下:1
2
3
4
5"v=0"
"o=- 9%1d 1 IN IP4 %s"
"s=media"
"t=0 0"
"a=control:*"
- o 中第一个参数给出当前时间,第二个参数给出ip地址
每个媒体级描述包含:
- m=(媒体名和传输地址)
- i=*(媒体标题,可选)
- c=*(连接信息,可选)
- b=*(带宽信息,可选)
- k=*(加密密码,可选)
- a=*(零个或多个媒体属性行,可选)
H264媒体级描述如下:1
2
3
4
5"m=video %hu RTP/AVP %d"
"c=IN IP4 0.0.0.0"
"a=rtpmap:%d H264/%d"
"a=framerate:%d"
"a=control:track%d"
- m {发送端口,负载类型 (H264是96) }
- a1 {负载类型,时钟速率 (H264是90000) }
- a2 {帧率 (看视频转化为h264的时候设置的多少) }
- a3 {标记媒体的轨道(视频为0)}
AAC媒体级描述如下:1
2
3
4
5"m=audio %hu RTP/AVP %d"
"c=IN IP4 0.0.0.0"
"a=rtpmap:%d mpeg4-generic/%u/%u"
"a=fmtp:%d profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210"
"a=control:track%d"
- m {发送端口,负载类型 (AAC是97) }
- a1 {负载类型,采样频率 (AAC是44100), 声道(2)}
- a2 {负载类型}
- a3 {标记媒体的轨道(音频为1)}
SETUP
在相同的尾部后添加1
"Session: %08x"
- Session:预先生成好的随机数,沿用
UDP_SETUP
在相同的头部后添加1
"Transport: RTP/AVP;unicast;client_port=%d-%d;server_port=%d-%d"
{客户端端口号, 客户端端口号+1, 服务器端口号, 服务器端口号+1}
TCP_SETUP
1 | "Transport: RTP/AVP/TCP;unicast;interleaved=%hhu-%hhu" |
{RTP通道数, RTP通道数+1}
PLAY
在相同的头部后添加1
2
3"Server: %s"
"Range: npt=0.000-"
"Session: %08x; timeout=60"
- Server 是服务器的名字
- Session:预先生成好的随机数,沿用