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参数等库

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

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 重传
  • 软硬编切换、第三方编解码器接入
相关推荐
换个昵称都难17 天前
webrtc peerconnection_server 模块介绍
运维·服务器·webrtc
EasyGBS17 天前
延迟直降90%!国标GB28181视频平台EasyGBS支持WebRTC WHIP推流设备接入,让万物互联更简单
音视频·webrtc
换个昵称都难18 天前
webrtc RtpRtcp模块化测试-MockRtpRtcp
webrtc
如意IT18 天前
指纹浏览器检测之BrowserScan的webrtc指纹检测和反检测
自动化·webrtc·chromium·浏览器开发
换个昵称都难18 天前
webrtc TURN 主要源码介绍
webrtc
换个昵称都难18 天前
webrtc RTC_P2P源码解析
asp.net·webrtc·p2p
换个昵称都难18 天前
webrtc StunServer源码介绍
webrtc
数据知道19 天前
指纹浏览器:DNS 泄漏防范与 WebRTC 本地 IP 屏蔽的底层实现
爬虫·网络协议·tcp/ip·安全·webrtc·数据采集·指纹浏览器
换个昵称都难20 天前
WebRTC 完整调用流程(前端纯 JS 实现,最简可运行)
webrtc