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 “怎么发、发给谁”是分开的。

六、大致的发包流程(类关系图)

flowchart TDsubgraph 上层编码器A[视频帧] -->|EncodedImage| B(RtpVideoSender/RtpSenderVideo)endB -->|帧分包、添加RTP头| C[RtpPacketToSend 1]B -->|帧分包、添加RTP头| D[RtpPacketToSend 2]B -->|帧分包、添加RTP头| E[RtpPacketToSend ...]C -->|SendPacket| F(RTPSender)D -->|SendPacket| FE -->|SendPacket| FF -->|网络调度| G(PacingController)G -->|网络发送| H[网络socket]
  1. RtpVideoSender 接到一帧视频数据
  2. 封装成多个 RTP 包,每个包一份负载、RTP头,用 RtpPacketToSend 保存
  3. RtpPacketToSend 包含所有要发的包的元信息(如capture时间、包类型、关键帧等)
  4. RTPSender 接收这些包,安排好序列号、头部、retransmit、NACK 等发送相关管理
  5. RTPSender 完成最终“投递到UDP”的行为

七、举个栗子:

比如:发送一帧视频流的发送链条

  1. 编码器输出了一帧 H264/VP8 数据
  2. RtpVideoSender::SendVideo() 被调用
    • 将一帧切分成n个RTP包(因为包不能太大)
    • 循环产生 RtpPacketToSend 对象
      • 填写每个包的payload
      • 设置元数据(是否关键帧,是否第一包,时间戳等)
  3. 每个RtpPacketToSend喂给RTPSender::Send()
    • 内部会进一步设置序列号、ssrc、加扩展头等
    • 记录NACK/FEC/retransmission等重发需要的信息
    • 通过socket等底层去发包到RTP peer
  4. 网络ISend接口:最终出去

八、总结联系与区别

类/模块作用关注点
RtpPacketToSend表示“即将要发出去的一个RTP包”+元数据单个包内容、附加定时/扩展/关键帧信息
RTPSenderRTP发送行为管理,包头生成+包投递(基础)通用RTP包发送,序列号分配、socket发包等
RtpSenderVideo/Video视频专用的RTP发送(多帧分包、关键帧判断等)视频帧处理,分包,关键帧加标,带有额外定时/统计

关系:

  • RtpPacketToSend是包容器,RtpSenderVideo/RtpVideoSender生成它们,交由RTPSender发送!
  • RtpSenderVideo/RtpVideoSender是“分发器/工厂”,RTPSender是“投递员”

九、一句话定性:

  • RtpPacketToSend = 发包元信息封装器
  • RtpSenderVideo(或RtpVideoSender)= 视频分包器,专门为视频准备、生成RtpPacketToSend,喂给RTPSender
  • RTPSender = 真正的RTP通道发送器,管理和输出RTP包,连接到底层socket。

用一句话总结发送流程:

“视频帧被切割为多个RtpPacketToSend,经由RtpVideoSender预处理后交由RTPSender完成最终的网络发送。”

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

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

相关文章

EFI(x64)简易开发环境

文章目录 1 必须文件2 运行环境3 构建应用 (Visual Studio)4 引用 EDK2 头文件 1 必须文件 EDK2: 可以只拉取仓库本身, 不拉取其子仓库(完整构建才需要) qemu: qemu 以源码发布, QEMU for Windows – Installers (64 bit) 这里有民间构建的安装包 2 运行环境 创建一个 root …

八皇后问题深度解析

八皇后问题深度解析 一、八皇后问题的起源与背景1.1 问题起源1.2 历史发展 二、问题描述与约束条件2.1 问题描述2.2 约束条件 三、算法原理&#xff1a;回溯算法3.1 回溯算法概述3.2 八皇后问题的回溯算法实现思路 四、八皇后问题的多语言实现4.1 Python实现4.2 C实现4.3 Java实…

Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束前言项目简介技术栈…

Java中的阻塞队列

阻塞队列是什么&#xff1f; 一、阻塞队列的核心概念与特性 1.1 阻塞队列是什么&#xff1f; 简单来说&#xff0c;阻塞队列是一种特殊的队列&#xff0c;它具备普通队列先进先出&#xff08;FIFO&#xff09;的特性&#xff0c;同时还支持两个额外的重要操作&#xff1a; 当…

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网&#xff1a; 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源&#xff1a; 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…

Java-IO流之转换流详解

Java-IO流之转换流详解 一、转换流概述1.1 什么是转换流1.2 转换流的作用1.3 转换流的位置 二、InputStreamReader详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例&#xff1a;读取不同编码的文件 三、OutputStreamWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使…

android lifeCycleOwner生命周期

一 Fragment中 viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) 什么时候执行&#xff1f; 让我分析一下相关问题&#xff1a; 关于 onPause 时的数据更新: viewLifecycleOwner.lifecycleScope.launch {viewLifecycleOwner.repeatOnLifecycle(Lifecycle.Sta…

Liunx进程替换

文章目录 1.进程替换2.替换过程3.替换函数exec3.1命名解释 4.细说6个exe函数execl函数execvexeclp、execvpexecle、execve 1.进程替换 fork&#xff08;&#xff09;函数在创建子进程后&#xff0c;子进程如果想要执行一个新的程序&#xff0c;就可以使用进程的程序替换来完成…

【华为云Astro-服务编排】服务编排中图元的使用与配置

目录 子服务编排图元 子服务编排图元的作用 如何使用子服务编排图元 脚本图元 脚本图元的作用 如何使用脚本图元 记录创建图元 记录创建图元的作用 如何使用记录创建图元 记录删除图元 记录删除图元的作用 如何使用记录删除图元 记录查询图元 记录查询图元的作用…

SQL Server相关的sql语句

目录 一、数据定义语言&#xff08;DDL&#xff09;1. 创建数据库2. 修改数据库3. 删除数据库4. 创建表5. 修改表结构6. 删除表 二、数据操作语言&#xff08;DML&#xff09;1. 插入数据2. 更新数据3. 删除数据 三、数据查询语言&#xff08;DQL&#xff09;1. 基础查询2. 去重…

【Hot 100】55. 跳跃游戏

目录 引言跳跃游戏我的解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】55. 跳跃游戏❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 跳跃游戏 &#x…

基于51单片机的车内防窒息检测报警系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能&#xff1a; &#xff08;1&#xff09;检测车内温度及二氧化碳浓度并用lcd1602实时显示。 &#xff08;2&#xff09;当人体红外传感器检测到车内有人&#xff0c;且温度或二氧化碳浓度…

关于智能体API参考接口

关于智能体在Flask的源码&#xff1a;请求体(在payload里的是请求体)、请求头&#xff08;在headers里的i局势请求头&#xff09;。 我的例子&#xff1a; 我的疑问&#xff1a;为什么没按Coze官方API文档格式&#xff0c;在Apifox里发POST请求却能收到回复&#xff1f; 1. 你…

Excel 批量下载PDF、批量下载考勤图片——仙盟创梦IDE

在办公场景中&#xff0c;借助应用软件实现 Excel 批量处理考勤图片、电子文档与 PDF&#xff0c;具有诸多显著优势。 从考勤图片处理来看&#xff0c;通过 Excel 批量操作&#xff0c;能快速提取图片中的考勤信息&#xff0c;如员工打卡时间、面部识别数据等&#xff0c;节省…

Apache Doris + MCP:Agent 时代的实时数据分析底座

一、Apache Doris&#xff1a;面向 Agent 时代的智能数据平台 当我们谈论 2025 年时&#xff0c;业界普遍认为这将是"Agent 革命年"&#xff08;Agentic Revolution&#xff09;的开端。与传统的人机交互模式不同&#xff0c;AI Agent 作为一个全新的"用户角色…

能不能用string接收数据库的datetime类型字段

在Java中使用String类型通过MyBatis接收MySQL的datetime类型字段时&#xff0c;​可以正常工作&#xff0c;但需注意格式和潜在问题。以下是关键点&#xff1a; 1. ​直接转换是可行的​ MySQL的datetime字段&#xff08;如 2023-10-05 12:34:56&#xff09;会被MyBatis自动转…

【Python训练营打卡】day44 @浙大疏锦行

DAY 44 预训练模型 知识点回顾&#xff1a; 1. 预训练的概念 2. 常见的分类预训练模型 3. 图像预训练模型的发展史 4. 预训练的策略 5. 预训练代码实战&#xff1a;resnet18 作业&#xff1a; 1. 尝试在cifar10对比如下其他的预训练模型&#xff0c;观察差异&#xff0c;…

MySQL中关于事务和锁的常见执行命令整理包括版本区别

MySQL中关于事务和锁的常见执行命令实例整理&#xff0c;并标注了不同版本下的区别&#xff08;如MySQL 8.0与旧版本的差异&#xff09;&#xff1a; 一、事务相关命令 1. 事务控制 命令描述版本差异START TRANSACTION; 或 BEGIN;显式开启事务通用语法&#xff0c;无版本差异…

PyTorch-Transforms的使用(二)

对图像进行处理 安装open cv ctrlP 看用法 ToTensor的使用 常见的Transforms 归一化的图片 两个长度为三的数组&#xff0c;分别表示三个通道的平均值和标准差 Resize&#xff08;&#xff09; Compose&#xff08;&#xff09; 合并执行功能&#xff0c;输入进去一个列表&a…

vscode实用配置

前端开发安装插件&#xff1a; 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤&#xff1a;在html文件下右键点击 open with live server 即可 刷力扣&#xff1a; 安装这个插件 还需要安装node.js即可