WebRTC中的几个Rtp*Sender
一、问题:
webrtc当中有几个比较相似的类,看着都是发送RTP数据包的,分别是:RtpPacketToSend
和RtpSenderVideo
还有RtpVideoSender
以及RTPSender
,这说明什么呢?首先,说明我会很多连词(🤬),元规正传(🤬),其次,说明他们都很像,容易给我们搞晕,最后,我们需要搞明白,这几个类各自扮演什么角色,设计意图是什么呢?如果是你设计,你怎么设计,整一个万能类不就行了,反正就是发送RTP数据?行不行,你说!
小的不才,有点感悟记录下来,行不行您自己看!
二、 RtpPacketToSend 的主要作用
主要代码
class RtpPacketToSend : public RtpPacket {
public:// 省略不重要的牛马
private:// 抓取时间,用于统计或同步int64_t capture_time_ms_ = 0;// 包类型(packet_type_):音频、视频、冗余等absl::optional<RtpPacketMediaType> packet_type_;// 是否允许重传bool allow_retransmission_ = false;absl::optional<uint16_t> retransmitted_sequence_number_;std::vector<uint8_t> application_data_;// 是否是视频帧第一个包/关键帧bool is_first_packet_of_frame_ = false;bool is_key_frame_ = false;
};
核心作用
RtpPacketToSend
是 WebRTC 代码中发送端专用的 RTP 包对象,承载了要发送的 RTP 包及其元数据。
它继承自 RtpPacket
,不光包含了基本的 RTP 头、负载、扩展字段,还附加了“只对发送过程有用的上下文元数据”,比如:
- 抓取时间(capture_time_ms_):用于统计或同步
- 包类型(packet_type_):音频、视频、冗余等
- 是否是重传包、原序列号
- 是否允许重传
- 是否是视频帧第一个包/关键帧
- 部分计时信息(如包化完成时间、发送出口时间等)
一句话总结:
RtpPacketToSend
= “封装着即将要发出的RTP包内容 + 发送相关的所有额外属性”
三、RTPSender
RTP 发送器基类,负责整个 RTP (不分媒体类型) 的发送流程。
核心职能:
- RTP 头生成、序列号分配
- 调用底层 socket 发送
- 调用上层接口获得要发什么
- 负责一些重传、FEC等通用功能
有音视频共用逻辑(针对 RTP 协议通用部分)
四、RtpSenderVideo
/ RtpVideoSender
这两个其实逻辑上是分开的,但在不同WebRTC代码阶段、分支和版本名可能不一样,核心意思都是“视频数据专用 RTP 发送器”。
它们在继承/组合结构上,最终都要依靠 RTPSender 来发送包,但是加上了:
- 对视频的特殊处理(比如分包、关键帧标识等)
- 输出帧状态报告
- 处理视频自己的 RTP 头扩展
通常代码里 RtpSenderVideo
是作为 RTPSender
的成员或持有者。调用“我要发一帧视频”→“如何打包分包”→“每一个分包作为RtpPacketToSend送给RTPSender”处理实际发送。
五、RtpPacketToSend
只负责代表“某一个要被发送出去的RTP包对象”,和 RTPSender
“怎么发、发给谁”是分开的。
六、大致的发包流程(类关系图)
RtpVideoSender
接到一帧视频数据- 封装成多个 RTP 包,每个包一份负载、RTP头,用
RtpPacketToSend
保存 RtpPacketToSend
包含所有要发的包的元信息(如capture时间、包类型、关键帧等)RTPSender
接收这些包,安排好序列号、头部、retransmit、NACK 等发送相关管理- 由
RTPSender
完成最终“投递到UDP”的行为
七、举个栗子:
比如:发送一帧视频流的发送链条
- 编码器输出了一帧 H264/VP8 数据
RtpVideoSender::SendVideo()
被调用- 将一帧切分成n个RTP包(因为包不能太大)
- 循环产生
RtpPacketToSend
对象- 填写每个包的payload
- 设置元数据(是否关键帧,是否第一包,时间戳等)
- 每个RtpPacketToSend喂给RTPSender::Send()
- 内部会进一步设置序列号、ssrc、加扩展头等
- 记录NACK/FEC/retransmission等重发需要的信息
- 通过socket等底层去发包到RTP peer
- 网络ISend接口:最终出去
八、总结联系与区别
类/模块 | 作用 | 关注点 |
---|---|---|
RtpPacketToSend | 表示“即将要发出去的一个RTP包”+元数据 | 单个包内容、附加定时/扩展/关键帧信息 |
RTPSender | RTP发送行为管理,包头生成+包投递(基础) | 通用RTP包发送,序列号分配、socket发包等 |
RtpSenderVideo/Video | 视频专用的RTP发送(多帧分包、关键帧判断等) | 视频帧处理,分包,关键帧加标,带有额外定时/统计 |
关系:
RtpPacketToSend
是包容器,RtpSenderVideo
/RtpVideoSender
生成它们,交由RTPSender
发送!RtpSenderVideo
/RtpVideoSender
是“分发器/工厂”,RTPSender
是“投递员”
九、一句话定性:
- RtpPacketToSend = 发包元信息封装器
- RtpSenderVideo(或RtpVideoSender)= 视频分包器,专门为视频准备、生成RtpPacketToSend,喂给RTPSender
- RTPSender = 真正的RTP通道发送器,管理和输出RTP包,连接到底层socket。
用一句话总结发送流程:
“视频帧被切割为多个RtpPacketToSend,经由RtpVideoSender预处理后交由RTPSender完成最终的网络发送。”
相关文章:

WebRTC中的几个Rtp*Sender
一、问题: webrtc当中有几个比较相似的类,看着都是发送RTP数据包的,分别是:RtpPacketToSend 和RtpSenderVideo还有RtpVideoSender以及RTPSender,这说明什么呢?首先,说明我会很多连词࿰…...

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结
150. 逆波兰表达式求值--后缀表达式 力扣题目链接(opens new window) 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给…...
Java编程课(一)
Java编程课 一、java简介二、Java基础语法2.1 环境搭建2.2 使用Intellij IDEA新建java项目2.3 Java运行介绍2.4 参数说明2.5 Java基础语法2.6 注释2.7 变量和常量一、java简介 Java是一种广泛使用的高级编程语言,最初由Sun Microsystems于1995年发布。它被设计为具有简单、可…...

IDEA202403 设置主题和护眼色
文章目录 背景一、设置主题二、设置背景豆沙绿三、设置控制台颜色 背景 在用IDEA进行开发时,长时间对着屏幕,不费眼是及其重要 一、设置主题 默认的主题是 Dark 暗黑,可更改为其他,如Light 高亮 位置:编辑栏【files…...

无人机螺旋桨平衡方法详解
螺旋桨平衡对于优化无人机性能、可靠性和使用寿命至关重要。不平衡的螺旋桨会产生过度振动,导致推力效率降低、噪音增大,并加速轴承和传感器的磨损。 螺旋桨平衡可通过三种方式实现:静态平衡、动态平衡和气动平衡。 静态与动态平衡是通过在…...
VUE混合开发用哪个PHP框架好?
在 Vue.js 主导前端的混合开发浪潮中,一个强大、灵活的后端 API 提供者至关重要。PHP 作为经久不衰的服务器端语言,拥有众多优秀框架。但哪个才是 Vue 混合开发的黄金搭档?本文将深入分析主流 PHP 框架的优劣,帮你找到最适合的那个…...

基于51单片机的车内防窒息检测报警系统
目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能: (1)检测车内温度及二氧化碳浓度并用lcd1602实时显示。 (2)当人体红外传感器检测到车内有人,且温度或二氧化碳浓度…...

Flask-Babel 使用示例
下面创建一个简单的 Flask-Babel 示例,展示如何在 Flask 应用中实现国际化和本地化功能。这个示例将包括多语言支持(中文和英文)、语言切换功能以及翻译文本的使用。 项目结构 我们将创建以下文件结构: 1. 首先,创…...
Android 轻松实现 增强版灵活的 滑动式表格视图
表格视图组件,支持: 1. 无标题模式:只有数据行也可以正常滑动 2. 两种滑动模式:固定第一列 或 全部滑动 3. 全面的样式自定义能力 4. 智能列宽计算 1. 无标题模式支持 设置无标题:调用 setHeaderData(null) 或 …...
寄存器模型生成:从手工到自动化
写代码这件事,总是充满了矛盾。你想要完美控制每一个细节,但又希望能够批量生产。寄存器模型的生成,恰恰体现了这种矛盾。 手工编写的局限性 我们完全可以手工编写一个寄存器模型。代码写出来,功能也能实现,看起来一切…...

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案
一、方案背景 在城市供热体系中,换热站作为连接热源与用户的核心枢纽,其运行稳定性直接影响供热质量。面对供热规模扩大与需求升级,传统人工巡检模式暴露出效率低、响应慢、监测不足等问题。基于GB28181协议的EasyGBS视频实时监控系统&…...

docker生命周期
进入容器里面 docker pull ubuntu # 获取ubtuntu镜像 docker run ubtuntu # -i 交互式命令操作,-t 开启一个终端 bash 进入容器后,执行的命令 docker run -it ubtuntu bash...

鸿蒙缺少WMIC missing WMIC
在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报:missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案:…...
25.6.5学习总结
归并排序(Merge Sort) 1. 概述 归并排序是一种基于分治思想的排序算法。它通过递归的方式,将待排序的数组不断分割成两半,直到每个子数组只剩一个元素(自然排序);然后,将这些子数组…...

Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理
概述 在日常的 Java 项目开发中,日志是最重要的调试与排查手段之一。为了便于开发时实时查看,同时在生产中追踪问题,我们通常希望实现以下日志管理目标: ✅ 控制台实时输出日志,方便开发调试✅ 日志根据级别分类保存…...

linux_centos7.x的ifconfig命令显示内容详解
这是一段在Linux系统中执行 ifconfig 命令后得到的网络接口信息输出。ifconfig 命令用于显示或配置网络接口的参数。以下是对输出中各个网络接口信息的详细解释: 1. ens33 接口 状态标志:flags4163<UP,BROADCAST,RUNNING,MULTICAST> 表示…...

CentOS 7 如何pip3安装pyaudio?
CentOS 7 如何pip3安装pyaudio? # 先将yum软件源改为阿里云镜像源 http://mirrors.aliyun.com/centos-vault/7.9.2009/ bash <(curl -sSL https://linuxmirrors.cn/main.sh) # 基于一键换源脚本,全部回车即可# pip3安装模块是从源码构建(…...
6.5本日总结
一、英语 复习默写list8list21,订正翻译07年第二篇阅读 二、数学 学习线代第一讲 三、408 学习计组2.2,写计组习题 四、总结 这篇阅读全对,整体题目不算难,但是对文意的翻译差点,后续要多练习句子翻译 五、明日…...

【个人笔记】数据库原理(西电)
第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形:实体圆形:属性菱形:关系 常用的逻辑模型 说白了:增删改查 几种数据模型的基本概念 层次模型:树状结构【只能处理一对多的关系,只有沿着从根…...

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议
目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP(传输控制协议) (一)TCP概述 (二)TCP的特征(面问高频问题) 1、有链接 三次握手:建…...

【react+antd+vite】优雅的引入svg和阿里巴巴图标
1.安装相关包 由于是vite项目,要安装插件来帮助svg文件引入进来,否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内: import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …...

3D动画在微信小程序的实现方法
微信小程序支持通过多种方式实现3D动画效果,主要包括使用CSS3、WebGL及第三方库。以下为具体方法: 一. 使用CSS3 Transform实现基础3D动画详解 CSS3的transform属性提供了强大的2D/3D变换功能,通过简单的代码就能实现复杂的视觉效果。在小程…...

计算机网络 | 1.2 计算机网络体系结构与参考模型
计算机网络体系结构与参考模型 目录 计算机网络体系结构与参考模型 【思维导图】 1、计算机的分层结构 1、为什么要分层? 2、什么是计算机网络体系结构 2、计算机网络协议、接口和服务 1)协议: 2)接口: 3…...

网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件
目录 网心云 OEC/OECT 笔记(1) 拆机刷入Armbian固件网心云 OEC/OECT 笔记(2) 运行RKNN程序 外观 内部 PCB正面 PCB背面 PCB背面 RK3566 1Gbps PHY 配置 OEC 和 OECT(OEC-turbo) 都是基于瑞芯微 RK3566/RK3568 的网络盒子, 没有HDMI输入输出. 硬件上 OEC 和 OECT…...

【Web应用】若依框架:基础篇17二次开发-项目名称修改-新建业务模块
文章目录 ⭐前言⭐一、课程讲解⭐二、自己手动实操⭐总结 标题详情作者JosieBook头衔CSDN博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈(,NET/Java/Python/C)、数据库、操作系统、大数据、人工智能、工控、网络、…...
C获取unix操作系统的信息
在 C 语言中获取 Linux 操作系统的架构类型(如 x86_64)、系统位数(32/64位)、内核信息等,可以通过多种方式实现。下面是几种常见的方法: ✅ 方法一:使用 uname 获取系统信息 #include <stdio.h> #include <sys/utsname.h>int main(...

MQTT入门实战宝典:从零起步掌握物联网核心通信协议
MQTT入门实战宝典:从零起步掌握物联网核心通信协议 前言 物联网时代,万物互联已成为现实,而MQTT协议作为这个时代的"数据总线",正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…...

05【Linux经典命令】Linux 用户管理全面指南:从基础到高级操作
目录 前言 1 Linux用户管理基础概念 1.1 Linux用户类型 1.2 用户相关配置文件 1.3 UID与GID 2 用户创建与管理 2.1 创建用户 2.2 设置用户密码 3 用户权限管理 3.1 授予sudo权限 3.2 以其他用户身份执行命令 4 用户信息查询 4.1 查看用户基本信息 4.2 查看用户所…...
POP3、IMAP、SMTP:三大邮件协议核心差异与应用场景解析
## 一、协议概述与核心功能 电子邮件系统的运行依赖三大核心协议:**POP3**(Post Office Protocol 3)、**IMAP**(Internet Message Access Protocol)和**SMTP**(Simple Mail Transfer Protocol)…...
HarmonyOS5 仓颉入门:和 ArkTs 互操作
现在一般的场景是在已有 ArkTs 库中使用仓颉,所以可以将仓颉代码封装为 ArkTs 库,提供给外部使用。 原理就是互操作宏解析被注解修饰的仓颉代码,会自动生成 ArkTs 声明文件和互操作层代码。 使用步骤: 1.在 cj 文件中ÿ…...