音视频入门基础:RTP专题(7)——RTP协议简介

一、引言

本文对RTP协议进行简介。在简介之前,请各位先下载RTP的官方文档《RFC 3550》和《RFC 3551》。《RFC 3550》总共有89页,《RFC 3551》总共有44页。本文下面所说的“页数”是指在pdf阅读器中显示的页数:

二、RTP协议简介

  根据《RFC 3550》第5页,实时传输协议(Real-time Transport Protocol或简写RTP)为交互式音频和视频等具有实时特性的数据提供端到端的传输服务。这些服务包括有效载荷类型识别、序列编号、时间戳和传输监控。应用程序通常在 UDP 的基础上运行 RTP,以利用其多路复用和校验服务;这两个协议都贡献了部分传输协议功能。不过、RTP 也可与其他合适的底层网络或传输协议一起使用。如果底层网络提供多播分发功能,RTP 支持将数据传输到多个目的地。
  请注意,RTP 本身并不提供任何机制来确保及时传输或提供其他服务质量保证,而是依靠底层服务来实现。它既不保证传送或防止无序传送,也不假定底层网络是可靠的并能按顺序传送数据包。RTP 中包含的序列号允许接收方重建发送方的数据包序列,但序列号也可用于确定数据包的正确位置,例如在视频解码中,不一定要按顺序解码数据包。虽然 RTP 主要是为了满足多方参与的多媒体会议的需求,但它并不局限于这一特定应用,连续数据存储、交互式分布式仿真、活动徽章以及控制和测量应用也可能适用 RTP:

三、Mixers和Translators

根据《RFC 3550》第7到第8页,到目前为止,我们假定所有网站都希望以相同的格式接收媒体数据。然而,这并不总是合适的。考虑这样一种情况:一个地区的与会者通过低速链路与大多数享有高速网络接入的与会者连接。与其强迫每个人都使用带宽较低、质量较差的音频编码,不如在低带宽区域附近放置一个称为混音器(Mixer)的RTP级中继器。混音器会重新同步传入的音频数据包,以重建发送方生成的20毫秒恒定间隔,这些数据包可以单播给单个接收者,也可以通过不同地址组播给多个接收者。RTP header包含一种混音器识别混合数据包来源的方法,以便在接收器上提供正确的通话者指示。

音频会议中的某些预期参与者可能使用高带宽链路连接,但可能无法通过 IP 组播直接到达。例如,他们可能位于应用级防火墙之后,无法通过任何 IP 数据包。在这种情况下,可以使用另一种称为翻译器(Translator)的 RTP 级中继。在防火墙两侧各安装一个翻译器,外部翻译器通过安全连接将接收到的所有组播数据包传送到防火墙内部的翻译器。防火墙内的翻译器将这些数据包作为组播数据包再次发送到仅限于网站内部网络的组播组。
混合器和翻译器的设计目的多种多样。例如,视频混合器可将独立视频流中的单个人物图像进行缩放,然后合成到一个视频流中,以模拟群体场景。其他转换的例子包括将一组只讲 IP/UDP 的主机连接到一组只懂 ST-II 的主机上,或对来自单个信号源的视频流进行逐包编码转换,而无需重新同步或混合:


根据《RFC 3550》第10页,Translator(翻译器,转换器)是转发 RTP 数据包并保持其synchronization source identifier(同步源标识符)不变的中间系统。Translator的例子包括不混合转换编码的设备、从组播到单播的复制器以及防火墙中的应用级过滤器:

Mixer(混音器,混合器)为从一个或多个来源接收 RTP 数据包的中间系统,可能会更改数据格式,以某种方式合并数据包,然后转发新的 RTP 数据包。由于多个输入源之间的定时一般不会同步,因此Mixer会对数据流进行定时调整,并为合并后的数据流生成自己的定时。因此,从Mixer发出的所有数据包都将被识别为以Mixer为同步源(synchronization source):

四、RTP packet

根据《RFC 3550》第8页,RTP packet(RTP报文)是由固定的RTP头(RTP Fixed Header)、可能为空的贡献源(contributing sources,简称CSRC)列表和有效载荷数据(payload)组成的数据包。某些底层协议可能要求定义 RTP 数据包的封装。通常情况下,底层协议的一个数据包包含一个 RTP 数据包,但如果封装方法允许,也可能包含多个 RTP 数据包:

一个RTP packet =  RTP header + RTP layload + 填充字节(可选)

五、RTP header

 根据《RFC 3550》第12页,RTP header包含下图所示部分:

RTP header = RTP Fixed Header + contributing source(CSRC) identifiers + RTP Header Extension(可选)

六、RTP Fixed Header

RTP Fixed Header包含RTP header中必须存在的字段。RTP Fixed Header固定占12字节。

RTP Fixed Header = version + padding + extension + CSRC count + marker + payload type + sequence number + timestamp + SSRC

其中:

version:占2位,该字段标识 RTP 的版本,本规范(《RFC 3550》)定义的版本为'2'(目前都用2版本)。值'1'用于RTP的第一个草案版本,值'0'用于最初在 “vat ”音频工具中实施的协议):

padding:占1位,为填充位,表示用于RTP packet结束点的预留空间。如果设置了填充位(padding的值为1),该RTP packet的末尾就会包含一个或多个额外的填充八位位组(此时RTP packet末端会附加填充字节),这些八位位组不属于有效载荷的一部分。填充的最后一个八位位组包含应忽略多少个填充八位位组(包括其本身)的计数。某些具有固定块大小的加密算法或在下层协议数据单元中携带多个RTP packet时可能需要使用填充:

extension:占1位,为扩展位,如果扩展位被设置(extension的值为1),RTP Fixed Header后(CSRC之后)必须有一个扩展头( RTP Header Extension)

CSRC count:占4位,为CSRC的计数。指示RTP Fixed Header之后的CSRC标识符数量,即contributing source(CSRC) identifiers的数量:

marker:占1位,该marker(标记)的解释由配置文件(profile)定义。其目的是允许在数据包流中标记帧边界等重要事件。配置文件可定义额外的标记位,或通过改变有效载荷类型字段中的位数来指定没有标记位:

根据《RFC 3551》第30页,大多数视频编码规定,在视频帧的最后一个packet(报文,数据包)中,RTP header的marker位应设置为 1,否则设置为0。因此,无需等待具有不同时间戳的后续数据包来检测是否应显示新帧(也就是说:视频的每帧可能会比较大,一个RTP packet可能无法发送完。所以使用了几个packet来传输该帧。对于视频,通常的规则是marker位的值为1时表示这是该视频帧的最后一个packet):

根据《RFC 3551》第37页,音频静默后第一个数据包上设置marker位的要求级别从 “是 ”改为 “应该是”,并说明只有在故意不发送数据包时才设置标记位(也就是说:对于音频而言,常用的规则是marker位值为1时表示通话开始,即 “数据包未连续传输的静默期后的第一个数据包”):

payload type:占7位,为PT值(有效载荷类型),根据该值确定 RTP 有效负载(payload)的格式,并决定应用程序对其的解释:

《RFC 3551》规定了一套初始的 “有效载荷类型”, 本列表保留并扩展了该列表:

有效载荷标识符 96-127 用于会话期间动态定义的有效载荷。建议动态分配端口号,但端口号 5004 和 5005 已被注册,以便在不需要动态分配端口时使用配置文件。除了上表中明确指定PT值的负载类型,还有些负载类型由于诞生的较晚,没有具体的PT值,只能使用动态(dynamic)PT值,即96到127,比如普遍指定H264的PT值为96。

根据《RFC 6184》第11页(该文档描述了:RTP Payload Format for H.264 Video),对于H.264,必须通过所使用的配置文件或以动态方式分配有效载荷类型:

sequence number:占16位(2字节),为序列号。每发送一个 RTP数据包,序列号的值就会递增加1,接收方可利用序列号检测数据包丢失并恢复数据包序列。序列号的初始值应是随机的(不可预测的),这样即使信源本身没有加密,也能增加已知纯文本加密攻击的难度,因为数据包可能会流经translator (翻译器)进行加密:

timestamp:占32位(4字节),为产生payload的时间戳。时间戳反映RTP数据包中第一个字节的采样瞬间。采样瞬时必须来自一个在时间上单调线性递增的时钟,以便进行同步和抖动计算。与序列号一样,时间戳的初始值也应该是随机的:

synchronization source (SSRC) identifier:占32位(4字节),SSRC字段用于标识同步源(synchronization source,即RTP数据流的起源)。该标识符应随机选择,目的是使同一RTP 会话中没有两个同步源具有相同的SSRC标识符(在一个RTP会话中,每个数据流的SSRC都不同,接收者将根据该SSRC标识符来区分不同的信源,进行RTP报文的分组)。虽然多个信号源选择相同标识符的概率很低,但所有RTP实现都必须做好检测和解决碰撞的准备。如果源更改了源传输地址,它也必须选择一个新的SSRC标识符,以避免被解释为循环源:

七、CSRC list

在RTP Fixed Header之后的是CSRC list(CSRC列表),其包含0到15项contributing source(CSRC) identifiers,,每项占32位(4字节)。CSRC列表标识了该数据包所含有效载荷的贡献源(contributing sources)。标识符的数量由RTP Fixed Header的CSRC count(CC)字段给出。如果贡献源超过 15 个,则只能识别 15 个。CSRC 标识符由混合器(mixers)插入,使用贡献源的 SSRC 标识符。例如,在音频数据包中,会列出混合在一起创建数据包的所有信源的 SSRC 标识符,以便在接收机上正确显示通话者:

八、RTP Header Extension

根据《RFC 3550》第16页,RTP中提供了一种扩展机制,允许各实施机构尝试与有效载荷格式无关的新功能,这些功能需要在 RTP 数据包报头中携带额外的信息。设计该机制的目的是使其他未进行扩展的互操作实现可以忽略报头扩展。比如通过该RTP扩展,可以添加前向纠错码(FEC),发送冗余数据。使接收端在一定比例丢包的情况下可以恢复原始数据,提高传输的稳健性。
请注意,该报头扩展仅用于有限的用途。例如,RTP Fixed Header的特定配置文件扩展处理成本较低,因为它不是条件性的,也不在可变位置。特定有效载荷格式所需的附加信息不应使用这种标头扩展,而应放在数据包的有效载荷部分:

九、payload

根据《RFC 3550》第8页,payload(RTP layload,有效载荷)为RTP在数据包中传输的数据,例如音频样本或压缩后的视频数据,即实际的媒体数据。其格式和内容取决于RTP Fixed Header中的payload type字段:

十、参考

《维基百科——实时传输协议》

《Real-Time Transport Protocol (RTP) Parameters》

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

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

相关文章

半导体器件与物理篇7 微波二极管、量子效应和热电子器件

基本微波技术 微波频率:微波频率涵盖约从0.1GHz到3000GHz,相当于波长从300cm到0.01cm。 分布效应:电子部件在微波频率,与其在较低频率的工作行为不同。 输运线:一个由电阻、电容、电感三种等效基本电路部件所组成的…

【C++】B2122 单词翻转

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 💯一、我的做法代码实现:代码解析思路分析 💯二、老师的第一种做法代码实现&a…

麦芯(MachCore)应用开发教程5 --- 工位和晶圆传输

麦芯是构建在windows系统上的设备应用操作系统,利用该系统可以快速高效的开发一款设备专用软件。希望进一步了解请email: acloud163.com 黄国强 2025/02/03 一、工位与子设备的关系 想象工厂中的流水线工作站,每个工位(Station&#xff09…

Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

【C++篇】位图与布隆过滤器

目录 一,位图 1.1,位图的概念 1.2,位图的设计与实现 1.5,位图的应用举例 1.4,位图常用应用场景 二,布隆过滤器 2.1,定义: 2.2,布隆过滤器的实现 2.3, 应…

VR触感数据手套:触感反馈赋予虚拟交互沉浸式体验

随着动作捕捉技术的蓬勃发展,动捕数据手套成为了手部动作捕捉与虚拟交互的便捷工具,为人们打开了通往虚拟世界的新大门。在众多产品中,mHand Pro作为一款多功能兼具的VR动作捕捉数据手套,凭借其卓越的性能,在手部动作捕…

追逐低空经济,无人机研学技术详解

追逐低空经济,无人机研学技术成为了一个备受关注的领域。以下是对无人机研学技术的详细解析: 一、无人机研学技术概述 无人机研学技术是以无人机为核心,结合航空科技、电子技术、机械原理等多领域知识的一种教育实践活动。它旨在通过理论学习…

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编,编译后链接即可) 任务1:Uthread: switching between threads (完成) 在这个练习中,你将设计一个用户级线程系统中的上下文切…

Kubernetes学习之通过Service访问Pod

一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址,当controller用新的pod替代发生故障的pod时,新的pod会分配到新的ip地址,那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码: 二、【模版】 二维前缀和 参考代码: 三、寻找数组的中心下标 参考代码: 四、除自身以外数组的乘积 参考代码: 五、和为K的子数组 参考代码: 六、和可被K整除的子数组 参…

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov,并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。

谷歌Titans模型论文解析,Transformer迎来变革拐点——DeepSeek能否“接招”?

一、引入 Titans 模型 我们将深入探讨谷歌研究院的一篇新论文《Titans: Learning to Memorize at Test Time》,该论文介绍了一种名为 Titans 的新模型架构。 Titans 在缓解 Transformer 二次方成本问题的同时,展现出了令人期待的成果。Titans 模型的设…

新春贺岁,共赴AGI之旅

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 季姮教授独家文字版干货 | 面向知识渊博的大语言模型 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题…

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代,数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时,如何高效地存储、分类与检索信息,直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储,更是整合了文档、图像、…

【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互

Lab 3: Building Agents with memory 基于latta框架构建MemGpt代理并与之交互理解代理状态,例如作为系统提示符、工具和agent的内存查看和编辑代理存档内存MemGPT 代理是有状态的 agents的设计思路 每个步骤都要定义代理行为 Letta agents persist information over time and…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中调用的IP核,新建文件PLL_test.v 2、代码如图 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…

【C++】P5734 【深基6.例6】文字处理软件

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯题目描述输入格式输出格式示例输入与输出输入:输出: 💯我的做法操作1:在文档末尾插入字符串操作2&…

后盾人JS -- 原型

没有原型的对象 也有没有原型的对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…