当前位置: 首页 > news >正文

webrtc源码解析概要介绍

一,整体架构设计

WebRTC 采用分层模块化 + 流水线 + 多线程设计,核心分为 5 大层级,从上到下:

  1. API 层:对外暴露接口(C++/Java/ObjC),供业务层调用,屏蔽底层复杂逻辑
  2. 媒体引擎层:音视频采集、渲染、编解码、预处理
  3. 网络传输层:网络收发、协议封装、拥塞控制、QoS、ICE/NAT 穿透
  4. 会话管理层:SDP 协商、信令交互、PeerConnection 会话管理
  5. 基础公共层:线程、内存、日志、定时器、工具库、跨平台适配

核心设计特点

  • 多线程模型:采集、编码、网络、渲染、业务逻辑线程隔离,避免阻塞
  • 数据流水线:音视频帧以Frame对象流转,逐级处理(采集→预处理→编码→打包→发送)
  • 异步回调:大量使用观察者模式、信号槽,事件驱动
  • 跨平台抽象:平台相关逻辑抽离为rtc_base+ 各平台适配层

二、源码目录主要结构

2.1 顶层核心目录

webrtc/ ├── api/ # 【对外API入口】二次开发用 包含音频、视频neteq,网络控制等对外接口 ├── audio/ # 音频全链路:采集、AEC、AGC、NS、混音、编码 ├── video/ # 视频全链路:采集、滤镜、缩放、编码、渲染 ├── media/ # 媒体会话管理,音视频轨道统一调度 ├── pc/ # 【PeerConnection 核心】会话、SDP、ICE、Track、RTP 会话管理 ├── modules/ # 核心功能组件集合,所有音视频采集、编解码、前后处理、网络协议、拥塞控├── 制、抖动缓冲等业务功能模块都集中在此,是整个媒体引擎的核心实现层。 ├── rtc_base/ # 【基础库】线程、锁、网络、内存、定时器、字符串、跨平台等工具 ├── rtc_tools # 独立工具集 / 调试工具目录,不属于核心业务库,而是给开发者 / 测试人员 ├── 用的命令行工具、音视频分析、网络诊断、数据转储与回放工具 ├── call/ # 数据流调度中心,承上启下:对接上层 PeerConnection、下层媒体引擎 + 网├── 络传输,统一管理一路完整通话链路的流、码率、拥塞控制、RTP/RTCP 收发 ├── p2p/ # P2P 核心:ICE、STUN、TURN、NAT 穿透、候选地址 ├── common_audio/ # 提供底层音频数据处理、数学运算、采样转换、波形操作、滤波等功能 ├── common_video # 视频相关工具库,如YUV数据转化,视频帧数据处理,h264数据处理等功能 ├── sdk/ # 各平台 SDK 封装(Android/iOS/Windows 上层封装) ├── system_wrappers/ # 系统接口封装:摄像头、麦克风、文件、时钟 ├── third_party/ # 第三方依赖:libvpx、opus、ffmpeg、ssl、protobuf 等 └── tools/ # 编译脚本、测试工具、demo

2.2 主要目录核心功能介绍

2.2.1 API (主要对模块进行二次开发)

webrtc提供的对外二次开发库,包含有7,

1. audio- 音频相关的有各种音频编码格式(如g711、ilbc/ops等)、音频帧,音频混音器、回音控制,回音探测和回声消除等对外接口库;

2. video-视频内置视频编解码、流解析、帧编码、图像编码、视频帧和视频流编解码等对外接口库;

3. transport- 数据传输相关的, 音频接口、视频接口、流媒体接口、码率设置、GCC、网络控制等对外接口;

4. crypto- 加解密接口, 帧的加密解密库,加解密库和参数设置库;

5.neteq - 针对neteq的对外库,以及neteq控制对外库和控制工厂库;

6.rtp- rtp头、rtp包信息、rtp参数等库

7. 其它各种对外库, 如下图,

2.2.2 PC(直接可以进行音视频会话开发)

如果想快速实现视频会话功能,可以直接使用该模块,实现音频会话,视频会话。

WebRTC 业务逻辑核心中枢,连接信令、媒体、网络。PeerConnection核心。

融合了 音频rtp接收器、音频轨道控制,声道控制管理以及数据的组成和传输,同样也支持视频RTP接收器,rtp轨道控制,以及视频的sdp和会话描述控制, 另外也包含sctp和srtp等相关协议模块。

2.2.3 rtc_base

该模块融合了很多基础公共功能,如内存控制、数学计算,字符串管理,锁控制、系统文件线程的等的封装、任务管理、base64,sigslot、时间戳、crc32,回调等基础模块。

大家可以学习Google对于基础公共模块的封装,好的可以借鉴。

2.2.4 modules

webrtc最核心的组件库,涉及整个音视频流程相关底层的模块,只做 “采集→处理→编解码→RTP→拥塞控制” 相关的底层功能,该目录包含有

1,音频

audio_coding :

包括基础音频格式的编解码,还包括音频接收解码和编码发生的核心模块ACM2,音频网络控制适配模块,以及neteq控制模块

audio_device: 音频设备管理(麦克风和扬声器)

audio_mixer:音频混音

audio_processing:音频处理流程,具体可以参考我的文章webrtc 的audio process介绍(新版本webrtc)_webrtc-audio-processing-CSDN博客

2,网络

拥塞控制: 主要为GCC,具体可以参考我的文章:webrtc 拥塞控制GCC 和PCC -CSDN博客

包平滑控制: 主要用于控制包的发生时序,参考我的文章:webrtc pacing 平滑发包模块-CSDN博客

对端比特率评估: 可以参考我的文章:webrtc QOS-RemoteBitrateEstimator接收端带宽估计(1)-CSDN博客 和

webrtc QOS-RemoteBitrateEstimator接收端带宽估计-四个实例(2)-CSDN博客

rtp_rtcp : RTP和RTCP包针对相关音视频 格式的管理,RTP/RTCP控制器的管理,也包括相关fec,nack等拥塞控制的管理。

3.视频

video_capture: 视频获取,视频设备的控制和获取视频流的管理;

video_coding:视频主流格式(VP8/9,AVC/H264)的管理,视频帧的管理,以及视频缓冲区管理等相关功能;

video_processing: 视频降噪处理模块。

2.2.5 media

该模块主要融合音频和视频, 构建了音频引擎和视频引擎,统一封装音视频能力、解耦上层会话与底层硬件 / 算法模块,对外提供标准媒体接口,内部调度采集、处理、编解码、渲染全链路。

具体可以参考我的文章:webrtc voice engine 介绍(新版webrtc)-CSDN博客 和WebRtcVideoEngine模块介绍(新版webrtc)-CSDN博客

三、webrt通话流程介绍

阶段 1:初始化 & 创建核心对象

  1. 业务层调用PeerConnectionFactory::Create()创建工厂
  2. 通过工厂创建PeerConnection,传入配置(ICE 服务器、编码参数)
  3. 本地创建MediaStreamAudioTrack/VideoTrack(音视频轨道)
  4. 将 Track 添加到 PeerConnection

对应源码入口pc/peer_connection_factory.ccpc/peer_connection.cc

阶段 2:本地媒体采集(生产者)

  1. 音频 / 视频设备启动采集(AudioDevice/VideoCapture
  2. 原始帧送入预处理模块(降噪、回声、缩放)
  3. 预处理后帧送入编码器(VP8/H264/Opus)
  4. 编码后裸码流交给RTP 模块打包为 RTP 包

链路设备采集 → 预处理 → 编码 → RTP 打包

阶段 3:SDP 协商(信令交互,上层信令仅转发,WebRTC 不内置信令)

  1. 发起端调用CreateOffer()生成本地 SDP
  2. 本地调用SetLocalDescription()保存本地会话描述
  3. 业务层通过自定义信令,把 Offer 发给远端
  4. 远端SetRemoteDescription(),调用CreateAnswer()生成应答
  5. 应答回传给发起端,双方完成 SDP 协商

核心文件pc/peer_connection.ccCreateOffer/CreateAnswer/SetLocalDescription

阶段 4:ICE 候选收集 & 链路连通(NAT 穿透)

  1. PeerConnection 启动 ICE 候选收集(本机内网 IP、端口、STUN 公网 IP、TURN 中继)
  2. 候选地址通过信令交换给对端
  3. ICE 算法遍历候选地址对,发送探测包,筛选最优链路
  4. 链路连通后,UDP 通道就绪

核心文件p2p/ice/p2p/base/port.cc

阶段 5:RTP 发送 & RTCP 控流

  1. RTP 数据包通过 ICE 建立的 UDP 链路发送
  2. 接收端解析 RTP,重组帧、送入抖动缓冲
  3. 解码 → 后处理 → 渲染播放
  4. 双方周期性收发 RTCP 包:统计丢包、延迟、抖动,触发拥塞控制(GCC),动态调整发送码率

阶段 6:通话结束

关闭 Track、停止采集、销毁 PeerConnection、释放线程与资源。

四、二次开发重点改造点

  • 自定义音视频采集 / 渲染(替换系统摄像头、录屏、外部流)
  • 音频算法调优:AEC/NS/AGC 参数修改
  • 拥塞控制改造:替换 GCC、自研控流算法
  • 扩展协议:自定义 RTP 扩展头、私有信令
  • 弱网优化:抖动缓冲、帧纠错、前向纠错 FEC、ARQ 重传
  • 软硬编切换、第三方编解码器接入
http://www.rkmt.cn/news/1522206.html

相关文章:

  • Visual C++ Redistributable AIO:Windows程序兼容性问题的终极解决方案
  • 基于西门子S71500的市政污水处理PLC控制系统设计132(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • Epclusa吉三代每日治丙肝全基因型,头痛疲乏常见,严重肾损禁用
  • 使用ChartJS实现堆叠柱状图
  • 2026年6月金属复合板厂家综合实力深度评测与权威排行榜:专业坐标与理性选择指南 - 品牌推荐
  • 大件物流跨省哪个便宜?大件跨省物流怎么寄最省钱?2026对比测评 - 快递物流资讯
  • 跨架构虚拟化集成:在Apple Silicon Mac上部署Xilinx Vivado的架构解析与性能优化
  • 别再傻傻分不清!ArcGIS里擦除、裁剪、相交到底啥区别?一张图给你讲明白
  • 2022年MLOps爆发的本质:从模型训练到系统稳定性的工程跃迁
  • 告别手忙脚乱!用Allegro脚本一键生成全套结构检视文件(DXF/EMP/EMN)
  • 如何高效使用T5-Base模型:开发者的终极实战指南
  • VideoDownloadHelper:3分钟掌握Chrome视频下载插件的核心技术
  • 别再手动发告警了!用Zabbix 6.0 + 企业微信机器人,5分钟搞定自动化通知(附脚本)
  • 仑伐替尼禁用于未控制的高血压,术前至少停药7天以降低出血风险
  • 如何用500元打造专业级双路无刷电机控制系统?灯哥开源ESP32 FOC驱动给你答案
  • Windows安卓应用安装器:告别笨重模拟器的终极解决方案
  • 除了USGS网页版,还有这3种方法批量获取Landsat数据:GEE脚本、API与下载管理器对比
  • 从无人机云台到电动工具:聊聊FOC中SVPWM的几种“发波”套路(七段式 vs 五段式DPWM)
  • FastAPI+ONNX模型服务化:从Notebook到生产环境的落地实践
  • 评价高的成都会计事务所品牌如何选:2026年行业趋势与机构能力分析 - 优质品牌商家
  • JVM底层源码深度解析:读写屏障(Read/Write Barrier)
  • 2026年英文降AI实战指南:5款工具与3大指令,论文AI率95%降至0% - 降AI实验室
  • RAG检索质量评测:用Ragas七维指标诊断系统可靠性
  • VSCode + PlatformIO玩转STM32F401:从Arduino点灯到多串口调试全攻略
  • 你的ES搜索不准?可能是IK分词器没调对:ik_max_word与ik_smart实战场景深度对比
  • 从游戏物理到推荐算法:点积、叉积、内积、外积在Python/Numpy中的实战应用
  • 从IGS官网到你的项目:最新天线相位中心改正文件(.atx)的获取、更新与版本管理全流程
  • SpringMVC 入门到实战 DispatcherServlet 源码解读 92-95
  • OSI-FL:联邦学习中的增量学习新范式解析
  • 微信数据解析技术演进:从技术探索到合规边界的思考