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 ...
随机推荐
- centos8平台:redis6配置启用io多线程(redis6.0.1)
一,linux平台上redis6的安装 请参见这一篇: https://www.cnblogs.com/architectforest/p/12830056.html 说明:刘宏缔的架构森林是一个专注 ...
- 远程Jenkins新增Mac电脑节点
一,前言 上一篇博客Jenkins集成appium自动化测试(Windows篇)介绍了怎么使用远程Jenkins新建节点连接本地Windows电脑进行Appium自动化测试集成. 但是在做ios Ap ...
- Laravel使用Ajax提交表单报419 unknown status错误的解决方法
1.在head标签中间添加一行meta标签:<meta name="csrf-token" content="{{ csrf_token() }}"> ...
- java中true不是关键字?
java中true ,false , null在java中不是关键字,也不是保留字,它们只是显式常量值,但是你在程序中不能使用它们作为标识符. 其中const和goto是java的保留字.java中所 ...
- Volley获取json对象
url必须返回一个json文本,由于网上没有找到返回json的url,我用Tomcat写了一个json文件, 在这个文件夹下见一个以json后缀的json文件,内容是json文本,然后输入浏览器输入h ...
- 基于Python与命令行人脸识别项目(系列二)
接着系统一,继续开始我们face_recognition. Python 模块:face_recognition 在Python中,你可以导入face_recognition模块,调用丰富的API接口 ...
- 【2】TensorFlow光速入门-数据预处理(得到数据集)
本文地址:https://www.cnblogs.com/tujia/p/13862351.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...
- C. Vladik and Memorable Trip 解析(思維、DP)
Codeforce 811 C. Vladik and Memorable Trip 解析(思維.DP) 今天我們來看看CF811C 題目連結 題目 給你一個數列,一個區段的數列的值是區段內所有相異數 ...
- python引用方法赋值问题探究
python脚本编写中,经常会遇到引用一个模块的方法的场景.引用的方法里到底赋不赋值曾经困扰了我好久. 最近利用python写了一个接口自动化测试脚本,在查阅观看多篇博文和视频后解决了封装方法引用的问 ...
- 云计算管理平台之OpenStack块存储服务cinder
一.cinder简介 cinder是openstack环境中的块存储服务,主要为运行在openstack之上的虚拟机提供块存储服务的:所谓块存储就是我们经常用的硬盘呀,U盘啊,SD卡等等这些块设备的, ...