WebRTC:真正了解 RTP 和 RTCP
介绍
近年来,通过互联网进行实时通信变得越来越流行,而 WebRTC 已成为通过网络实现实时通信的领先技术之一。WebRTC 使用多种协议,包括实时传输协议 (RTP) 和实时控制协议 (RTCP)。
RTP负责通过网络传输音频和视频数据,而RTCP负责监控网络状况并向发送方提供反馈。RTP和RTCP在同一网络上通信,RTP使用偶数端口,RTCP使用奇数端口。这允许两种协议使用相同的网络资源而不会互相干扰。在这篇文章中,我们将讨论 RTP 和 RTCP 是什么以及它们如何协同工作以在 WebRTC 中实现实时通信。
实时传输协议 (RTP)
实时传输协议(RTP)是一种设计用于通过互联网传输音频和视频数据的协议。RTP 用于实时传输媒体流,例如语音和视频。
RTP 负责将媒体数据打包成小数据包并通过网络传输。每个RTP数据包都包含一个序列号和时间戳,用于确保数据包以正确的顺序和在正确的时间传送。RTP 数据包通过 UDP 传输,延迟低,非常适合实时通信。
实时控制协议 (RTCP)
实时控制协议 (RTCP) 是一种旨在提供 RTP 流量服务质量 (QoS) 反馈的协议。RTCP 用于监视网络状况,例如数据包丢失和延迟,并向发送方提供反馈。RTCP 数据包定期发送,以提供有关 RTP 流质量的反馈。它们包含有关 RTP 流的统计信息,包括发送和接收的数据包数量、丢失的数据包数量以及数据包之间的延迟。此信息可用于调整 RTP 流以提高音频或视频的质量。
了解视频压缩
我们不会深入研究视频压缩,但我们会足够了解为什么 RTP 是这样设计的。视频压缩将视频编码为一种新的格式,需要更少的比特来表示相同的视频。
有损和无损压缩
视频可以编码为无损(没有信息丢失)或有损(信息可能丢失)。RTP 通常使用有损压缩来防止高延迟流和更多丢包,即使视频质量不太好。
帧内和帧间压缩
视频压缩有两种类型:帧内压缩和帧间压缩。帧内压缩减少了用于描述单个视频帧的位数。相同的技术也用于压缩静态图片,例如 JPEG 压缩方法。另一方面,帧间压缩寻找不两次发送相同信息的方法,因为视频是由许多图片组成的。
帧间类型
帧间压缩共有三种帧类型:
- I 帧- 无需任何其他内容即可解码的完整图片。
 - P 帧- 仅包含与前一张图片相比的变化的部分图片。
 - B 帧- 部分图片,是对先前和未来图片的修改。
 
以下是三种帧类型的可视化。

显然,视频压缩是一个有状态的过程,在通过互联网传输时会带来挑战。这让我们想知道,如果 I 帧的一部分丢失会发生什么?P 帧如何确定要修改的内容?随着视频压缩方法变得更加复杂,这些问题变得更加紧迫。尽管如此,RTP 和 RTCP 提供了一个解决方案。
RTP数据包结构
每个 RTP 数据包都具有以下结构,如RFC中所定义:
 0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|X|  CC   |M|     PT      |       sequence number         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           Timestamp                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           Synchronization Source (SSRC) identifier            |
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
|            Contributing Source (CSRC) identifiers             |
|                             ....                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Payload                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
Version (V)
Version始终设置为2。
Padding (P)
Padding是一个布尔值,用于确定有效负载是否有填充。
有效负载的最后一个字节指示添加的填充字节数。
Extension (X)
如果设置,RTP 标头将包含扩展。
CSRC Count (CC)
        指的是有效负载之后和之前的标识符CSRC Count的数量。CSRCSSRC
Marker
        该Marker位没有预定含义,可以根据用户的需要使用。
在某些情况下,它可能指示用户何时说话,或者可能指示关键帧。
Payload Type (PT)
        这Payload Type是该数据包携带的编解码器的唯一标识符。
        对于 WebRTC,Payload Type是动态的,这意味着Payload Type一次调用中 VP8 的 可能与另一次调用中的 VP8 不同。Payload Types调用中的提供者确定到编解码器的映射Session Description。
Sequence Number
       用于Sequence Number对流中的数据包进行排序。每发送一个数据包,Sequence Number就会加一,RTP 是被设计为在有损网络上有用,这为接收方提供了一种检测数据包何时丢失的方法。
Timestamp
    Timestamp是该数据包的采样时刻。它不是一个全局时钟,而是代表媒体流中已经过去了多少时间。例如,如果多个 RTP 数据包都是同一视频帧的一部分,则它们可以具有相同的时间戳。
Synchronization Source(SSRC)
        An SSRC是该流的唯一标识符。这允许多个媒体流在单个 RTP 流上运行。
Contributing Source (CSRC)
这是一个列表,用于传达哪些 SSRC 对此数据包做出了贡献。
这通常用于谈话指标。例如,如果多个音频源在服务器端组合成单个 RTP 流,则该字段可用于指示哪些输入流在给定时刻处于活动状态。
Payload
该字段包含实际的有效负载数据,如果设置了填充标志,则该数据可能以添加了多少填充字节的计数结束。
RTCP数据包结构
每个 RTCP 数据包都有以下结构:
0                   1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|V=2|P|    RC   |       PT      |             length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Payload                            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
Version (V)
Version始终是2。
Padding (P)
    Padding是一个布尔值,用于控制有效负载中是否包含填充。
有效负载的最后一个字节包括添加的填充字节的计数。
Reception Report Count (RC)
这表示此数据包中包含的报告数量。单个 RTCP 数据包可能包含多个事件。
Packet Type (PT)
这是 RTCP 数据包类型的唯一标识符。虽然 WebRTC 代理不一定需要支持所有这些类型,但代理之间的支持可能存在差异。一些常见的数据包类型包括:
192- 完整帧内请求 (FIR)193- 否定确认 (NACK)200- 发件人报告201- 接收者报告205- 通用 RTP 反馈206- 有效负载特定反馈(包括PLI)
RTCP数据包类型详细信息
RTCP 是一种灵活的协议,支持多种类型的数据包。下面详细介绍了一些最常用的数据包类型。
PLI(图像丢失指示)/FIR(完整帧内请求)
    FIR和消息都有PLI类似的目的,向发送者请求完整的关键帧。然而,PLI当解码器无法解码部分帧时专门使用,这可能是由于数据包丢失或解码器崩溃造成的。
        根据 RFC 5104,FIR当数据包或帧丢失时不应使用;这就是 的工作PLI。FIR用于出于其他原因请求关键帧,例如当新成员进入视频会议并需要完整关键帧来开始解码视频流时。解码器将丢弃帧,直到关键帧到达。
        然而,在实践中,处理PLI和FIR数据包的软件将向编码器发送信号,以在这两种情况下生成新的完整关键帧。
通常,接收器会在连接后立即请求完整的关键帧,以最大限度地缩短第一帧出现在用户屏幕上的时间。
    PLI数据包是有效负载特定反馈消息的一部分。
NACK(Negative Acknowledgement)
        当接收方发出 时NACK,它会请求发送方重新传输单个 RTP 数据包。这通常是在数据包丢失或延迟时完成的。NACK比请求重新发送整个帧更好,因为 RTP 将数据包分成小块,并且接收方通常只丢失一小块。为了请求丢失的片段,接收器创建带有 SSRC 和序列号的 RTCP 消息。如果发送方没有重新发送所请求的 RTP 数据包,它将简单地忽略该消息。
发送者和接收者报告
这些报告对于在代理之间传输统计数据至关重要。它们有效地传达接收到的数据包的确切数量以及抖动级别。
此功能提供有价值的诊断信息并实现有效的拥塞控制。我们将在下面详细了解如何使用这些报告来克服不可靠的网络条件。
克服不可靠的网络
实时通信严重依赖网络。在理想的情况下,带宽将是无限的,并且数据包将立即到达。不幸的是,网络是有限的,并且条件可能会发生意外变化,因此很难测量和观察网络性能。此外,不同的硬件、软件和配置可能会导致不可预测的行为。
RTP/RTCP 运行在许多不同类型的网络上,因此发送方和接收方之间的某些通信丢失是很常见的。由于它建立在 UDP 之上,因此没有内置方法来重传数据包或处理拥塞控制。
测量和传达网络状态
RTP/RTCP 在各种网络类型和拓扑上运行,因此发送方到接收方可能会发生通信丢失。由于它们建立在 UDP 之上,因此没有数据包重传或拥塞控制的固有机制。
为了获得最佳的用户体验,我们必须评估网络路径质量并适应其随时间的变化。要监控的关键特征是可用带宽(在每个方向上,可能不对称)、往返时间和抖动(往返时间的变化)。我们的系统必须考虑数据包丢失,并随着网络条件的变化传达这些属性的变化。
该协议有两个主要目标:
- 估计网络支持的可用带宽(在每个方向)。
 - 在发送方和接收方之间传达网络特征。
 
接收者报告/发送者报告
接收方报告和发送方报告通过 RTCP 发送,并在RFC 3550中定义。它们在端点之间传递网络状态。接收器报告传达网络质量,包括数据包丢失、往返时间和抖动。这些报告与根据网络质量估计可用带宽的其他算法配合使用。
发送方和接收方报告(SR 和 RR)共同描绘了网络质量。它们按每个 SSRC 的时间表发送,并用于估计可用带宽。发送方收到RR数据后估计可用带宽,其中包含以下字段:
- 丢失分数- 自上次接收器报告以来丢失的数据包百分比。
 - 丢失数据包的累积数量- 整个呼叫期间丢失的数据包数量。
 - 接收到的扩展最高序列号- 最后接收到的序列号以及已滚动的次数。
 - 到达间隔抖动- 整个呼叫的滚动抖动。
 - 最后发件人报告时间戳- 发件人的最后已知时间,用于计算往返时间。
 
这些统计数据进一步输入带宽估计算法,例如 GCC(Google 拥塞控制),该算法估计可用带宽,进而驱动编码比特率和帧分辨率。
结论
总之,RTP 和 RTCP 是 WebRTC 中实现实时通信的基本协议。RTP负责通过网络传输音频和视频数据,而RTCP负责监控网络状况并向发送方提供反馈。这些协议共同实现了互联网上的高质量实时通信。对于任何有兴趣使用 WebRTC 开发实时通信应用程序的人来说,了解 RTP 和 RTCP 如何协同工作至关重要。
参考
- RFC3550(RTP:实时应用传输协议)
 - RFC5104(带反馈的 RTP 视听配置文件中的编解码器控制消息)
 - RFC8888(用于拥塞控制的 RTP 控制协议 (RTCP) 反馈)
 
关于转载
转载此文请注明出处,“引用于新睿云.弘电脑”,否则请回避。
相关文章:
WebRTC:真正了解 RTP 和 RTCP
介绍 近年来,通过互联网进行实时通信变得越来越流行,而 WebRTC 已成为通过网络实现实时通信的领先技术之一。WebRTC 使用多种协议,包括实时传输协议 (RTP) 和实时控制协议 (RTCP)。 RTP负责通过网络传输音频和视频数据,而RTCP负责…...
vue实现双向绑定原理深度解析
1. vue双向绑定应用场景 Vue的双向绑定机制主要体现在以下几个方面: 表单输入:在表单输入中,Vue的双向绑定机制非常有用。通过v-model指令,可以将表单元素的值与Vue实例中的数据进行双向绑定,当用户在表单输入框中输入内容时,数据会自动更新,反之,当数据发生变化时,输…...
C语言 —— memeove函数的模拟实现
函数作用:从sourse的位置开始向后复制num个字节到desttintion指向的内存位置,(运用于字符时,遇到\0不会停止),这个函数支持重叠部分的复制,是memcpy函数的改进版本 具体步骤: 1&am…...
<el-tab>样式自定义——一个可以触类旁通的小例子
首先在网页的检查确定想要自定义的部分叫什么 例如: 我想修改的组件是el-tabs__header.is-top 的margin-bottom 则在相应vue文件的<style>里面增加这一属性 其中,::v-deep可以帮助覆盖子组件内部元素的样式。 ::v-deep .el-tabs__header.is-to…...
XDP学习笔记
XDP的使用与eBPF程序分不开,因此要了解学历XDP,须知道什么是eBPF、什么是XDP。 概念 eBPF BPF(Berkeley Packet Filter)是一种灵活且高效的数据包过滤技术,最初由 BSD Unix 中的网络子系统引入;BPF 允许用…...
JavaScript进阶:js的一些学习笔记-4
文章目录 1. 拷贝1. 浅拷贝2. 深拷贝 2. 异常处理 1. 拷贝 这里指的拷贝是指拷贝引用类型的数据(对象) 1. 浅拷贝 拷贝对象:Object.assign() 或者 {…obj} 展开运算符 const obj {name:liuze,age:23 } const o {...obj}; o.age 22; console.log(o); console.…...
【可能是全网最丝滑的LangChain教程】三、快速入门LLMChain
系列文章地址 【可能是全网最丝滑的LangChain教程】一、LangChain介绍 【可能是全网最丝滑的LangChain教程】二、LangChain安装 使用LangChain构建应用 LangChain支持构建应用程序,将外部数据源和计算源连接到LLM。我们将从一个简单的 LLM 链开始,它…...
Oracle Primavera Analytics 是什么,与P6的关系?
前言 Oracle Primavera P6 Analytics 是与P6有关的一个相对较新的模块,Primavera 用户社区在很大程度上尚未对其进行探索。 那么它到底有什么作用呢? 通过了解得知它旨在通过深入了解组织的项目组合绩效,帮助高级管理层对其项目组合做出更好…...
在 Amazon Bedrock 上使用 Anthropic Claude 系统 Prompt
系统 prompt 是定义生成式 AI 模型对用户输入的响应策略的一种好方法。这篇博文将介绍什么是系统 prompt,以及如何在基于 Anthropic Claude 2.x 和 3 的应用中使用系统 prompt。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例…...
【LeetCode】动态规划--题目练习
有关动态规划算法的整理:添加链接描述 1.爬楼梯 爬楼梯:LeetCode70 int climbStairs(int n) {//1.确定dp数组和意义 dp[n]表示第n阶的方法//2.确定递推关系式 dp[n] dp[n-1]dp[n-2];//3.初始化int dp[50] {0};dp[1] 1;dp[2] 2;for(int i 3;i<n;i){dp[i] …...
【LeetCode热题100】101. 对称二叉树(二叉树)
一.题目要求 给你一个二叉树的根节点 root , 检查它是否轴对称。 二.题目难度 简单 三.输入样例 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true 示例 2: 输入:root [1,2,2,null,3,null,3] 输出&a…...
VLC抓取m3u8视频
前言 最近想看一些网络视频,但是很多时候网页上是m3u8推流的,如果在线看,速度又慢,所以就想下载下来,就想到了VLC的推流,转换能力,查阅资料,加上实践,总结心得。 设置中…...
聊聊Python都能做些什么
文章目录 一、Python简介二、Python都能做些什么1. Web开发2. 数据分析和人工智能3. 自动化运维和测试4. 网络爬虫5. 金融科技 三、Python开源库都有哪些1. Web开发2. 数据分析和科学计算3. 机器学习和深度学习4. 网络爬虫5. 自动化和测试6. 其他常用库 四、相关链接 一、Pytho…...
JavaWeb06-MVC和三层架构
目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式,其中 M:Model,业务模型,处理业务 V: View,视图,界面展…...
MySQL数据库实现增删改查基础操作
准备工作 安装mysql8.0 (安装时一定要记住用户名和密码)安装数据库可视化视图工具Navicat 请注意⚠️⚠️⚠️⚠️ a. 编程类所有软件不要安装在中文目录下 b. Navicat破解版下载安装教程:(由于文章审核提示版权问题,链接不方便给出ÿ…...
PCM和I2S区别
I2S和PCM接口都是数字音频接口,而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口,是不是两个接口有各自不同的应用呢?先来看下概念。 PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信…...
大模型笔记:吴恩达 ChatGPT Prompt Engineering for Developers(1) prompt的基本原则和策略
1 intro 基础大模型 VS 用指令tune 过的大模型 基础大模型 只会对prompt的文本进行续写 所以当你向模型发问的时候,它往往会像复读机一样续写几个问题这是因为在它见过的语料库文本(通常大多来自互联网)中,通常会连续列举出N个问…...
设计模式 — — 单例模式
一、是什么 单例模式只会在全局作用域下创建一次实例对象,让所有需要调用的地方都共享这一单例对象 二、实现 // 单例构造函数 function CreateSingleton (name) {this.name name;this.getName(); };// 获取实例的名字 CreateSingleton.prototype.getName func…...
C++:菱形继承与虚继承
看下面这个示例代码 class A{ public: int num10; A(){cout<<"A构造"<<endl;} virtual void fun(){cout<<"A虚函数"<<endl;} };class B:public A{ public: B(){cout<<"B构造"<<endl;} void fun(){cout<…...
贡献法:USACO 2021 December Contest Bronze:孤独的照片
Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。 奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而,他…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

