从零开始精通RTSP之请求与响应详解2

SETUP请求与响应

        SETUP主要用于准备和初始化媒体流的传输,客户端通过SETUP与服务器协商为特定媒体流建立传输会话的详细参数,包括:传输协议(TCP、UDP、TLS等)、传输模式(单播、组播)、端口号、RTP特性(序列号初始值、时间戳基值等)、以及任何所需的会话特性和选项。

        一个基本的SETUP请求的格式如下。

SETUP rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Transport: <transport-specification>
Other-Header: <value>CRLF

        其中,CSeq表示请求的序列号,前面已经介绍过。Transport是SETUP请求的核心部分,详细说明客户端建议的传输参数,其格式如下。

Transport: <protocol>/<profile>/<lower-layer-protocol>;<parameter-key>=<value>[;...]

        <protocol>通常是RTP,表示使用实时传输协议。<profile>指的是RTP的特定应用或配置,可取的值为:AVP和SAVP。AVP(Audio Video Profile)定义了RTP负载的特定格式和处理规则;SAVP(Secure Audio Video Profile)使用安全的RTP(SRTP)进行传输,提供了加密和认证功能。lower-layer-protocol为可选字段,指定底层传输协议,比如:TCP、UDP、TLS等。如果未指定,通常默认为UDP。

        parameters部分为一系列以分号分隔的键值对,每个键值对表示一个特定的传输参数,常用的参数如下。

        unicast或multicast:指定传输方式为单播还是多播。单播是点对点的传输,每个客户端都从服务器接收独立的数据流;多播则是服务器向多个客户端同时发送相同的数据流。若不指定,默认为unicast。

        client_port=<start_port>-<end_port>:指定客户端用于接收RTP(和可能的RTCP)数据所预留的端口号范围,服务器将在这个范围内选择一个或多个端口来发送数据。比如:client_port=4588-4589,表示客户端期望在本地端口4588接收RTP媒体数据,在本地4589端口接收RTCP控制数据。对于TCP interleaved模式,这个字段可能不存在。

        server_port=<start_port>-<end_port>:服务器用于发送RTP(和可能的RTCP)数据的端口号范围。仅在客户端知道服务器的预期端口时使用,否则由服务器在SETUP响应中指定。

        interleaved=<channel-range>:仅适用于TCP模式,指定在TCP连接中RTP和RTCP数据包的交织顺序。比如:interleaved=0-1表示RTP数据使用奇数通道(0),RTCP数据使用偶数通道(1)。

        ttl=<time-to-live>:仅适用于组播,设置IP数据包的生存时间(TTL),影响组播数据在网络中的传播范围。

        rtcp-mux:可选字段,用于指示RTP和RTCP数据在同一UDP端口上传输,以节省端口资源。

        setup=<connection-type>:仅适用于TCP模式,指定TCP连接的建立方式,取值为:active、passive、actpass。

        当setup参数设定为active时,客户端表明它将主动发起TCP连接到服务器。这意味着客户端会尝试连接到服务器指定的IP地址和端口上,以建立用于后续RTP和RTCP数据传输的TCP连接。这种模式适用于以下两种情况:一种是客户端位于防火墙或NAT设备之后,且该设备允许客户端发起出站连接;另一种是客户端具备足够的网络权限和能力去直接连接到服务器提供的地址和端口。

        当setup参数设定为passive时,客户端请求服务器监听一个TCP端口,等待客户端来建立连接。在这种模式下,客户端不会主动发起连接,而是等待服务器在SETUP响应中提供一个临时的服务器端口供客户端连接。这种模式适用于以下两种情况:一种是服务器位于防火墙或NAT设备之后,且该设备允许外部主机(即客户端)发起入站连接;另一种是由于网络环境或安全策略限制,客户端无法或不适合主动发起到服务器的连接,而服务器具备接受外部连接的条件。

        当setup参数设定为actpass时,客户端表示它既愿意主动发起连接,也愿意被动接受连接。这种模式提供了最大的灵活性,允许客户端和服务器根据各自的网络环境和配置动态决定谁来发起TCP连接。在实践中,服务器通常会在SETUP响应中指示客户端应采取何种行为(active或passive)。

        ssrc=<ssrc_identifier>:一个32位的数字,客户端建议的同步源标识符,用于唯一标识RTP会话中的媒体流。

        下面举几个例子来进行说明。

Transport: RTP/AVP;unicast;client_port=4588-4589

        上面的示例表示客户端希望使用RTP/AVP协议通过单播方式接收媒体流,已在本地预留端口4588用于接收RTP数据,端口4589用于接收RTCP控制信息。

Transport: RTP/AVP/TCP;unicast;interleaved=0-1

        上面的示例表明客户端希望使用TCP作为底层传输协议,通过TCP连接中的交织通道(interleaved)传输RTP(通道0)数据和RTCP(通道1)数据,且传输模式为单播。

        注意:SETUP请求中的Transport字段只是客户端的提议,服务器在响应中可能会接受这些参数、修改部分参数,或者完全拒绝并提供替代方案。客户端需要根据服务器的响应调整其配置,以适应最终确定的传输参数。

        服务器接收到SETUP请求后,根据请求中的传输参数建议和自身配置,决定最终的传输参数,并返回响应确认会话的建立情况。

        一个基本的SETUP响应的格式如下。

RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Transport: <final-transport-specification>
Other-Header: <value>CRLF

        其中,Session表示会话ID。如果这是一个新的会话,服务器会分配一个唯一的会话ID;如果客户端在请求中提供了会话ID,则服务器会确认使用该会话ID。Transport表示服务器确认的最终传输参数。在下面的示例中,我们指定了服务器选择的传输协议、传输模式、目标地址和端口、源地址和端口,以及TCP数据流的交织范围。

RTP/AVP/TCP;unicast;destination=192.0.2.5:6070;source=203.0.113.2:4567;interleaved=0-1

        客户端收到SETUP响应后,解析Transport头部以获取最终确认的传输参数,并使用这些参数来配置RTP/RTCP数据流的接收或发送。

PLAY请求与响应

        PLAY主要用于客户端请求服务器开始或恢复发送指定媒体流的实时数据,并可以指定开始播放的起始时间、结束时间、播放速度等,以便实现精确的媒体流控制。

        一个基本的PLAY请求的格式如下。

PLAY rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Range: <playback-range-specification>
Other-Header: <value>CRLF

        其中,Range为可选字段,用于指定播放的时间范围。如果省略,服务器将从媒体的开始处播放。Range头使用NTP(网络时间协议)格式,可以指定开始时间和结束时间。比如:“Range: npt=30-60”,表示从媒体的30秒处开始播放,播放到60秒处。如果只有开始时间,比如:“Range: npt=30-”,则表示从30秒处开始播放到媒体结束。

        服务器收到PLAY请求后,应开始或恢复向客户端发送指定媒体流的数据,并返回响应确认播放开始情况、提供相关播放信息或报告可能的错误。

        一个基本的PLAY响应的格式如下。

RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Range: <playback-range-specification>
RTP-Info: <rtp-info-specification>
Other-Header: <value>CRLF

        其中,Range是可选字段,表示服务器确认的播放范围,可能与请求中的范围相同或有所调整。RTP-Info也是可选字段,用于提供有关RTP流的信息,比如:URL、初始序列号、时间戳等。这个头部在PLAY响应中不是必需的,但如果提供,它将帮助客户端更好地处理接收到的RTP数据包。RTP-Info的示例如下。

RTP-Info: url=rtsp://example.com/path/to/stream;seq=12345;rtptime=1234567890

PAUSE请求与响应

        PAUSE主要用于客户端请求服务器暂停发送指定媒体流的实时数据。通过PAUSE请求,客户端可以暂时停止接收媒体流,而不终止整个会话,以便在需要时通过PLAY请求恢复播放。

        一个基本的PAUSE请求的格式如下。

PAUSE rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Range: <pause-range-specification>
Other-Header: <value>CRLF

        其中,Range为可选字段,用于指定暂停的具体时间点。

        服务器收到PAUSE请求后,应暂停向客户端发送指定媒体流的数据,并返回响应确认暂停操作的成功执行或报告可能的错误。

        一个基本的PAUSE响应的格式如下。

RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Range: <pause-range-specification>
RTP-Info: <rtp-info-specification>
Other-Header: <value>CRLF

        其中,Range为可选字段,用于指定服务器确认的暂停位置,可能与请求中的时间点相同或有所调整。RTP-Info也为可选字段,提供RTP数据流的当前序列号和时间戳信息,帮助客户端确认暂停的确切位置。

        客户端收到PAUSE响应后,根据响应状态码和提供的信息,确认暂停操作的成功执行,并做好相应处理(比如:更新用户界面显示暂停状态、记录暂停位置等)。

TEARDOWN请求与响应

        TEARDOWN主要用于客户端请求服务器停止发送指定媒体流的数据,并释放与该会话相关的所有资源。通过TEARDOWN请求,客户端可以彻底结束一个RTSP会话,释放服务器和客户端之间的连接、取消媒体流传输,并清理与会话相关的状态。

        一个基本的TEARDOWN请求的格式如下。

TEARDOWN rtsp://example.com/path/to/stream RTSP/1.0
CSeq: <sequence-number>
Session: <session-id>
Other-Header: <value>CRLF

        服务器收到TEARDOWN请求后,应停止向客户端发送指定媒体流的数据,释放与会话相关的所有资源,并返回响应确认会话结束或报告可能的错误。

        一个基本的TEARDOWN响应的格式如下。

RTSP/1.0 200 OK
CSeq: <sequence-number>
Session: <session-id>
Other-Header: <value>CRLF

        其中,Session表示会话ID,与TEARDOWN请求中的Session值相对应,确认这是在同一个会话中的响应。但注意:并非所有服务器都会在TEARDOWN响应中包含Session字段。

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

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

相关文章

【CAN】采样点介绍及测试方法

文章目录 1 什么是采样点2 为什么需要采样点3 采样点的计算公式4 VH6501测试原理和方法4.1 VH6501测试采样点原理4.2 VH6501测试方法 >>返回总目录<< 1 什么是采样点 采样点是节点判断信号逻辑电平的位置&#xff0c;是CAN控制器读取总线电平&#xff0c;并解释各…

【Git教程】(十二)工作流之项目设置 — 何时使用工作流,工作流的结构,项目设置概述、执行过程及其实现 ~

Git教程 工作流之项目设置 1️⃣ 何时使用工作流2️⃣ 工作流的结构3️⃣ 概述4️⃣ 使用要求5️⃣ 执行过程及其实现5.1 基于项目目录创建一个新的版本库5.2 以文件访问的方式共享版本库5.3 用 Git daemon 来共享版本库5.4 用 HTTP 协议来共享版本库5.5 用 SSH 协议来共享版…

C++ 递归与面向对象编程基础

C 递归 递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法&#xff0c;从而更容易解决问题。 递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。 递归示例 将两个数字相加很容易做到&#xff0c;但将一系列数字相加就更…

MySQL二阶段和三阶段提交

在分布式系统中&#xff0c;事务管理是一个至关重要的方面。MySQL作为一种常用的关系型数据库管理系统&#xff0c;提供了二阶段提交&#xff08;Two-Phase Commit&#xff0c;2PC&#xff09;和三阶段提交&#xff08;Three-Phase Commit&#xff0c;3PC&#xff09;等协议来支…

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源&#xff1a;海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景&#xff1a; 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

基于Python的景区票务人脸识别系统(V2.0)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

数据结构速成--数据结构和算法

由于是速成专题&#xff0c;因此内容不会十分全面&#xff0c;只会涵盖考试重点&#xff0c;各学校课程要求不同 &#xff0c;大家可以按照考纲复习&#xff0c;不全面的内容&#xff0c;可以看一下小编主页数据结构初阶的内容&#xff0c;找到对应专题详细学习一下。 目录 一…

【Linux】磁盘阵列RAID技术

目录 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 1.2 为什么要使用RAID技术&#xff1f; 二、RAID级别 2.1 常见的RAID级别 2.2 常见RAID介绍 三、RAID特性对比 一、RAID介绍 1.1 什么是RAID技术&#xff1f; 把多块独立的物理磁盘按不同的方式组合起来形成一个硬盘…

Java 判空工具方法大全

引入包 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> </dependency>判断对象属性不为空 if (StringUtils.isNotBlank(params.getName())) {objectQ…

【ENSP】华为三层交换机配置AAA认证,开启telnet服务

配置步骤 1.给交换机配置ip地址&#xff0c;以便登陆 2.配置AAA&#xff0c;用户名&#xff0c;密码&#xff0c;服务类型&#xff0c;用户权限 3.配置接入设备的数量 4.开启telnet服务 LSW2交换机配置 u t m #关闭提示 sys …

基于单链表实现通讯管理系统!(有完整源码!)

​ 个人主页&#xff1a;秋风起&#xff0c;再归来~ 文章专栏&#xff1a;C语言实战项目 个人格言&#xff1a;悟已往之不谏&#xff0c;知来者犹可追 克心守己&#xff0c;律己则安&#xff01; 1、前言 友友们&#xff0c;这篇文章是基于单链…

Docker in Docker简介

一&#xff0c;Docker in Docker&#xff08;简称DinD&#xff09;是一种容器化技术&#xff0c;它指的是在一个Docker容器内部运行另一个Docker实例。这种技术可以在容器化的环境中进一步封装和复用Docker操作&#xff0c;为开发、测试和部署等环节提供便利。 具体来说&#…

使用Python模仿文件行为

在Python中&#xff0c;你可以通过文件操作函数&#xff08;如open()函数&#xff09;以及模拟输入输出流的库&#xff08;如io模块&#xff09;来模拟文件行为。下面是一些示例&#xff0c;展示了如何使用这些工具在Python中模拟文件行为。 1、问题背景 在编写一个脚本时&…

ChatGPT助你驰骋学术领域:写出满分论文

ChatGPT无限次数:点击直达 ChatGPT助你驰骋学术领域&#xff1a;写出满分论文 学术论文写作一直是许多学生和研究人员头疼的问题&#xff0c;如何提高写作效率、提升论文质量成为许多人追寻的目标。而今&#xff0c;随着人工智能技术的发展&#xff0c;ChatGPT作为一款优秀的文…

Springboot框架——4.整合jdbc

1.pom.xml中导入依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupI…

SpringMVC(三)【REST 风格】

1、REST 风格 1.1、REST 简介 REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表现形式状态转换 在开发中&#xff0c;它其实指的就是访问网络资源的格式 1.1.1、传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user…

飞书API(4):筛选数据的三种思路

截止到上一篇&#xff0c;终于通过飞书 API 完整获取到飞书多维表的数据。但是&#xff0c;有些场景&#xff0c;比如数据源会出现脏数据&#xff0c;毕竟如果是运营过程多人协作维护的数据&#xff0c;要想保持数据完美简直是天方夜谭&#xff01;再比如我们不需要完整的数据&…

【JavaWeb】Day46.Mybatis——入门

JDBC介绍 通过Mybatis可以很方便的进行数据库的访问操作。其实java语言操作数据库&#xff0c;只能通过一种方式&#xff1a;使用sun公司提供的 JDBC 规范。Mybatis框架&#xff0c;就是对原始的JDBC程序的封装。 JDBC&#xff1a; ( Java DataBase Connectivity )&#xff0c…

开源了!自从用了这个远程控制工具,从此把 TeamViewer 扔一边了【文末领项目源码】

在工作中&#xff0c;咱们经常要使用向日葵、TeamViewer 等远程控制工具&#xff0c;来远程操控项目上的主机去解决一些部署在现场的系统问题&#xff0c;亦或是在家偶尔加班时用家里的电脑远程公司的电脑处理工作。但不爽的是&#xff0c;TeamViewer 用一用试用期就过了&#…

ES 大数据量按照日期分索引存储和查询

前言 ES 通常被用来存放各种日志数据或其他大批量数据&#xff0c;然后做统计。 对于请求量大的系统来说&#xff0c;日志或其他业务数据无比庞大&#xff0c;需要按日期来划分索引&#xff0c;便于做冷热数据的迁移管理。大批量的业务数据也要根据日期来区分&#xff0c;提高…