webrtc源码解析概要介绍

webrtc源码解析概要介绍 一整体架构设计WebRTC 采用分层模块化 流水线 多线程设计核心分为 5 大层级从上到下API 层对外暴露接口C/Java/ObjC供业务层调用屏蔽底层复杂逻辑媒体引擎层音视频采集、渲染、编解码、预处理网络传输层网络收发、协议封装、拥塞控制、QoS、ICE/NAT 穿透会话管理层SDP 协商、信令交互、PeerConnection 会话管理基础公共层线程、内存、日志、定时器、工具库、跨平台适配核心设计特点多线程模型采集、编码、网络、渲染、业务逻辑线程隔离避免阻塞数据流水线音视频帧以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/ # 编译脚本、测试工具、demo2.2 主要目录核心功能介绍2.2.1 API 主要对模块进行二次开发webrtc提供的对外二次开发库包含有71. 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该模块融合了很多基础公共功能如内存控制、数学计算字符串管理锁控制、系统文件线程的等的封装、任务管理、base64sigslot、时间戳、crc32回调等基础模块。大家可以学习Google对于基础公共模块的封装好的可以借鉴。2.2.4 moduleswebrtc最核心的组件库涉及整个音视频流程相关底层的模块只做 “采集→处理→编解码→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控制器的管理也包括相关fecnack等拥塞控制的管理。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初始化 创建核心对象业务层调用PeerConnectionFactory::Create()创建工厂通过工厂创建PeerConnection传入配置ICE 服务器、编码参数本地创建MediaStream、AudioTrack/VideoTrack音视频轨道将 Track 添加到 PeerConnection对应源码入口pc/peer_connection_factory.cc→pc/peer_connection.cc阶段 2本地媒体采集生产者音频 / 视频设备启动采集AudioDevice/VideoCapture原始帧送入预处理模块降噪、回声、缩放预处理后帧送入编码器VP8/H264/Opus编码后裸码流交给RTP 模块打包为 RTP 包链路设备采集 → 预处理 → 编码 → RTP 打包阶段 3SDP 协商信令交互上层信令仅转发WebRTC 不内置信令发起端调用CreateOffer()生成本地 SDP本地调用SetLocalDescription()保存本地会话描述业务层通过自定义信令把 Offer 发给远端远端SetRemoteDescription()调用CreateAnswer()生成应答应答回传给发起端双方完成 SDP 协商核心文件pc/peer_connection.cc中CreateOffer/CreateAnswer/SetLocalDescription阶段 4ICE 候选收集 链路连通NAT 穿透PeerConnection 启动 ICE 候选收集本机内网 IP、端口、STUN 公网 IP、TURN 中继候选地址通过信令交换给对端ICE 算法遍历候选地址对发送探测包筛选最优链路链路连通后UDP 通道就绪核心文件p2p/ice/、p2p/base/port.cc阶段 5RTP 发送 RTCP 控流RTP 数据包通过 ICE 建立的 UDP 链路发送接收端解析 RTP重组帧、送入抖动缓冲解码 → 后处理 → 渲染播放双方周期性收发 RTCP 包统计丢包、延迟、抖动触发拥塞控制GCC动态调整发送码率阶段 6通话结束关闭 Track、停止采集、销毁 PeerConnection、释放线程与资源。四、二次开发重点改造点自定义音视频采集 / 渲染替换系统摄像头、录屏、外部流音频算法调优AEC/NS/AGC 参数修改拥塞控制改造替换 GCC、自研控流算法扩展协议自定义 RTP 扩展头、私有信令弱网优化抖动缓冲、帧纠错、前向纠错 FEC、ARQ 重传软硬编切换、第三方编解码器接入