ORTP

article/2025/11/1 3:09:04

1.为什么要使用RTP

一提到流媒体传输、一谈到什么视频监控、视频会议、语音电话(VOIP),都离不开RTP协议的应用,但当大家都根据经验或者别人的应用而选择RTP协议的时候,你可曾想过,为什么我们要使用RTP来进行流媒体的传输呢?为什么我们一定要用RTP?难道TCP、UDP或者其他的网络协议不能达到我们的要求么?

像TCP这样的可靠传输协议,通过超时重传机制来保证传输数据流中的每一个bit的正确性,但这样会使得无论从协议的实现还是传输的过程都变得非常的复杂。而且,当传输过程中有数据丢失的时候,由于对数据丢失的检测(超时检测)和重传,会数据流的传输被迫暂停和延时。

或许你会说,我们可以利用客户端构造一个足够大的缓冲区来保证显示的正常,这种方法对于从网络播放音视频来说是可以接受的,但是对于一些需要实时交互的场合(如视频聊天、视频会议等),如果这种缓冲超过了200ms,将会产生难以接受的实时性体验。

2. 为什么RTP可以解决上述时延问题

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

3.多播功能 

多播在网络视频会议方面有着很广泛的应用,它主要应用于这样一种环境,即:

假设红色的圆为存放有视频数据的流媒体服务器,其他的圆为连接到该服务器的各个客户端,当所有的绿色的客户端要求同时观看红色服务器上的某一个视频时,如果服务器为每一路客户端单独建立连接进行数据的传输,这样明显不太合理浪费带宽,因此,多播技术可以很好地解决这种问题,即同一份数据,由服务器发送到公共的多播地址,各个客户端均监听同一个多播地址来获取数据,这样,既节省了带宽,同时也保证了各个客户端所观看的视频的同步。

这样的多播应用TCP协议是不支持的,而RTP协议在最初就是为了实现类似的视频会议的应用而诞生的,对其有非常好的支持。

4. 视频网络传输的2种方式

  • 基于下载:http or ftp
  • 基于实时:RTP/RTSP/RTCP

5.ORTP的介绍

  • openRTP,用C实现的一个RTP库(其实还有C++实现的,JAVA等实现的)

  • 实质是一个视频服务器,工作时客户端和服务器实时传递视频数据

  • 一般认为RTP工作在传输层,但是其实RTP比TCP/UDP高一个层次

6.RTP是什么? 

1.RTP是什么

RTP全名是Real-time Transport Protocol(实时传输协议)。它是IETF提出的一个标准,对应的RFC文档为RFC3550(RFC1889为其过期版本)。RFC3550不仅定义了RTP,而且定义了配套的相关协议RTCP(Real-time Transport Control Protocol,即实时传输控制协议)。RTP用来为IP网上的语音、图像、传真等多种需要实时传输的多媒体数据提供端到端的实时传输服务。RTP为Internet上端到端的实时传输提供时间信息和流同步,但并不保证服务质量,服务质量由RTCP来提供。

2.流媒体

流媒体是指Internet上使用流式传输技术的连续时基媒体。当前在Internet上传输音频和视频等信息主要有两种方式:下载流式传输两种方式。

下载情况下,用户需要先下载整个媒体文件到本地,然后才能播放媒体文件。在视频直播等应用场合,由于生成整个媒体文件要等直播结束,也就是用户至少要在直播结束后才能看到直播节目,所以用下载方式不能实现直播。

流式传输是实现流媒体的关键技术。使用流式传输可以边下载边观看流媒体节目。由于Internet是基于分组传输的,所以接收端收到的数据包往往有延迟和乱序(流式传输构建在UDP上)。要实现流式传输,就是要从降低延迟恢复数据包时序入手。在发送端,为降低延迟,往往对传输数据进行预处理(降低质量和高效压缩)。在接收端为了恢复时序,采用了接收缓冲;而为了实现媒体的流畅播放,则采用了播放缓冲。

使用接收缓冲,可以将接收到的数据包缓存起来,然后根据数据包的封装信息(如包序号和时戳等),将乱序的包重新排序,最后将重新排序了的数据包放入播放缓冲播放。

为什么需要播放缓冲呢?容易想到,由于网络不可能很理想,并且对数据包排序需要处理时耗,我们得到排序好的数据包的时间间隔是不等的。如果不用播放缓冲,那么播放节目会很卡,这叫时延抖动。相反,使用播放缓冲,在开始播放时,花费几十秒钟先将播放缓冲填满(例如PPLIVE),可以有效地消除时延抖动,从而在不太损失实时性的前提下实现流媒体的顺畅播放。

3.RTP详解

传输层的子层
RTP(实时传输协议),顾名思义它是用来提供实时传输的,因而可以看成是传输层的一个子层。给出了流媒体应用中的一个典型的协议体系结构。

 从图中可以看出,RTP被划分在传输层,它建立在UDP上。同UDP协议一样,为了实现其实时传输功能,RTP也有固定的封装形式。RTP用来为端到端的实时传输提供时间信息和流同步,但并不保证服务质量。服务质量由RTCP来提供。

应用层的一部分
不少人也把RTP归为应用层的一部分,这是从应用开发者的角度来说的。操作系统中的TCP/IP等协议栈所提供的是我们最常用的服务,而RTP的实现还是要靠开发者自己。因此从开发的角度来说,RTP的实现和应用层协议的实现没不同,所以可将RTP看成应用层协议。

RTP实现者在发送RTP数据时,需先将数据封装成RTP包,而在接收到RTP数据包,需要将数据从RTP包中提取出来。

4.RTP的封装

一个协议的封装是为了满足协议的功能需求的。从前面提出的功能需求,可以推测出RTP封装中应该有同步源和时戳等字段,但更为完整的封装是什么样子呢?

版本号(V):2比特,用来标志使用的RTP版本。

填充位(P):1比特,如果该位置位,则该RTP包的尾部就包含附加的填充字节。

扩展位(X):1比特,如果该位置位的话,RTP固定头部后面就跟有一个扩展头部。

CSRC计数器(CC):4比特,含有固定头部后面跟着的CSRC的数目。

标记位(M):1比特,该位的解释由配置文档(Profile)来承担.

载荷类型(PT):7比特,标识了RTP载荷的类型。

序列号(SN):16比特,发送方在每发送完一个RTP包后就将该域的值增加1,接收方可以由该域检测包的丢失及恢复包序列。序列号的初始值是随机的。

时间戳:32比特,记录了该包中数据的第一个字节的采样时刻。在一次会话开始时,时间戳初始化成一个初始值。即使在没有信号发送时,时间戳的数值也要随时间而不断地增加(时间在流逝嘛)。时间戳是去除抖动和实现同步不可缺少的。

同步源标识符(SSRC):32比特,同步源就是指RTP包流的来源。在同一个RTP会话中不能有两个相同的SSRC值。

贡献源列表(CSRC List):0~15项,每项32比特,用来标志对一个RTP混合器产生的新包有贡献的所有RTP包的源。由混合器将这些有贡献的SSRC标识符插入表中。SSRC标识符都被列出来,以便接收端能正确指出交谈双方的身份。
 

7.常见疑问

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

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

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

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


http://chatgpt.dhexx.cn/article/oCXZtAIl.shtml

相关文章

oracle中or的使用,Oracle Or

oracle函数 的 Oracle Or 在本教程中,我们来学习如何使用Oracle OR运算符来组合两个或更多的布尔表达式。 Oracle OR运算符介绍 OR运算符是一个逻辑运算符,它组合了布尔表达式,如果其中一个表达式为真(true),则返回true。 以下说明OR运算符的语法: expression_1 AND expre…

基于PCA方法的ORL人脸识别及Python代码实现

基于PCA方法的ORL人脸识别及Python代码实现 PCA算法方案设计代码实现结果分析参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找到构建的协方差的特征值与特征向量,在新的投影方向&#…

ORL Character Recgnition

文章目录 ORL Character Recgnition0 Abstract1 Introduction2 Related Work2.1 Character recognition2.2 Text detection 3 Connection Text Proposal Network3.1 Anchor3.2 Bi-Directional LSTM3.3 RPN layer3.4 Text line constructor3.5 Loss function3.6 Total system3.7…

ORL Faces Database介绍

ORL人脸数据集共包含40个不同人的400张图像,是在1992年4月至1994年4月期间由英国剑桥的Olivetti研究实验室创建。 此数据集下包含40个目录,每个目录下有10张图像,每个目录表示一个不同的人。所有的图像是以PGM格式存储,灰度图&…

基于ORL人脸数据库和PCA特征降维算法的人脸识别matlab仿真

目录 1.算法仿真效果 2.MATLAB核心程序 3.算法涉及理论知识概要 4.完整MATLAB 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB核心程序 ...................................................................... for i1:40sub_dir strcat(s, num2str(i))…

【图像处理matlab】PCA+KNN人脸识别 ORL人脸数据集

文章目录 0.写在前面1. 数据集导入与划分2. train-PCA构建脸空间2.1 原始数据导入2.2 去中心化2.3 求解协方差矩阵、特征值、特征向量2.4 特征脸选取--脸空间 3. test-物以类聚 KNN分类3.1 KNN简介3.2 KNN实现步骤3.2.1 距离度量---欧式距离、豪斯多夫距离.......3.2.2 k值选择…

Orcal 数据库

目录 一、数据库 1. 数据库概念 2. SQL 语言 3. Oracle结构 4. 表(Table) 5. 三范式 6. SELECT 语句 二、Orcal 基本操作 1. 查询列(字段) 2. 查询行(记录) 2.1 比较条件 2.2 且或非 2.3 null…

【人脸识别】基于PCA实现ORL人脸识别附matlab代码和报告

1 简介 人脸识别技术先进,应用广泛。借助PCA算法,利用MATLAB GUI可以简单操作,通过对待识别图像的预处理即可提高识别率。本文首先对相关概念进行了阐述,对工作原理进行了介绍,具体对基于PCA算法人脸识别的MATLAB实现进行了解析。 2 部分代码 function [neednum,average_face…

orical

truncate 和delete table 表名(前面效率比后面高,而且前面执行后无法停止,前面会将orical查找数据时使用的节点删除,后面不会) select * from 表名 会消耗大量资源不建议使用了; creat table 表名 as selec…

基于BP神经网络和ORL库的人脸识别matlab仿真

目录 一、理论基础 二、案例背景 1.问题描述 2.思路流程 三、部分MATLAB代码 四、仿真结论分析 五、参考文献 一、理论基础 这里,人脸的识别主要依据如下的流程进行: 具体的算法流程是这么一个过程: 第一:首先初始化一个区…

图像处理ORL--训练集及测试集建立--Matlab实现

在深度学习的研究与学习过程中,往往对神经网络的网络结构以及代码有比较好的理解,但基于matlab的数据集建立等操作经常困扰初学者。 今天带来matlab数据集建立的文件结构与代码。 文件格式 首先将图片保存在当前运行文件的文件夹中,将其命名…

深度学习入门_对ORL数据集进行特征提取降维后SVM分类

ORL人脸数据集共包含40个不同人的400张图像。所有图像都是以PGM格式存储的灰度图。每一个目录下的图像是在不同的时间、不同的光照、不同的面部表情条件下采集的。在该数据集中,每个人有10张照片。这10张照片中,前8张作为训练集,而后2张归为测…

编译原理——词法分析器实验

实验目的 掌握词法分析器的功能。掌握词法分析器的实现。 实验内容及要求 对于如下文法所定义的语言子集&#xff0c;试编写并上机调试一个词法分析程序&#xff1a; <程序>→PROGRAM <标识符>;<分程序>. <分程序>→<变量说明>BEGIN<语…

(C++)带你手肝词法分析器,容易理解,跟着思路有手就行

词法分析器 一.前言二.什么是“词法分析器”&#xff1f;三.正式设计1.设计种别码表2.设置判断为字母或数字的函数3.设置全局参数4.核心&#xff1a;scan()函数5.主函数里结合scan函数进行循环扫描6.结果截图7.需要注意&#xff08;比较难&#xff09;的地方 四.心得体会五.源代…

词法分析器实现

点击打开链接 词法分析器实现 一、写在前面 编译原理是软件工程的一项基础的课程&#xff0c;是研究软件是什么&#xff0c;为什么可以运行&#xff0c;以及怎么运行的学科&#xff0c;编译系统的改进将会直接对其上层的应用程序的执行效率&#xff0c;执行原理产生深刻的影响…

词法分析器(一)

词法分析器 &#xff08;基本符号表&#xff0c;状态转换图&#xff09; 引言&#xff1a;编译原理的实验部分是关于编译器的&#xff0c;我决定将这部分的学习和实践过程记录下来&#xff0c;也希望看到这篇文章的有缘人来指正和提出宝贵的意见。 基本符号表 本次实验我通过…

词法分析器 Java完整代码版

想了解更多内容&#xff0c;移步至编译原理专栏 2021.12.22 更新 整理了一下代码&#xff0c;同步到了gitee https://gitee.com/godelgnis/lrparserhttps://gitee.com/godelgnis/lrparser --------------------------------------------------分割线-----------------------…

编译原理——词法分析器(C/C++代码实现)

目录 0 实验目的&#xff1a; 1 实验要求&#xff1a; 2 实验内容&#xff1a; 3 实验思路&#xff1a; 4 实验代码&#xff1a; 5 实验结果&#xff1a; 6 实验总结&#xff1a; 7 实验程序以及实验报告下载链接&#xff1a; 0 实验目的&#xff1a; 设计、编制、实现…

词法分析器的构成(含源代码)

标题&#xff1a;词法分析器 本人最近在学习编译原理&#xff0c;刚刚学到词法分析器&#xff0c;心想着挺好玩&#xff0c;就想着自己写一个&#xff0c;奈何一没有系统的学过c语言&#xff0c;只是粗略的看过一遍K&R的c语言书&#xff0c;所以水平尚浅&#xff0c;代码有…

java实现词法分析器

实现词法分析器 实验内容要求 一、实验目的 加深对词法分析器的工作过程的理解&#xff1b;加强对词法分析方法的掌握&#xff1b;能够采用一种编程 语言实现简单的词法分析程序&#xff1b;能够使用自己编写的分析程序对简单的程序段进行词法分 析。 二、实验内容 自定义一…