流媒体传输 - RTSP 协议报文分析

news2025/4/16 11:40:02

在流媒体传输 - RTSP 协议中,我们分析 RTSP 协议交互的整个流程,在本篇文章中,我们对交互中携带的报文进行详细分析。

Request

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

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
​
SP = space
​
extension-method = token
​
Request-URI = "*" | absolute_URI
​
RTSP-Version = "RTSP" "/" 1*DIGIT "." 1*DIGIT

注意,与 HTTP / 1.1 相比,RTSP 请求始终包含绝对 URL(即,包括 方案、主机、端口),而不仅仅是绝对路径。 Request-URI 中的星号 "*" 表示该请求不适用于特定资源,而是适用于服务器本身,并且仅在所使用的方法不一定适用于资源时才被允许。比如: > OPTIONS * RTSP/1.0

Request Header Fields

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

在接收并解释了请求消息后,接收者以 RTSP 响应消息进行响应。

响应消息除了将 HTTP 版本替换为 RTSP 版本之外,其他都适用。 此外,RTSP 定义了其他状态代码,并且没有定义某些 HTTP 代码。 表 1 中定义了有效的响应代码及其可使用的方法。

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

响应消息的第一行是状态行,由协议版本,后跟数字状态代码以及与状态代码关联的文本短语组成,每个元素由 SP 字符分隔。 除最后的 CRLF 序列外,不允许有 CR 或 LF。

Status-Line    =    RTSP-Version SP Status-Code SP Reason-Phrase CRLF
​
Status-code    =    3DIGIT
​
Reason-Phrase  =    *<TEXT, excluding CR, LF>

Status Code 和 Reason-Phrase

Status Code 是 3 位数的整数结果代码,表示请求是否被理解或被满足。这些代码在第 11 节中有完整定义。Reason-Phrase 旨在简要说明 Status Code。Status Code 供机器使用,Reason-Phrase 供人类用户使用。 客户端不需要检查或显示 Reason-Phrase。

Status Code 的第一位数字定义了回应的类别,后面两位数字没有具体分类。首位数字有 5 种取值可能:

  • 1xx:保留,将来使用。

  • 2xx:成功:操作被接收、理解、接受(received, understood, accepted)。

  • 3xx:重定向(Redirection):要完成请求必须进行进一步操作。

  • 4xx:客户端出错:请求有语法错误或无法实现。

  • 5xx:服务器端出错:服务器无法实现合法的请求。

具体 Status Code 含义可查看 RFC 2326 Session 11 : Status Code Definitions

Response Header Fields

响应头字段允许请求接收者传递关于响应的其他信息,这些信息不能放在状态行中。 这些头字段提供有关服务器以及对由 Request-URI 标识的资源的进一步访问的信息。

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

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
【文章福利】:

免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

  

Method Definitions

OPTIONS

OPTIONS 用于询问 Server 有哪些方法可用

C->S:  OPTIONS * RTSP/1.0
       CSeq: 1
       Require: implicit-play
       Proxy-Require: gzipped-messages
​
S->C:  RTSP/1.0 200 OK
       CSeq: 1
       Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE

DESCRIBE

DESCRIBE 方法从服务器检索表示的描述或媒体对象,这些资源通过请求统一资源定位符(the request URL)识别。此方法可能结合使用 Accept 首部域来指定客户端理解的描述格式。服务器端用被请求资源的描述对客户端作出响应。 DESCRIBE 的答复 - 响应对(reply-response pair)组成了 RTSP 的媒体初始化阶段。

C->S: DESCRIBE rtsp://server.example.com/fizzle/foo RTSP/1.0
      CSeq: 312
      Accept: application/sdp, application/rtsl, application/mheg
​
S->C: RTSP/1.0 200 OK
      CSeq: 312
      Date: 23 Jan 1997 15:35:06 GMT
      Content-Type: application/sdp
      Content-Length: 376
​
      v=0
      o=mhandley 2890844526 2890842807 IN IP4 126.16.64.4
      s=SDP Seminar
      i=A Seminar on the session description protocol
      u=http://www.cs.ucl.ac.uk/staff/M.Handley/sdp.03.ps
      e=mjh@isi.edu (Mark Handley)
      c=IN IP4 224.2.17.12/127
      t=2873397496 2873404696
      a=recvonly
      m=audio 3456 RTP/AVP 0
      m=video 2232 RTP/AVP 31
      m=whiteboard 32416 UDP WB
      a=orient:portrait

DESCRIBE 响应必须包含它描述的资源的所有媒体初始化信息。 如果媒体客户端从 DESCRIBE 以外的来源获得媒体描述,并且该描述包含完整的媒体初始化参数集,则客户端应使用这些参数,而不是通过 RTSP 请求相同媒体描述。

DESCRIBE 响应携带的 SDP 信息详见:

流媒体传输 - RTSP 协议

SETUP

C->S: SETUP rtsp://example.com/foo/bar/baz.rm RTSP/1.0
      CSeq: 302
      Transport: RTP/AVP;unicast;client_port=4588-4589
​
S->C: RTSP/1.0 200 OK
      CSeq: 302
      Date: 23 Jan 1997 15:35:06 GMT
      Session: 47112344
      Transport: RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257

URI 的 SETUP 请求指定要用于流媒体的传输机制。客户端可以对已经播放的流发出 SETUP 请求,以更改传输参数(服务器可以允许)。如果不允许这样做,它必须以错误 "455 方法在此状态下无效" 响应。为了使任何中间的防火墙受益,客户端必须指示传输参数,即使它对这些参数没有影响,例如,在服务器通告固定的多播地址的地方。

由于 SETUP 包含所有传输初始化信息,因此防火墙和其他中间网络设备(需要此信息)可以省去解析 DESCRIBE 响应的更艰巨的任务,该响应已保留给媒体初始化。

Transport Header 指定客户端可接受的数据传输传输参数;响应将包含服务器选择的传输参数。

Transport

以下是与 Transport 关联的配置参数:

Transport           =    "Transport" ":" SP transport-spec
transport-spec      =    transport-protocol/profile[/lower-transport]
                         *parameter
transport-protocol  =    "RTP"
profile             =    "AVP"
lower-transport     =    "TCP" | "UDP"
parameter           =    ("unicast" | "multicast")
                    |    ";" "destination" ["=" address]
                    |    ";" "interleaved" "=" channel ["-" channel]
                    |    ";" "append"
                    |    ";" "ttl" "=" ttl
                    |    ";" "layers" "=" 1*DIGIT
                    |    ";" "port" "=" port ["-" port]
                    |    ";" "client_port" "=" port ["-" port]
                    |    ";" "server_port" "=" port ["-" port]
                    |    ";" "ssrc" "=" ssrc
                    |    ";" "mode" = <"> 1\#mode <">
ttl                 =    1*3(DIGIT)
port                =    1*5(DIGIT)
ssrc                =    8*8(HEX)
channel             =    1*3(DIGIT)
address             =    host
mode                =    <"> *Method <"> | Method
  • unicast | multicast:

    二选一地指定是进行单播还是多播的传输尝试。 默认值为多播。 单播和多播传输均能处理的客户端必须通过包括两个完整的传输规范以及每个独立的参数来指示这种能力

  • destination: 流将被发送到的地址。 客户端可以使用该参数指定多播地址。为了避免在不知情的情况下被用于拒绝服务攻击,服务器应该对客户端进行身份验证,并应该记录此类尝试,然后再允许客户端将媒体流定向到服务器未选择的地址。 这对通过 UDP 发出的 RTSP 命令尤其重要,但是实现不能依赖 TCP 作为可靠的客户端验证手段。 服务器应该不允许客户端将媒体流定向到与命令来源不同的地址上去

  • mode mode 指示会话支持的方法。有效的值有 PLAY 和 RECORD。如果没有提供,默认值是 PLAY

  • port 该参数为多播会话提供 RTP/RTCP 端口号对,它以范围的方式给出,例如:port=34567-34568

  • client_port 该参数提供客户端选择的接收媒体数据和控制信息的单播 RTP/RTCP 端口号对,它以范围的方式给出,例如:client_port=34567-34568

  • server_port 该参数提供服务端选择的接收媒体数据和控制信息的单播 RTP/RTCP 端口号对,它以范围的方式给出,例如:server_port=45678-45679

  • ssrc 该参数指示媒体服务器应该用的(请求)或将要用的(响应)RTSP SSRC 值,该参数只对单播传输有效,他是和媒体流关联的同步源的标识

例如:

Transport: RTP/AVP;multicast;ttl=127;mode="PLAY", RTP/AVP;unicast;client_port=3456-3457;mode="PLAY"

PLAY

PLAY 方法告诉服务器通过 SETUP 规定的机制开始传输数据。客户端不允许在 SETUP 请求在明确确认成功以前发送 PLAY 请求。

PLAY 请求通过给出相对于正常播放时间的开始时间和结束时间,来给出播放范围。从开始时间开始传输流数据直到到达结束时间。PLAY 可以用管道(队列)形式,服务器必须按顺序执行收到的 PLAY 请求。即:在前一个 PLAY 请求依然活动期间收到 PLAY 请求,要延迟到前一个 PLAY 请求执行完毕后开始生效。

例如:不管下面例子中的两个 PLAY 请求的到达间隔多短,服务器将先从第 10 秒播放至第 15 秒,然后马上播放第 20 秒到第 25 秒,再从第 30 秒播放至结束。

C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0
      CSeq: 835
      Session: 12345678
      Range: npt=10-15
C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0
      CSeq: 836
      Session: 12345678
      Range: npt=20-25
C->S: PLAY rtsp://audio.example.com/audio RTSP/1.0
      CSeq: 837
      Session: 12345678
      Range: npt=30-

TEARDOWN

TEARDOWN 请求会停止所给 URI 的流传输,释放与它相关的资源。如果所给的 URI 是这个表示的表示 URI,任何与此会话相关的会话标识都将不再有效。除非所有传输参数都在会话描述中定义了,否则在再次播放前必须发送 SETUP 请求。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qemu-KVM 网络性能优化实践

背景 在做优化之前&#xff0c;腾讯云上使用的母机单队列&#xff0c;性能只有14w pps。 已有的多队列版本&#xff0c;在20w pps左右&#xff0c;不是很理想。 主要问题性能 1 . 单队列成为性能瓶颈 物理主机环境&#xff0c;使用多队列已经有多年。 而在公有云上&#…

深度学习常见损失函数总结+Pytroch实现

文章目录一、引言二、损失函数1.均方差损失&#xff08;Mean Squared Error Loss&#xff09;2.平均绝对误差损失&#xff08;Mean Absolute Error Loss&#xff09;3.交叉熵&#xff08;Cross Entropy Loss&#xff09;&#xff08;1&#xff09;信息论中的熵a.熵b.相对熵&…

苹果系统(MacOS)无法下载Android SDK或下载缓慢解决办法

SDK管理器一般会在安装完Android Studio 的时候就弹出来.如果当时给关闭了或者是后续想找的话,Command, 或者通过菜单打开偏好设置以后 即可找到Android SDK的设置.与Jetbrains家族的产品方式一致.也可以直接在首屏页面上点More Actions 会出来SDK Manager 然后点击EDIT 找到缺…

DVWA靶场通关实战

DVWABrute Force&#xff08;暴力破解&#xff09;LowMediumHighImpossibleCommand Injection&#xff08;命令行注入&#xff09;LowMediumHighImpossibleCSRF&#xff08;跨站请求伪造&#xff09;LowMediumHighImpossible截至2022.11.24&#xff0c;DVWA共有十四个模块&…

TPS7A3301RGWR稳压器 AK4493EQ音频DAC,电路原理图

TPS7A33系列线性稳压器是负电压(–36V)&#xff0c;超低噪声&#xff08;16μVRMS&#xff0c;72dBPSRR&#xff09;线性稳压器&#xff0c;能够为最高1A负载供电。TPS7A33系列产品装有一个补偿金属氧化物半导体(CMOS)逻辑电平兼容使能引脚(EN)&#xff0c;此引脚允许可由用户定…

【MM小贴士】采购信息记录与工厂的相关性

【业务背景】在SAP的组织架构中&#xff0c;信息记录是一个非常重要的数据。这里面涉及到两个主数据&#xff1a;供应商主数据&物料主数据。 供应商主数据是一个集团性的主数据&#xff0c;无论哪个公司&#xff0c;哪个工厂&#xff0c;都用的同一个供应商代码&#xff0…

数仓开发之DWS层(二)

目录 五&#xff1a;用户域用户注册各窗口汇总表 5.1 主要任务 5.2 思路分析 5.3 图解 5.4 ClickHouse建表语句 六&#xff1a;交易域加购各窗口汇总表 6.1 主要任务 6.2 思路分析 6.3 图解 6.4 ClickHouse建表语句 七&#xff1a;交易域支付各窗口汇总表 7.1 主要任…

AppAnalytics设备的分析服务

AppAnalytics设备的分析服务 EmbarcaderoAppAnalytics是一项针对移动、桌面和可穿戴设备的分析服务。它允许您跟踪和测量应用程序的使用频率、运行的平台、客户使用的功能、查找和记录崩溃等。它通过从最终用户获取匿名使用统计数据&#xff0c;帮助您了解用户行为。AppAnalyti…

应届生如何做好一份简历?

找工作是痛苦的&#xff0c;尤其是投简历的过程。 下面分享下自己最近投简历的一些感悟。 一定要避免的错误 在投简历的过程中一定要避免如下几个主要错误&#xff1a; 一份简历打天下就当前的经济形势&#xff0c;我相信大多数人找工作都是海投&#xff0c;但是在海投的过程中…

靠这一份面试文档,我花了2个通宵看完,最终拿到阿里offer

Java基础部分 请你描述JDK、JRE、JVM的关系&#xff01;如果main方法被声明成private会怎样&#xff1f;&和&&的区别&#xff01;char型变量中能否存储一个中文汉字&#xff0c;why&#xff1f;a、a的区别&#xff01;ab、aab的区别&#xff01;浮点型计算为什么会…

Web(六)CSS3语法-CSS样式规则

第1关&#xff1a;CSS基础知识 第2关&#xff1a;初识CSS 编程要求 请在右侧编辑器中的Begin - End区域内补充代码&#xff0c;具体要求是&#xff1a; 1.按照要求的效果在标签中运用CSS样式&#xff0c;编辑唐诗“静夜思” 2.标题文本“静夜思”采用<h1>标签作用&am…

【前端】HTML认知

一、基础认知 1.1基础概念铺垫&#xff08;了解&#xff09; 1.1.1认识网页&#xff08;了解&#xff09; 问题1&#xff1a;网页由哪些部分组成&#xff1f; 文字、图片、音频、视频、超链接 问题2&#xff1a;我们看到的网页背后本质是什么&#xff1f; 前端程序员写的…

(02)Cartographer源码无死角解析-(29) LocalTrajectoryBuilder2D::AddRangeData()→多雷达数据时间同步

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

uni-app 超详细教程(从菜鸟到大佬)

一&#xff0c;uni-app 介绍 &#xff1a; 官方网页 uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手…

基于51单片机温度火灾烟雾报警器程序仿真资料

资料编号&#xff1a;190 下面是该资料仿真演示视频&#xff1a; 190-基于51单片机温度火灾烟雾报警器(仿真源程序全套资料)功能介绍&#xff1a; 采用51单片机作为主控CPU&#xff0c;采用ds18b20来采集温度&#xff0c;采用MQ2来采集烟雾浓度&#xff0c;使用ADC0832来进行…

(十一)Java算法:计数排序(详细图解)

目录一、前言1.1、概念1.2、算法步骤二、maven依赖三、流程解析3.1、计数流程图3.2、计数数组变形3.3、排序过程四、编码实现一、前言 1.1、概念 计数排序&#xff1a;核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序&#xff0c;计…

[附源码]Python计算机毕业设计Django财务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

DEJA_VU3D - Cesium功能集 之 087-完美状态栏组件

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(尽可能把代码简洁一些)。博文内容…

MacBookPro M2芯片下如何搭建React-Native环境

MacBookPro M2芯片下如何搭建React-Native环境目录软件下载环境配置目录 写在最前&#xff1a;整体流程直接看的rn中文网的搭建开发环境&#xff1a;https://www.react-native.cn/docs/environment-setup 软件下载 1、xcode 2、android studio / vscode 环境配置 1、jdk1.8…

快速上手 TypeScript

快速上手 TypeScript ypeScript 简称 TS &#xff0c;既是一门新语言&#xff0c;也是 JS 的一个超集&#xff0c;它是在 JavaScript 的基础上增加了一套类型系统&#xff0c;它支持所有的 JS 语句&#xff0c;为工程化开发而生&#xff0c;最终在编译的时候去掉类型和特有的语…