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
繁體地址,請注明出處:http://hk.pswp.cn/news/908255.shtml
英文地址,請注明出處:http://en.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即可