WebRTC中的几个Rtp*Sender

news2025/6/6 12:43:36

一、问题:

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

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

在这里插入图片描述

  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.coloradmin.cn/o/2401664.html

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

相关文章

代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结

150. 逆波兰表达式求值--后缀表达式 力扣题目链接(opens new window) 根据 逆波兰表示法&#xff0c;求表达式的值。 有效的运算符包括 , - , * , / 。每个运算对象可以是整数&#xff0c;也可以是另一个逆波兰表达式。 说明&#xff1a; 整数除法只保留整数部分。 给…

IDEA202403 设置主题和护眼色

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

无人机螺旋桨平衡方法详解

螺旋桨平衡对于优化无人机性能、可靠性和使用寿命至关重要。不平衡的螺旋桨会产生过度振动&#xff0c;导致推力效率降低、噪音增大&#xff0c;并加速轴承和传感器的磨损。 螺旋桨平衡可通过三种方式实现&#xff1a;静态平衡、动态平衡和气动平衡。 静态与动态平衡是通过在…

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

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

Flask-Babel 使用示例

下面创建一个简单的 Flask-Babel 示例&#xff0c;展示如何在 Flask 应用中实现国际化和本地化功能。这个示例将包括多语言支持&#xff08;中文和英文&#xff09;、语言切换功能以及翻译文本的使用。 项目结构 我们将创建以下文件结构&#xff1a; 1. 首先&#xff0c;创…

国标GB28181视频平台EasyGBS视频实时监控系统打造换热站全景可视化管理方案

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

docker生命周期

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

鸿蒙缺少WMIC missing WMIC

在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报&#xff1a;missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案&#xff1a…

Spring Boot 使用 SLF4J 实现控制台输出与分类日志文件管理

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

linux_centos7.x的ifconfig命令显示内容详解

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

CentOS 7 如何pip3安装pyaudio?

CentOS 7 如何pip3安装pyaudio&#xff1f; # 先将yum软件源改为阿里云镜像源 http://mirrors.aliyun.com/centos-vault/7.9.2009/ bash <(curl -sSL https://linuxmirrors.cn/main.sh) # 基于一键换源脚本&#xff0c;全部回车即可# pip3安装模块是从源码构建&#xff08;…

【个人笔记】数据库原理(西电)

第一章 ER图和关系分解见课本p69 ER图是常用的 概念模型 方形&#xff1a;实体圆形&#xff1a;属性菱形&#xff1a;关系 常用的逻辑模型 说白了&#xff1a;增删改查 几种数据模型的基本概念 层次模型&#xff1a;树状结构【只能处理一对多的关系&#xff0c;只有沿着从根…

嵌入式学习之系统编程(十)网络编程之TCP传输控制协议

目录 一、网络模型 1、服务器/客户端模型 2、C/S与B/S区别 3、P2P模型 二、TCP&#xff08;传输控制协议&#xff09; &#xff08;一&#xff09;TCP概述 &#xff08;二&#xff09;TCP的特征&#xff08;面问高频问题&#xff09; 1、有链接 三次握手&#xff1a;建…

【react+antd+vite】优雅的引入svg和阿里巴巴图标

1.安装相关包 由于是vite项目&#xff0c;要安装插件来帮助svg文件引入进来&#xff0c;否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

3D动画在微信小程序的实现方法

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

计算机网络 | 1.2 计算机网络体系结构与参考模型

计算机网络体系结构与参考模型 目录 计算机网络体系结构与参考模型 【思维导图】 1、计算机的分层结构 1、为什么要分层&#xff1f; 2、什么是计算机网络体系结构 2、计算机网络协议、接口和服务 1&#xff09;协议&#xff1a; 2&#xff09;接口&#xff1a; 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博客专家资格、阿里云社区专家博主、软件设计工程师博客内容开源、框架、软件工程、全栈&#xff08;,NET/Java/Python/C&#xff09;、数据库、操作系统、大数据、人工智能、工控、网络、…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开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 查看用户所…