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 重传
  • 软硬编切换、第三方编解码器接入
相关推荐
换个昵称都难2 小时前
WebRTC 完整调用流程(前端纯 JS 实现,最简可运行)
webrtc
换个昵称都难21 小时前
webrtc 拥塞控制GCC 和PCC
webrtc
Cxiaomu1 天前
React接入WebRTC实时视频实践
react.js·音视频·webrtc
AndyHuang19761 天前
WebRTC 强制 Relay 模式下 TCP 重连失败深度排查与优化实战
webrtc
换个昵称都难1 天前
webrtc pacing 平滑发包模块
webrtc
换个昵称都难1 天前
webrtc 音频混音介绍
音视频·webrtc
换个昵称都难2 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计(1)
webrtc
换个昵称都难2 天前
webrtc QOS-RemoteBitrateEstimator接收端带宽估计-四个实例(2)
webrtc
都在酒里2 天前
【极致低延时】香橙派部署 MediaMTX 实现 WebRTC 推流,延时仅 500-800ms,比局域网 ffmpeg 拉流快近 10 倍!(附踩坑全记录)
linux·arm开发·ffmpeg·webrtc·orangepi·嵌入式软件