RTSP,RTP,RTCP协议

news2024/11/17 15:53:00

一 RTSP

1 简介
实时流传输协议,是一个应用层协议(TCP/IP网络体系中),它是一个多媒体播放控制协议,主要用来使用户在播放流媒体时可以像操作本地的影碟机一样进行控制,即可以对流媒体进行暂停/继续、后退和前进等控制。RTSP体系结位于RTP和RTCP之上,使用TCP或UDP完成数据传输。

2 功能
RTSP用于 发起/设置/终结 流媒体。
RTSP消息分为两大类,一类是请求消息(request),一类是回应消息(ressponse)
常见信令:

1 OPTIONS 功能:请求服务端支持的 RTSP 命令列表,即取服务器支持的方法

2 DESCRIBE功能:向服务器获取URL指定的媒体对象的描述,其中Accept字段指定了描述格式

3 SETUP 功能: 客户端向服务器请求建立会话并准备传输。请求信息主要包括传输协议和客户端的端口号

4 PLAY: 功能:请求流,客户端主动通知服务器以SETUP指定的机制开始发送数据

5 PAUSE 功能:客户端请求服务器的媒体流传输临时暂停

如下RTSP交互过程 (VLC : RTP RTSP OVER TCP) :

取服务器支持的方法
C ---->
[INFO  rtsp_demo.c:409:rtsp_new_client_connection] new rtsp client 192.168.8.100:6006 comming
[DEBUG rtsp_msg.c:865:rtsp_msg_parse_from_array] 
OPTIONS rtsp://192.168.8.1:554/live/chn1/mainstream RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.17.4 (LIVE555 Streaming Media v2016.11.28)

回复支持的方法
		<------S
		[DEBUG rtsp_demo.c:712:rtsp_handle_OPTIONS] 
		[DEBUG rtsp_msg.c:998:rtsp_msg_build_to_array] 
		RTSP/1.0 200 OK
		CSeq: 2
		Date: Fri Nov  4 09:52:36 2022
		Public: OPTIONS, DESCRIBE, SETUP, PLAY, PAUSE, TEARDOWN
		Server: rtsp_demo


获取URL指定的媒体对象的描述
C ---->
[DEBUG rtsp_msg.c:865:rtsp_msg_parse_from_array] 
DESCRIBE rtsp://192.168.8.1:554/live/chn1/mainstream RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.17.4 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp //描述格式


回复 URL指定的媒体对象的描述
		<------S
		[DEBUG rtsp_demo.c:733:rtsp_handle_DESCRIBE] 
		[DEBUG rtsp_msg.c:998:rtsp_msg_build_to_array] 
		RTSP/1.0 200 OK
		CSeq: 3
		Date: Fri Nov  4 09:52:36 2022
		Server: rtsp_demo
		Content-Type: application/sdp  //sdp格式
		Content-Length: 390

		v=0
		o=- 0 0 IN IP4 0.0.0.0
		s=rtsp_demo
		t=0 0
		a=control:rtsp://192.168.8.1:554/live/chn1/mainstream
		a=range:npt=0-
		/*
		格式为 m=<媒体类型> <端口号> <传输协议> <媒体格式 >
		媒体类型:video
		端口号:传输端口开没有确定(0表示不确定)
		传输协议:RTP/AVP,表示RTP OVER UDP,如果是RTP/AVP/TCP,表示RTP OVER TCP
		媒体格式:一般使用96表示 H.264
		*/
		m=video 0 RTP/AVP 96
		c=IN IP4 0.0.0.0
		a=rtpmap:96 H265/90000
		a=fmtp:96 sprop-vps=QAEMAf//AWAAAAMAgAAAAwAAAwB4vAk=;sprop-sps=QgEBAWAAAAMAgAAAAwAAAwB4oAKAgC0WNvkkyuAQAAADABAAAAMBQIA=;sprop-pps=RAHA8vATZA==
		a=control:rtsp://192.168.8.1:554/live/chn1/mainstream/track1


向服务器请求建立会话并准备传输。请求信息主要包括传输协议
C----->		
[DEBUG rtsp_msg.c:865:rtsp_msg_parse_from_array] 
SETUP rtsp://192.168.8.1:554/live/chn1/mainstream/track1 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.17.4 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP/TCP;unicast;interleaved=0-1 // 请求使用TCP传输

回复客户端建立会话请求
		<------S	
		[DEBUG rtsp_demo.c:937:rtsp_handle_SETUP] 
		[INFO  rtsp_demo.c:881:rtsp_new_rtp_connection] new rtp over tcp for video ssrc:22345678 peer_addr:192.168.8.100 interleaved:0-1
		[DEBUG rtsp_msg.c:998:rtsp_msg_build_to_array] 
		RTSP/1.0 200 OK
		CSeq: 4
		Date: Fri Nov  4 09:52:36 2022
		Session: 12345678
		Transport: RTP/AVP/TCP;ssrc=22345678;interleaved=0-1
		Server: rtsp_demo


通知服务器以SETUP指定的机制开始发送数据
C------>		
[DEBUG rtsp_msg.c:865:rtsp_msg_parse_from_array] 
PLAY rtsp://192.168.8.1:554/live/chn1/mainstream RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.17.4 (LIVE555 Streaming Media v2016.11.28)
Session: 12345678
Range: npt=0.000-


回复play请求 并开始发数据
		<-------S
		[DEBUG rtsp_demo.c:1024:rtsp_handle_PLAY] 
		[DEBUG rtsp_msg.c:998:rtsp_msg_build_to_array] 
		RTSP/1.0 200 OK
		CSeq: 5
		Date: Fri Nov  4 09:52:36 2022
		Session: 12345678
		Server: rtsp_demo

二 RTP 与 RTCP

随着多媒体网络应用的发展,针对网络多媒体的通用、实时交互式应用的传输协议——实时传输协议(Real-Transport Protocol,RTP)与实时传输控制协议(Real-Transport Control Protocol,RTCP)应运而生。

RTP定义了两种报文:RTP报文用于传送媒体数据(如音频和视频),它由 RTP报头和数据两部分组成,RTP报头占用最少12个字节,最多72个字节,包含包含序列号和时间戳,目的是提供时间信息和实现流同步。RTP数据部分称为有效载荷,用来封装实际的数据负载,如封装h264编码的视频数据。

序列号:随每个RTP数据包而增加1,由接收者用来探测包损失。系列号初值是随机的,使对加密的文本攻击更加困难

时间戳:时标反映RTP数据包中第一个八进制数的采样时刻

在这里插入图片描述

由上图可知,如果只有系列号,并不能完整按照顺序的将data播放出来,因为如果data中间有一段是没有资料的,只有系列号的话会造成错误,需搭配上让它知道在哪个时间将data正确播放出来,如此我们才能播放出正确无误的信息。

RTCP报文负责管理传输质量,以实现协议控制功能。当应用程序开始一个rtp会话时将使用两个端口:一个给rtp,一个给rtcp。rtp本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠rtcp提供这些服务。在rtp的会话之间周期的发放一些rtcp包以用来传监听服务质量和交换会话用户信息等功能。rtcp包中含有已发送的数据包的数量、丢失的数据包的数量等统计资料。因此,服务器可以利用这些信息动态地改变传输速率,甚至改变有效载荷类型。rtp和rtcp配合使用,它们能以有效的反馈和最小的开销使传输效率最佳化,因而特别适合传送网上的实时数据。根据用户间的数据传输反馈信息,可以制定流量控制的策略,而会话用户信息的交互,可以制定会话控制的策略。

当应用程序建立一个RTP会话时,应用程序将确定一对目的传输地址。目的传输地址由一个网络地址和一对端口组成,有两个相邻端口:一个给RTP包,一个给RTCP包,使得RTP/RTCP数据能够正确发送。RTP数据发向偶数的UDP端口,而对应的控制信号RTCP数据发向相邻的奇数UDP端口(偶数的UDP端口+1),这样就构成一个UDP端口对。

RTP的发送时,RTP协议从上层接收流媒体信息码流(如H.265),封装成RTP数据包;RTCP从上层接收控制信息,封装成RTCP控制包。RTP将RTP 数据包发往UDP端口对中偶数端口;RTCP将RTCP控制包发往UDP端口对中的接收端口。

三 三者关系

总而言之,RTSP发起/设置/终结流媒体、RTP传输流媒体数据 、RTCP对RTP进行控制,同步。

四 应用

双方会在 RTSP协商中确定 通讯协议等信息,准确一点 客户端会在 SETUP 请求中向服务端确认 通讯协议和端口号。

如果是TCP 传输,那么RTSP , RTCP, RTP 则共用同一个 TCP Socket。传输数据的时候 以特殊包头区分不同类型的数据包。

RTP和RTCP数据会以 "$"符号 + 一个字节的通道编号 + 2个字节的数据长度,共四个字节的前缀开始,RTSP数据没有四个字节的前缀;RTP和RTCP数据的区别在于第二个字节的通道编号

如 RTP和RTCP数据头

[0]= '$' 
[1]= mark //RTP通道编号是偶数,RTCP通道编号是奇数
[2][3] = size

如果是UDP传输 则需要另外创建 RTP udp Socket 与 RTCP udp Socket,并且 RTP和RTCP分别使用两个相邻的UDP端口,RTP报文使用低端口,并且是偶数的UDP端口,RTCP报文使用高端口,并且是奇数的UDP端口(偶数的UDP端口+1)。

在这里插入图片描述

五 常见的疑问

1.怎样重组乱序的数据包
可以根据RTP包的序列号来排序。

2.怎样获得数据包的时序
可以根据RTP包的时间戳来获得数据包的时序。

3.声音和图像怎么同步
根据声音流和图像流的相对时间(即RTP包的时间戳),以及它们的绝对时间(即对应的RTCP包中的RTCP),可以实现声音和图像的同步。

4.接收缓冲和播放缓冲的作用
接收缓冲用来排序乱序了的数据包;播放缓冲用来消除播放的抖动,实现等时播放。

5.为什么RTP可以解决时延问题
  RTP协议是一种基于UDP的传输协议,RTP本身并不能为按顺序传送数据包提供可靠的传送机制,也不提供流量控制或拥塞控制,它依靠RTCP提供这些服务。这样,对于那些丢失的数据包,不存在由于超时检测而带来的延时,同时,对于那些丢弃的包,也可以由上层根据其重要性来选择性的重传。比如,对于I帧、P帧、B帧数据,由于其重要性依次降低,故在网络状况不好的情况下,可以考虑在B帧丢失甚至P帧丢失的情况下不进行重传,这样,在客户端方面,虽然可能会有短暂的不清晰画面,但却保证了实时性的体验和要求。

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

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

相关文章

SAP FICO 关于资产的详细解析

SAP资产模块概述 一、概述 资产&#xff08;AA&#xff09;模块是资产会计模块的简称&#xff0c;是财务会计&#xff08;FI&#xff09;模块的一个子模块&#xff0c;主要处理与各类长期资产相关业务的模块。不单指固定资产&#xff0c;也不泛指资产负债表中的资产&#xff0c…

Week4

1.试题 历届真题 时间显示【第十二届】【省赛】【B组】 思路 不难发现,应该从小时往秒处理,这样可以用O(1)的时间复杂度求出,不过有比较麻烦的进位处理。 先看里面可以拼成几个小时,然后得到的小时%24,然后把总时间减去小时的时间,再看有多少分钟,分钟%60,都是此时判断分…

vue多环境配置之 .env配置文件

Vue之.env环境配置文件 .env文件是运行项目时的环境配置文件。但是在实际开发过程中&#xff0c;有本地环境、测试环境、预生产、生产环境等等&#xff0c;不同环境对应的配置会不一样。因此&#xff0c;需要通过不同的.env文件实现差异化配置。 * 文章目录Vue之.env环境配置文…

【JAVA核心知识】46:什么是零拷贝Zero-copy

零拷贝相较于传统的IO流程拥有更高的数据发送效率&#xff0c;无论是RocketMq,Kafka还是Netty等都用到了零拷贝技术&#xff0c;那究竟什么是零拷贝呢&#xff0c;零拷贝又是通过什么方式提升数据发送效率呢&#xff1f; 首先我们要明白&#xff0c;一次数据发送过程就是将磁盘…

Java基础--方法

前言&#xff1a;介绍 Java 中方法的基本语法、分类、执行并分析参数传值。 关键字&#xff1a;方法、形参、实参、返回值、实例方法、静态方法、参数传值 程序引例–为什么要「方法」 public class IntroduceOfMethod {// 入口主方法。public static void main(String[] args…

docker 高级篇

一、DockerFile 1.1、概述 dockerfile 是用来构建docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 为什么要有dockerfile呢 在基础篇我们讲过&#xff0c;比如我们下载个 ubuntu镜像里面不包含 vim、ifconfig等组件&#xff0c;这个时候 新增…

DES加密算法

DES算法原理 对称密码算法中的分组加密算法&#xff08;对应于流密码&#xff09; 密钥64位&#xff0c;56位参与运算8位校验位&#xff08;校验位为&#xff1a;8、16、24、32、40、48、56、64&#xff09; 加密原理 1. IP置换 将明文数据转化为二进制数&#xff0c;并将它…

Lnix文件权限的修改

首先我们要清楚Linux文件的权限信息 在Linux中输入ls -l 或者 ll查看文件和目录的详细信息 文件详情实例中&#xff0c;a目录的第一个属性用“d”标识这个a是一个目录。 anaconda-ks.cfg第一个属性用“-”标识他是一个文件。 在Linux文件详情的后面属性需要分为三组查看 rwx&am…

三种调用机制: 同步调用、异步调用、回调(同步/异步)

c并发编程-01-并发与并行_发如雪-ty的博客-CSDN博客 c并发编程02-什么是I/O_发如雪-ty的博客-CSDN博客 c并发编程03-I/O多路复用_发如雪-ty的博客-CSDN博客 c并发编程04-同步与异步_发如雪-ty的博客-CSDN博客_c同步和异步 c并发编程05-什么是回调函数_发如雪-ty的博客-CSDN…

Web前端:使用ReactJS构建的应用类型

使用ReactJS&#xff0c;你可以构建各种各样的应用程序&#xff0c;包括单页应用程序、渐进式web应用程序、移动应用程序、仪表板、电子商务平台、企业web应用程序以及社交媒体和消息应用程序。1.单页应用程序(spa)单页应用程序(SPA)基本上是一个网页&#xff0c;它通过使用从w…

MySQL(七):undo日志——保证事务的原子性

目录一、前言1.1 如何回滚事务1.2 事务id1.3 roll pointer 隐藏列1.4 trx_id 隐藏列二、undo日志2.1 undo日志的格式2.2 insert 对应的undo日志2.3 delete 操作对应的undo日志2.4 update操作对应的undo日志2.5 Undo页面链表2.6 undo日志写入过程2.6.1 Undo Log Header2.7 回滚段…

springboot请求参数绑定原理篇

上篇文章写了SpringBoot 参数接收只看这一篇文章就够了&#xff0c;只是写了使用方法&#xff0c;没有写为什么&#xff0c;原理是什么&#xff0c;这篇文章也是之前的预先的计划&#xff0c;稍微花点时间整理下&#xff0c;知其然知其所以然&#xff0c;才算是能彻底掌握&…

如何用IDEA创建SpringBoot项目

一、创建一个 Spring Initializr 工程 next后选择2.7.8版本&#xff0c;勾选以下几个 Web里的spring bootTemplate Engines 里的 ThymeleafSQL里的MyBatis Framework 和 Mysql Driver 然后finish完成 二、配置resources文件 2.1、 application.properties&#xff1a; #??…

Docker容器命令无权限,WEB访问403

问题背景(描述) 部署dockerWeb后&#xff0c;重启访问403,详细如下 docker容器正常运行,且开机自启 #通过如下命令开机自启 docker update --restart always 容器id但是访问web服务出现403. 进入容器后,输入命令提示如下: 解决方案 关闭selinux SELinux(Security-Enhanced…

【网络安全】记一次红队渗透实战项目

前言 【一一帮助安全学习&#xff08;网络安全面试题学习路线视频教程工具&#xff09;一一】 一、信息收集 信息收集非常重要&#xff0c;有了信息才能知道下一步该如何进行&#xff0c;接下来将用nmap来演示信息收集 1、nmap扫描存活IP 由于本项目环境是nat模式需要项目…

【Java基础】——面向对象:封装

【Java基础】——面向对象:封装一、类和对象二、类的结构&#xff1a;属性、方法、构造器1、属性2、方法2.1、方法的定义2.2、方法的重载2.3、可变个数的形参2.4、方法参数的值传递机制3、构造器3.1、构造器的特征3.2、构造器的作用&#xff1a;3.3、构造器重载三、封装与隐藏1…

细菌,真菌,病毒——感染,免疫反应以及治疗用药差异

谷禾健康 与人类密切相关的微生物 我们的世界大到浩瀚宇宙&#xff0c;小到微观下的生物分子。我们总说漫天繁星&#xff0c;其实身边微生物数量可能更多。动物、植物、真菌、细菌、病毒等&#xff0c;共同构成了丰富多彩的生命世界。 细菌、真菌、病毒是其中的三个大类&#x…

spring integration使用:消息路由

系列文章目录 …TODO spring integration开篇&#xff1a;说明 …TODO spring integration使用&#xff1a;消息路由 spring integration使用&#xff1a;消息路由系列文章目录前言消息路由的概念二、路由的分类基于内容的路由器spring integration中的实现RecipientListRoute…

Python property()函数:定义属性

我们一直在用“类对象.属性”的方式访问类中定义的属性&#xff0c;其实这种做法是欠妥的&#xff0c;因为它破坏了类的封装原则。正常情况下&#xff0c;类包含的属性应该是隐藏的&#xff0c;只允许通过类提供的方法来间接实现对类属性的访问和操作。因此&#xff0c;在不破坏…

AOP的四种增强方式

1. 前置增强&#xff0c;在核心功能之前执行的额外功能 public class MyBeforeAdvice implements MethodBeforeAdvice{Overridepublic void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {System.out.print("this is my before advice!");Str…