音视频系统中的RTSP协议

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包由一个头部和数据负载组成,头部格式如下:

img

  • 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字节

荷载

当数据比较小,可以直接发送;当数据比较大,需要分片

img

荷载前两个字节:

  • 第一个字节

img

F(1bit):表示错误,0为正常,1为错误

NRI(2bit):表示重要级别,最低级别00,中间级别01 10,最高级别11

Type(5bit):表示NALU的类型,一般是28(0x1C),是H264规范中定义的分片类型

  • 第二个字节

img

S:表示开始,1表示开始,0表示非开始

E:表示结束,1表示结束,0表示未结束

R:表示保留,必须为0

Type:表示NALU中Type,就是帧的第一个字节的低五位

  • 42
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值