当前位置: 首页 > 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.jsqmd.com/news/1010400/

相关文章:

  • UKF、EKF、PF怎么选?一张图看懂非线性滤波器的选型指南与避坑要点
  • 别再死记硬背对比学习论文了!从InstDisc到DINO,我用一张图帮你理清发展脉络
  • 从手机拆解看制造:一文读懂HDI板用的RCC、LDP这些材料到底有啥区别
  • 如何选择北京老房改造装修公司?2026年6月推荐TOP5评测格局重塑空间特点市场份额 - 品牌推荐
  • 基于西门子S71500的市政污水处理PLC控制系统设计131(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • Visual C++ Redistributable AIO:Windows程序兼容性问题的终极解决方案
  • 基于西门子S71500的市政污水处理PLC控制系统设计132(设计源文件+万字报告+讲解)(支持资料、图片参考_降重降ai)
  • Epclusa吉三代每日治丙肝全基因型,头痛疲乏常见,严重肾损禁用
  • 2026年Q2成都管理咨询公司评测:聚焦重庆企业需求的品牌对比 - 优质品牌商家
  • 2026年6月北京老房改造装修公司推荐:TOP5排名专业评测旧房翻新防踩坑价格 - 品牌推荐
  • Python的UnitTest接口自动化实战(三)
  • 移动端人脸分割实战:从BiSeNet到Adobe最新模型,如何为你的App选型与优化?
  • 使用ChartJS实现堆叠柱状图
  • HarmonyOS PC 应用 Flex alignContent 详解——多行内容的整体分布控制
  • DJI A3飞控安装避坑指南:GPS干扰、震动与散热,这些细节决定飞行安全
  • 告别寄存器操作:用瑞萨RA FSP库驱动外设,5分钟搞定一个SPI通信
  • 用Java解决‘动物园栅栏’排队问题:从算法小白到AC的保姆级思路拆解
  • 大件物流跨省哪个便宜?大件跨省物流怎么寄最省钱?2026对比测评 - 快递物流资讯
  • 如何在Windows上快速完成Switch注入:TegraRcmGUI完整指南
  • 三步掌握微信小程序逆向工程:从小白到高手的完整指南
  • 2026年6月金属复合板厂家综合实力深度评测与权威排行榜:专业坐标与理性选择指南 - 品牌推荐
  • 终极指南:如何用XUnity.AutoTranslator轻松玩转外文Unity游戏
  • 跨架构虚拟化集成:在Apple Silicon Mac上部署Xilinx Vivado的架构解析与性能优化
  • 从iPhone主板到5G基站:拆解HDI技术如何‘瘦身’又‘增能’,聊聊那些不为人知的材料战争(PP vs RCC vs LCP)
  • 别再傻傻分不清!ArcGIS里擦除、裁剪、相交到底啥区别?一张图给你讲明白
  • 磁编码器选型笔记:为什么我为我的项目选择了昆泰芯KTH7823的PWM输出方案?
  • YashanDB的“双模兼容”开关怎么玩?深度解析Oracle与MySQL兼容模式切换
  • 2026 年贵阳全屋定制品牌综合实力深度评测与权威排行榜:专业坐标与理性选择指南 - 品牌推荐
  • 2026年6月金属复合板厂家推荐:从建筑幕墙到高端装饰,选对厂家让工程品质与效率双赢 - 品牌推荐
  • 2022年MLOps爆发的本质:从模型训练到系统稳定性的工程跃迁