rtsp协议分析

rtsp概述

rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326:这是RTSP的初始定义版本v1.0,由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组(IETF)作为RFC标准。RFC7826:这是RTSP的后续更新版本v2.0,对RFC2326中的RTSP进行了扩展和更新。

rtsp协议属于基于文本的应用层协议,rtsp的底层协议可以是udp也可以是tcp

ffmpeg 参数-rtsp_transport tcp 用于指定RTSP会话底层传输协议为TCP,实现 RTSP 的系统必须支持通过 TCP 承载 RTSP,并且可以支持 UDP。 RTSP 服务器的默认端口对于 UDP 和 TCP 都是 554

本身并不传输流媒体数据,只是提供流媒体的控制,实际流媒体的传输使用rtp协议,协议文档可以从资源链接下载rtsp协议中英双文icon-default.png?t=N7T8https://download.csdn.net/download/shenhuxi_yu/89358966

使用wireshark rtsp筛选器既可以比较容易的分析rtsp协议内容

如上图是本地使用vlc工具打开远程流的过程中抓到的rtsp包,rtsp报文包括request和response,服务端和客户端都可以法request和response

request 报文分析

以第一个报文为例rtsp报文的格式如下

一个client请求sever的options request的消息格式如下,request-line是request的第一行,CRLF作为行结束符,CSeq 字段指定 RTSP 请求-响应对的序列号。 该字段必须出现在所有请求和响应中。 对于每个包含给定序列号的 RTSP 请求,都会有一个具有相同编号的相应响应。 任何重传的请求必须包含与原始请求相同的序列号(即,序列号不会因相同请求的重传而增加)。SP分隔符具体是指空格字符(Space Character)

C->S:  OPTIONS * RTSP/1.0 
CSeq: 1 
Require: implicit-play 
Proxy-Require: gzipped-messages 
Request = Request-Line     ; Section 6.1 
*( general-header ; Section 5  
| request-header  ; Section 6.2
| entity-header ) ; Section 8.1 
CRLF 
[ message-body ] ; Section 4.3 

Request-Line = Method SP Request-URI SP RTSP-Version CRLF 
Method = "DESCRIBE"       ; Section 10.2 
| "ANNOUNCE"       ; Section 10.3 
| "GET_PARAMETER" ; Section 10.8 
| "OPTIONS"        ; Section 10.1 
| "PAUSE"          ; Section 10.6 
| "PLAY"           ; Section 10.5 
| "RECORD"         ; Section 10.11 
| "REDIRECT"      ; Section 10.10 
| "SETUP"          ; Section 10.4 
| "SET_PARAMETER" ; Section 10.9 
| "TEARDOWN"       ; Section 10.7 
| extension-method 

extension-method = token 

Request-URI = "*" | absolute_URI 

RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT 

request-header    = Accept             ; Section 12.1 
| Accept-Encoding  ; Section 12.2 
| Accept-Language  ; Section 12.3 
| Authorization     ; Section 12.5 
| From                ; Section 12.20 
| If-Modified-Since ; Section 12.23 
| Range               ; Section 12.29 
| Referer             ; Section 12.30 
| User-Agent          ; Section 12.41 

response 报文分析

第二条报文时response报文类型CSeq与第一个报文相同,因此是对第一个报文的回复

Response  =    Status-Line       ; Section 7.1 
*(  general-header   ; Section 5 
|   response-header  ; Section 7.1.2 
|    entity-header ) ; Section 8.1 
CRLF 
[message-body ] ; Section 4.3 

Status-Line = RTSP-Version SP Status-Code SP Reason-Phrase CRLF

response-header = Location            ; Section 12.25 
| Proxy-Authenticate ; Section 12.26 
| Public               ; Section 12.28 
| Retry-After         ; Section 12.31 
| Server               ; Section 12.36 
| Vary                 ; Section 12.42 
| WWW-Authenticate   ; Section 12.44 

Status-Code状态表如下

客户端使用 OPTIONS 方法查询服务器支持的方法。 服务器使用Public响应头列出它支持的方法。并使用Server响应头报告服务器信息。

rtsp连接过程

从如上的抓包可以看到vlc打开并播放rtsp流的过程的报文以此是OPTIONS-->DESCRIBE-->SETUP-->PLAY,,开始播放后每隔58s通信一次GET_PARAMETER消息。当客户端关闭VLC的时候发送TEARDOWN报文。

这个过程的解释如下

OPTIONS 请求可以在任何时候发出,例如,如果客户端将要尝试一个非标准请求。 
它不会影响服务器状态。

DESCRIBE 方法从服务器检索由请求 URL 标识的演示文稿或媒体对象的描述。 
它可以使用 Accept 头来指定客户端理解的描述格式。 
服务器以所请求资源的描述作为响应。 DESCRIBE 回复-响应对构成了 RTSP 的媒体初始化阶段

SETUP 请求指定用于流媒体的传输机制。 客户端可以对已经播放的流发出 SETUP 请求以更改传输参数,
服务器可以允许。 如果它不允许这样做,它必须以错误“455 Method Not Valid In This State”响应。 
为了通过任何中间防火墙,客户端必须指明传输参数,即使它对这些参数没有影响,
例如,服务器在哪里通告固定的多播地址。服务器生成会话标识符以响应 SETUP 请求。 
如果对服务器的 SETUP 请求包含会话标识符,则服务器必须将此设置请求捆绑到
现有会话或返回错误“459 不允许聚合操作”

PLAY 方法告诉服务器通过 SETUP 中指定的机制开始发送数据。 
在任何未完成的 SETUP 请求被确认为成功之前,客户端不得发出 PLAY 请求。
PLAY 请求将正常播放时间定位到指定范围的开始,并传送流数据直到到达范围结束。 
PLAY 请求可能会被流水线化(排队); 服务器必须将 PLAY 请求按顺序执行。 
也就是说,在前一个 PLAY 请求仍处于活动状态时到达的 PLAY 请求会被延迟,直到第一个请求完成。

GET_PARAMETER 请求检索 URI 中指定的演示文稿或流的参数值。 
回复和响应的内容留给实现。 没有实体主体的 GET_PARAMETER 
可用于测试客户端或服务器的活跃度(“ping”)。

TEARDOWN 请求停止给定 URI 的流传输,释放与之关联的资源。 
如果 URI 是此演示文稿的演示文稿 URI,则与该会话关联的任何 RTSP 会话标识符都不再有效。 
除非所有传输参数都由会话描述定义,否则必须在会话再次播放之前发出 SETUP 请求。

另外在DESCRIBE报文的回复报文中使用了SDP协议报文描述会话信息,在RTSP中,会话指的是客户端和服务器之间建立的一个连接,用于控制多媒体流的传输。这个连接通过一系列的RTSP请求和响应来维护,包括设置参数、播放、暂停、停止等操作。会话的关闭动作是客户端发送TEARDOWN报文发起的。

SETUP报文后会建立客户端与服务端的会话,如下Session字段,建立会话之后的报文都会把Session ID放到报文中

PLAY报文会上报请求播放的时间范围Range

PLAY的response报文会把时间戳和包序号回复过来如下图。seq:表示流的第一个数据包的序列号。 rtptime:表示Range响应头中时间值对应的RTP时间戳。

rtsp的实现

ffmpeg可以推流拉流,ffmpeg中有rtsp客户端的实现,zlmediakit中有rtsp服务端的实现,zlmediakit作为rtsp服务端能够接收客户端(如ffmpeg、VLC等)发送的RTSP请求,如播放、暂停、录制等,并处理这些请求,提供相应的流媒体数据。

rtsp服务端和客户端的代码分析待更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/662672.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接:loading 截稿时间:9月15日 检索:EI检索 一、会议信息 大会官网:www.ciotsc.org 会议地点:湖南株洲 会议时间:2023年11月15日-17日 二、征稿主…

探索AES对称加密:Python代码实战

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:从非对称到对称 二、AES加密机制概述 三、Python实现AES加密与解密 …

FreeRTOS【8】二值信号量使用

1.开发背景 FreeRTOS 提供了队列可以在线程间快速交换信息,那么还有没有其他交互渠道?答案是有的,相对于队列传递信息,还有更轻量级的线程唤醒操作,那就是信号量,而二值信号量就是最简单的一种。 二值信号量…

揭秘希喂、小米、安德迈宠物空气净化器的惊人效果,性价比爆表!

当谈及养猫,首先浮现在脑海中的烦恼无疑是猫咪的掉毛和便臭问题。这些问题对于我们这些爱宠人士来说,无疑是一种持续的挑战。特别是在炎热的夏季,高温本身就让人焦躁不安,而空气中飘散的猫浮毛和便臭更是加剧了这种不适感。 为了…

Linux系统编程(五)多线程创建与退出

目录 一、基本知识点二、线程的编译三、 线程相关函数1. 线程的创建(1)整型的传入与接收(2)浮点数的传入与接收(3)字符串的传入与接收(4)结构体的传入与接收 2. 线程的退出3. 线程的…

智慧仓储新动力:EasyCVR+AI视频智能监管系统方案助力仓储安全高效管理

一、背景 随着物流行业的快速发展和智能化水平的提升,智慧仓储视频智能监管系统已成为现代仓储管理的重要组成部分。本系统通过综合运用物联网、视频分析、边缘计算等技术手段,实现对仓储环境的全面监控、智能分析和高效管理。 TSINGSEE青犀视频汇聚Ea…

【单片机毕设选题】-智能语音控制风扇

一. 系统功能 此设计采用STM32和SU-03T离线语音模块来控制风扇, 主要功能如下: 1. 通过DHT11温湿度模块来采集环境温湿度。 2. 通过SU-03T语音模块来控制风扇启停加减速等。 3. 通过OLED显示系统状态。 4. 可以通过按键控制风扇启停加减速等。 5. 通过蓝牙模块监视系统状…

【IOT】OrangePi+HomeAssistant+Yolov5智能家居融合

前言 本文将以OrangePi AIpro为基础,在此基础构建HomeAssistant、YOLO目标检测实现智能家居更加灵活智能的场景实现。 表头表头设备OrangePi AIpro(8T)系统版本Ubuntu 22.04.4 LTSCPU4核64位处理器 AI处理器AI算力AI算力 8TOPS算力接口HDMI2、GPIO接口、Type-C、M.2…

06.逻辑回归

文章目录 Generate Model优化边界为线性证明损失函数比较逻辑回归不能用均方误差Generative v.s. DiscriminativeMulti-class Classification逻辑回归的限制自己找线性变换 Generate Model 假设样本符合高斯分布 即找 μ \mu μ和 σ \sigma σ 优化 共用 Σ \Sigma Σ减少…

CSS学习笔记:vw、vh实现移动端适配

移动端适配 移动端即手机端,也称M端 移动端适配:同一套移动端页面在不同屏幕尺寸的手机上可以实现宽度和高度的自适应,也就是页面中元素的宽度和高度可以根据屏幕尺寸的变化等比缩放 之前我在一篇博客中介绍了rem实现移动端适配&#xff0…

这样写代码太优雅了吧

文章目录 优化案例初次优化再次优化看看Spring源码的处理 优化案例 假设一个场景, 开发代码时,需要对类中的方法进行遍历,判断有没有注解NotNull,暂时没有合适的工具类,需要自己手搓一个。 无须多想,分分钟…

CSS学习笔记:响应式布局的原理——媒体查询

什么是响应式布局? 在实际书写代码时,我们不会自己去手写媒体查询来实现响应式布局,我们一般会调用现成的代码库或使用现成的框架(但这些代码库或框架的底层原理是媒体查询,所以了解媒体查询也是很有必要的&#xff0…

应用弹窗优先级

背景 由于活动业务越来越多,积累的弹窗越来越多和杂乱,出现如下弹窗交互问题: 弹窗无限重叠,影响操作 弹出顺序无优先级,重要弹窗被隐藏 原因相信大家都一样,产品是一次次迭代的,也可能是不…

ozon卖家精灵,ozon卖家怎么使用

在跨境电商的浪潮中,OZON作为俄罗斯领先的电商平台,吸引了众多卖家争相入驻。然而,面对日益激烈的市场竞争,如何提升店铺的运营效果,成为卖家们迫切需要解决的问题。而OZON卖家精灵作为一款专为OZON卖家打造的辅助工具…

Lua的几个特殊用法

:/.的区别 详细可以参考https://zhuanlan.zhihu.com/p/651619116。最重要的不同就是传递默认参数self。 通过.调用函数,传递self实例 通过 : 调用函数,传递self (不需要显示的传递self参数,默认就会传递,但…

ROS | C++和python实现发布结点和订阅结点

发布者结点: 代码实现: python: C: C和Python发布结点的差异: python: 发布结点pub 大管家rospy调用publisher函数发布话题 (话题,类型,话题长度) C: 先定义一个大管家:NodeHandle 然后大管家发布话题…

【C++】二维前缀和

1.题目 2.算法思路 和一维前缀和的方法类似&#xff0c;我们需要预处理一个求和矩阵&#xff0c;然后再求和。 下面是模板&#xff1a; 上面两张图片总结出来了两个公式&#xff0c;这是解决此类问题的关键。 3.代码 #include <iostream> using namespace std; #incl…

【车载开发系列】Vector工具链的安装

【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装一. VectorDriver二. DaVinci_Developer三. DaVinci Configurator 一. VectorDriver Vector Driver Setup是Vector产品链中重要的驱动软件,所有的硬件设备进行连接…

看看最新的B端登录界面,你是不是被潮流抛弃了?

毛玻璃风格&#xff08;Frosted Glass Style&#xff09;是新拟态设计风格中的一种分支&#xff0c;它灵感来源于现实世界中的毛玻璃材质。毛玻璃是一种通过在玻璃表面加工处理的方式&#xff0c;使其具有模糊、云翳和透明效果的特殊玻璃。 在设计中&#xff0c;毛玻璃风格通常…

PS:电子书App自动截图后合成一个PDF文档

说明&#xff1a;有的电子书App不能下载到本地&#xff0c;通过自动截图后合成一个PDF文档来解决&#xff01; 一、自动截图App 1.安装”免ROOT自动化助手“ 2.创建一个任务 3.编辑任务&#xff1a;根据电子书的操作顺序制定&#xff0c;400次就是书籍页数&#xff08;次数一…