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 ...
随机推荐
- spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)
一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...
- django环境安装与项目创建方式
1.安装django pip install django2.检查django版本 : python -m django --version 3.创建项目 django-admin startproj ...
- STL: set和map的区别、联系、使用
set是一种关联式容器,其特性如下: set以RBTree作为底层容器 所得元素的只有key(键)没有value(值) 不允许出现键重复 所有的元素都会被自动排序 不能通过迭代器来改变set的值,因为 ...
- byte + byte = int
byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,byte<char<short<int<long<float<double
- vue项目中mockjs的使用
mock.js是一个库,源码托管:https://github.com/nuysoft/Mock github上的原话:Mock.js是一个模拟数据生成器,可帮助前端开发和原型与后端进度分开,并减少某 ...
- OpenTelemetry架构介绍
OpenTelemetry: 经得起考验的工具 摘自:https://blog.newrelic.com/product-news/what-is-opentelemetry/ 目录 OpenTele ...
- Kitty基于Spring Boot、Spring Cloud、Vue.js、Element实现前后端分离的权限管理系统
源码地址:https://gitee.com/liuge1988/kitty 软件架构 后端架构 开发环境 IDE : eclipse 4.x JDK : JDK1.8.x Maven : Maven ...
- 使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化
1.简介 使用微创联合M5S空气检测仪.树莓派3b+.prometheus.grafana实现空气质量持续监控告警WEB可视化 grafana dashboard效果: 2.背景 2.1 需求: 1. ...
- Git系列:常用命令
一.背景 作为一名程序员,怎么能不懂Git那些常用命令呢?于是花费一点时间来总结Git命令.关于安装的话,就不讲了. 二.常用命令 1.配置全局的用户名称和用户邮箱 git config --glob ...
- PHP 将数组转换为JSON字符串<兼容中文>
1 /************************************************************** 2 * 3 * 使用特定function对数组中所有元素做处理 4 ...