简介

RTSP是RTP中负责定义具体的控制消息、操作方法、状态码等的协议,但它本身并不传输数据,而是必须依赖于下层传输协议所提供的某些服务。

RTSP 可以实现如下的指令集,这些指令是面向客户端编写的。

1
2
3
4
5
enum Method
{
OPTIONS, DESCRIBE, ANNOUNCE, SETUP, PLAY, RECORD, PAUSE, GET_PARAMETER, TEARDOWN,
NONE,
};

本文仅实现下面的子集

1
2
3
4
5
enum Method
{
OPTIONS, DESCRIBE, SETUP, PLAY,
NONE,
};

指令集

每个指令对应一个字符串,在每次调用之后,需要将字符串发送给客户端。

为了代码阅读方便、美观,每一个字符串最后都省略了"\r\n"

每个指令都有相同的头部:

1
2
"RTSP/1.0 200 OK"
"CSeq: %u"
  • RTSP/1.0 200 OK 用于回应请求成功
  • CSeq 代表该消息的序列号

和相同的尾部:

1
"\r\n"

OPTION

该指令主要用于展示服务器提供给客户端可调用的指令

在相同的头部后添加:

1
2
"Public: DESCRIBE, SETUP, PLAY, TEARDOWN"
"Server: %s"
  • Public 用于展示服务器有哪些指令
  • Server 是服务器的名字

DESCRIBE

该指令用于描述整个会话,视频和音频的描述配置都存放在里面

在相同的头部后添加:

1
2
"Content-Length: %u"
"Content-Type: application/sdp"
  • 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:预先生成好的随机数,沿用