RTSP协议
RTSP协议基于RTP和RTCP之上的,RTP传输媒体数据,RTCP来交互控制命令。
- RTSP 是一种客户端/服务器协议,用于控制实时流媒体服务器上的媒体资源的传输。它提供了一种类似于HTTP的控制接口,允许客户端对流媒体进行播放、暂停、停止、快进、快退等控制操作。
- RTSP 并不传输实际的媒体数据,而是通过描述媒体资源的 URL 连接到流媒体服务器,然后使用 RTP 协议传输实际的媒体数据。
//客户端的请求格式
Method url version \r\n
CSeq: x\r\n
xxx\r\n
...
\r\n
method:表示方法
url:请求地址,一般为rtsp://ip:port/session,默认554端口,常用8554端口
version:表示版本,这里取RTSP/1.0
CSeq:序列号,递增的证书
//服务器的响应格式
Version 200 OK\r\n
CSeq: x\r\n
xxx\r\n
...
\r\n
200遵循http协议状态码,表示成功
协议内容
- OPTIONS方法:获取服务端提供的可用方法。
- DESCRIBE方法:获取对应会话的媒体描述信息。
- SETUP方法:向服务器发起建立请求、建立连接会话。
- PLAY方法:向服务端发起播放请求。
- TEARDOWN方法:向服务器发起关闭连接的会话请求。
协议流程
//客户端C向服务器S发送OPTIONS
OPTIONS rtsp://127.0.0.1:221/live RTSP/1.0\r\n
CSeq: 1\r\n
\r\n
//服务器S收到后,回应客户端C,告诉客户端可用的方法
RTSP/1.0 200 OK\r\n
CSeq: 1\r\n
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY\r\n
\r\n
//客户端向服务器发送DESCRIBE命令,获取媒体的描述信息
//C->S
DESCRIBE rtsp://127.0.0.1:554/live RTSP/1.0\r\n
CSeq: 2\r\n
Accept: application/sdp\r\n
\r\n
//服务器回应客户端
RTSP/1.0 200 OK\r\n
CSeq: 2\r\n
Content-length: xxx\r\n
Content-type: application/sdp\r\n
\r\n
v=0\r\n
...各种属性描述
//客户端发送SETUP命令
SETUP rtsp://127.0.0.1:554/live/track0 RTSP/1.0\r\n
CSeq: 3\r\n
Transport: RTP/AVP;unicast;client_port=50000-50001\r\n
\r\n
RTP/AVP表示RTP通过UDP发送,如果是RTP/AVP/TCP则表示RTP通过TCP发送
Unicast表示单播,multicast表示多播
Client_port表示50000是RTP端口,50001是RTCP端口,都是UDP套接字
//服务端回应客户端
RTSP/1.0 200 OK\r\n
CSeq: 3\r\n
Transport:RTP/AVP;unicast;client_port=50000-50001;server_port=55000-55001\r\n
Session:12345678\r\n
\r\n
Server_port表示服务器使用这两个端口传输数据,其中55000是RTP,55001是RTCP
//客户端开始发送PLAY命令
PLAY rtsp://127.0.0.1:554/live RTSP/1.0\r\n
CSeq: 4\r\n
Session: 12345678\r\n
Range: npt=0.000-\r\n
\r\n
//服务端回应客户端
RTSP/1.0 200 OK\r\n
CSeq: 4\r\n
Range:npt=0.000-\r\n
Session: 12345678;timeout=60\r\n
\r\n
服务器回复完这个数据之后,回向客户端的RTP端口(50000)发送数据
//客户端要关闭连接时,发送TEARDOWN命令
TEARDOWN rtsp://127.0.0.1:554/live RTSP/1.0\r\n
CSeq: 5\r\n
Session: 12345678\r\n
\r\n
//服务端回应客户端
RTSP/1.0 200 OK\r\n
CSeq: 5\r\n
\r\n
sdp数据格式
服务器给客户端发送响应时,这里使用sdp数据格式。
sdp由多行的key=value组成,完整的sdp包括会话元数据、网络描述、流描述、加密描述、Qos和分组描述,一般来说,会话描述、网络描述和流描述(媒体描述)是必须的,其他的是可选的
v=开始都是会话描述
m=开始都是媒体描述
t=开始都是时间描述
会话描述
- v表示版本
- o表示用户、会话id、会话版本、网络类型、地址类型、地址
o=-12345678901 1 IN IP4 127.0.0.1\r\n
//用户名:-
//会话id:12345678901
//会话版本:1
//网络类型:IN就是internet
//地址类型:IP4是ipv4
//地址:127.0.0.1
- s会话名称
- i会话文本信息
- u会话信息地址
- e电子邮件地址
- p电话信息
- c连接类型和地址
- b带宽限制
- z时区信息
- k加密密钥
时间描述
- t开始和结束时间
- r重复的周期和持续时间
媒体描述
- m媒体类型、端口号、传输协议、媒体格式
m=video 0 RTP/AVP 96\r\n
//这里端口号一般无效,因为真正的端口号在SETUP命令中处理
//96代表H.264
- a媒体格式
- i、c、b、k和会话描述是一致的含义(但内容可能不一样)
RTP协议
使用RTP 协议来传输实际的媒体数据。当客户端发送一个播放命令(PLAY),服务器就开始在UDP上传送媒体流(RTP包)到客户端。
头部
二进制协议,最重要的就是内容成分组成和位宽,RTP包由一个头部和数据负载组成,头部格式如下:
- V:表示版本号,2个bit
- P:表示填充位,1个bit。为0表示包尾部没有填充附加字节,为1则表示有
- X:表示扩展为,1个bit。为1表示包后面还有一个扩展头部
- CC是CSRC个数,4个bit,表示后面CSRC的个数0~15个
- M:表示标记位,1个bit,给配置文档来用的
- PT:表示荷载类型,7个bit
- 序列号(SN):16个bit
- 时间戳:32个bit,记录数据荷载部分采样时刻
- 同步信源(SSRC)标识符:32个bit,标记RTP的来源,一个RTP会话中不能有两个SSRC值
- 特约信源(CSRC)标识符:最多15个,每个都是32个bit,一般不用
- 数据荷载的格式一般依据音视频本身的格式
位域:高位和低位的情况要进行分别,Datasheet中默认左边是高位,右边是低位;位域中先声明的是低位,后声明的是高位。
class RTPHeader
{
public:
unsigned short csrccount : 4;
unsigned short extension : 1;
unsigned short padding : 1;
unsigned short version : 2;
unsigned short pytype : 7;
unsigned short mark : 1;
unsigned short serial;
unsigned timestamp;
unsigned ssrc;
unsigned csrc[15];
public:
RTPHeader() {}
~RTPHeader() {}
};
一个RTP包的长度不要超过1400字节
荷载
当数据比较小,可以直接发送;当数据比较大,需要分片
荷载前两个字节:
- 第一个字节
F(1bit):表示错误,0为正常,1为错误
NRI(2bit):表示重要级别,最低级别00,中间级别01 10,最高级别11
Type(5bit):表示NALU的类型,一般是28(0x1C),是H264规范中定义的分片类型
- 第二个字节
S:表示开始,1表示开始,0表示非开始
E:表示结束,1表示结束,0表示未结束
R:表示保留,必须为0
Type:表示NALU中Type,就是帧的第一个字节的低五位