RTSP服务端开发概述
一 概述
RTSP(Real Time Streaming Protocol),RFC2326,实时音视频流传输协议,是TCP/IP协议体系中的一个应用层协议。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或UDP完成数据传输。
在整个rtsp传输过程中,分别涉及到以下协议
rtsp传输协议建立会话,用于客户端和服务端之间的信息交互,流媒体参数的传输为音视频留的传输提供交互基础
rtp包在会话建立后,负责将音视频数据打包发送,在每一帧数据前加上rtp包头,用于客户端更快的识别处理数据
rtcp在传输影视频数据时,在客户端和服务端之间传输控制命令,控制音视频留的传输与播放等
RTSP URL格式示例:
rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream
二 交互过程概述
RTSP 常用请求有下面几种
RTSP 常用方法
交互流程图如下
client
serve
1.OPTIONS request
1.OPTIONS response
2.DESCRIBE request
2.DESCRIBE response
3.SETUP request
3.SETUP response
4.PLAY request
4.PLAY response
5.Media data Transfer
5.Control Command reauest
6.TEARDOWN request
6.TEARDOWN response
client
serve
流程解析:
1.OPTIONS:
客户端向服务端查询当前服务端当前可用的方法
2.DESCRIBE:
客户端向服务端请求当前媒体的描述信息,包括视频和音频的格式参数,服务端将当前对应的媒体参数填入SDP信息中,回复给客户端 (SDP信息将在后续文章中进行更新)
3.SETUP
请求建立会话,服务端根据客户端的信息,决定媒体数据传输的模式interleaved模式(使用TCP传输),非interleaved模式(使用udp传输),当使用udp传输时,此时应该建立两个UDP套接字,用于传输媒体出具,和RTCP控制数据,并在回复中写入创建套接字的端口
4.PLAY
客户端请求播放,服务端确认后回复,
5.Media Data Transer
传输媒体数据,以及RTCP控制协议。如果客户端要求视频的暂停,播放,快进,快退等,都是在RTCP数据中发出请求,
此外如果做再IPC领域做双向对讲功能,也可把客户端的音频数据,通过RTCP传输给服务端
6.TEARDOWN
客户端请求关闭视频,服务端回复后关闭
三 RTSP交互过程示例
请求消息格式:
方法 URI RTSP版本 CR LF
消息头 CR LF CR LF
消息体 CR LF
回应消息格式:
RTSP版本 状态码 解释 CR LF
消息头 CR LF CR LF
消息体 CR LF
状态码由三位数组成,表示方法执行的结果,定义如下:
1XX:保留,将来使用;
2XX:成功,操作被接收、理解、接受(received,understand,accepted);
3XX:重定向,要完成操作必须进行进一步操作;
4XX:客户端出错,请求有语法错误或无法实现;
5XX:服务器出错,服务器无法实现合法的请求
下面一则示例为 rtsp会话交互时的报文内容,不包括音视频数据包和RTCP控制命令包:
option
请求
OPTIONSrtsp://192.168.20.136:5000/xxx666RTSP/1.0
CSeq: 1 //每个消息都有序号来标记,第一个包通常是option请求消息
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10) //浏览器标识
回复
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 1 //每个回应消息的cseq数值和请求消息的cseq相对应
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, SCALE, GET_PARAMETER //服务器提供的可用的方法describe
请求
DESCRIBErtsp://192.168.20.136:5000/xxx666RTSP/1.0
CSeq: 2
token:
Accept: application/sdp
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
回复
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 2
x-prev-url: rtsp://192.168.20.136:5000
x-next-url: rtsp://192.168.20.136:5000
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Cache-Control: must-revalidate
Last-Modified: Fri, 10 Nov 2006 12:34:38 GMT
Date: Fri, 10 Nov 2006 12:34:38 GMT
Expires: Fri, 10 Nov 2006 12:34:38 GMT
Content-Base: rtsp://192.168.20.136:5000/xxx666/
Content-Length: 344
Content-Type: application/sdp
v=0 //以下都是sdp信息 描述此次媒体信息的格式
o=OnewaveUServerNG 1451516402 1025358037 IN IP4 192.168.20.136
s=/xxx666
u=http:///
e=admin@
c=IN IP4 0.0.0.0
t=0 0
a=isma-compliance:1,1.0,1
a=range:npt=0-
m=video 0 RTP/AVP 96 //m表示媒体描述,下面是对会话中视频通道的媒体描述
a=rtpmap:96 MP4V-ES/90000
a=fmtp:96 profile-level-id=245;config=000001B0F5000001B509000001000000012000C888B0E0E0FA62D089028307
a=control:trackID=0 //trackID=0表示视频流用的是通道0setup
请求
SETUPrtsp://192.168.20.136:5000/xxx666/trackID=0RTSP/1.0
CSeq: 3
Transport: RTP/AVP/TCP;unicast;interleaved=0-1 //
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
回复
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 3
Session: 6310936469860791894 //服务器回应的会话标识符
Cache-Control: no-cache
Transport: RTP/AVP/TCP;unicast;interleaved=0-1;ssrc=6B8B4567play
请求
PLAYrtsp://192.168.20.136:5000/xxx666RTSP/1.0
CSeq: 4
Session: 6310936469860791894
Range: npt=0.000- //设置播放时间的范围
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
回复
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 4
Session: 6310936469860791894
Range: npt=0.000000-
RTP-Info: url=trackID=0;seq=17040;rtptime=1467265309teardown
请求
TEARDOWNrtsp://192.168.20.136:5000/xxx666RTSP/1.0
CSeq: 5
Session: 6310936469860791894
User-Agent: VLC media player (LIVE555 Streaming Media v2005.11.10)
回复
RTSP/1.0 200 OK
Server: UServer 0.9.7_rc1
Cseq: 5
Session: 6310936469860791894
Connection: Close
四 RTSP开发要点
整个RTSP交互过程了解之后,现在来叙述一下RTSP开发过程中的重点难点,仅做开发思路指导用
1.确定RTSP服务端的架构
服务端为一个TCP套接字,监听并处理客户端发送的请求,确定好整个架构,来处理多个客户端的并发请求。
难点:
在处理setup会话后需要根据客户端请求,若客户端要求使用UDP传输视频数据,则在回复此会话钱建立两个UDP套接字,用于传输音视频数据或者RTCP控制命令。
若使用tcp传输,则使用当前会话使用的链接来传输所有的数据包,此处需要注意对客户端发送的请求加以区分。客户端来的请求中第一个字节为“$”为rtcp包,否则为RTSP会话的数据包
2.音视频数据RTP打包
以H264/H265为例,此处简要叙述,后续详细叙述
打包视频数据时,需要跳过Nalu头部,H264nalu头部为一个字节,H265nalu头部为两个字节。当数据小于指定大小事,添加RTP头部后,单包发送,当大于指定大小时,对视频数据进行分包发送。分包时,需要在每一包数据前面添加头部,用以区分当前数据包是否发送完毕,H264为2个字节,H265为三个字节,然后添加rtp包头后发送。
打包音频数据时,G711数据直接添加RTP包头后打包发送,AAC数据需要去掉AAC数据的七个字节头,并加上4个字节aac_header,然后添加RTP包头发送。
RTP报头如下
RTP报头
具体rtp打包过程将在后续更新
3.DESCRIBE中SDP描述信息
在SDP信息中描述了媒体信息----音频和视频的播放参数,注意playload type(PCMU 0, PCMA 8,H264/H265 96,AAC 97)
其次注意fmtp,视频的fmtp中需要根据具体参数(sps,pps)计算部分参数。音频的fmtp中包config参数需要计算,但对于固定格式的音频,可以提前算好,写入SDP。
4.音视频数据时间戳
音视频数据帧的时间戳单位均为:1/频率,传输数据帧时,需要将时间戳单位进行转化,当数据源为直播是,音视频时间戳不需要额外处理,可直接转化单位后使用。当来源于文件时,需要调整时间戳,因为客户端会使用音视频时间戳进行同步。
RTSP服务端开发概述的更多相关文章
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- Day01_搭建环境&CMS服务端开发
学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- Android 服务端开发之开发环境配置
Android 服务端开发之开发环境配置 这里是在Eclipse的基础上安装PhpEclipse插件方法,PHPEclipse是Eclipse的 一个用于开发PHP的插件.当然也可以采用Java开发a ...
- Swift3.0服务端开发(三) Mustache页面模板与日志记录
本篇博客主要介绍如果在Perfect工程中引入和使用Mustache页面模板与日志记录系统.Mustache页面模板类似于PHP中的smarty模板引擎或者Java中的JSTL标签.当然Mustach ...
- Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)
前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...
- 如何有效快速提高Java服务端开发人员的技术水平?
我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...
- WCF服务端开发和客户端引用小结
1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...
- socket服务端开发之测试使用threading和gevent框架
socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...
随机推荐
- Jmeter创建随机数作为参数使用 转
1.选项-函数值手对话框:2.选择适当的函数,比如"__Random()":3.输入参数,比如随机数的最大.最小数:4."Name of variable in whic ...
- spring boot: 用thymeleaf嵌套循环展示多层数据(spring boot 2.3.2)
一,什么情况下会用到嵌套循环? 当我们展示多个分类时,每个分类下又展示出推荐的前几个商品, 这时我们需要用到嵌套循环 看一个例子: 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https:/ ...
- swagger使用随笔
2020-10-21 在一技术群里看到有个大佬想用 swagger 实现个功能:基础 Api 项目中写好通用的接口,配置好 swagger .上级项目直接引用项目,就能访问 swagger 起来用.相 ...
- Java SFTP 上传、下载等操作
Java SFTP 上传.下载等操作 实际开发中用到了 SFTP 用于交换批量数据文件,然后琢磨了下这方面的东西,基于 JSch 写了个工具类记录下,便于日后使用. JSch是 SSH2 的纯Java ...
- LoRa技术的特点和组成系统分析
目前,基于LoRa技术的网络层协议主要是LoRaWAN,也有少量的非LoRaWAN协议,但是通信系统网络都是星状网架构,以及在此基础上的简化和改进.主要包括以下3种. (1)点对点通信. 一点对一点通 ...
- 痞子衡嵌入式:基于恩智浦i.MXRT1060的MP4视频播放器(RT-Mp4Player)设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是基于i.MXRT1062的MP4播放器参考设计. i.MXRT1062是恩智浦i.MXRT四位数系列的中端型号,外设搭配上很均衡,辅以6 ...
- Linux 环境下 C++ 的开发编译
Linux环境下C++程序的开发编译学习笔记 环境:vmware 运行下的Ubuntu 16.04 姓名:谢津 时间:2018/5/24 内容:1)vim的安装及配置:2)第一个C++程序的编写与编译 ...
- Dapr Java Http 调用
版本介绍 Java 版本:8 Dapr Java SKD 版本:0.9.2 Dapr Java-SDK HTTP 调用文档 有个先决条件,内容如下: Dapr and Dapr CLI. Java J ...
- ES6--正则表达式
创建正则表达式规则的四种方法 var regex = new RegExp('xyz', 'i'); var regex = new RegExp(/xyz/i); var regex = new R ...
- DTU的工作原理和流程
DTU是无线数据传输模块,采用2G,3G,4G网络,将本地串口数据经DTU打包成TCP或者UDP数据进行远程传输的设备.使用方便.已经在各行业远程数据传输,设备监控等领域大量应用.如智能仪器仪表.智能 ...