使用 Visual Studio 2019 修改 WebRTC 源码
要使用 Visual Studio 2019 修改 WebRTC 源码,你可以按照以下步骤来完成编译、调试与修改流程。WebRTC 是一个使用 GN 和 Ninja 构建系统的大型 C++ 项目,整个流程略微复杂。下面是完整指南:
✅ 一、准备环境
1. 安装 Visual Studio 2019
安装以下组件:
-
Desktop development with C++
-
C++ CMake tools(可选)
-
Windows 10 SDK(版本 >= 10.0.18362)
2. 安装 Git 和 Python
-
Git: Git
-
Python 3.8+(推荐使用 64 位)
3. 安装 Chromium 的 depot_tools(WebRTC 使用它管理代码)
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
然后将 depot_tools
目录添加到系统环境变量 PATH
中。
✅ 二、获取 WebRTC 源码
1. 创建工作目录并获取源码
mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
cd src
第一次运行
fetch
会花较长时间下载依赖。
2. 同步依赖项
gclient sync
✅ 三、配置构建参数(适配 VS2019)
gn gen out/Default --ide=vs2019
你可以修改默认的构建参数:
gn args out/Default
示例参数(args.gn
文件内容):
is_debug = true
target_os = "win"
target_cpu = "x64"
is_clang = false
use_rtti = true
is_clang = false
表示使用 VS2019 的 MSVC 编译器。
args.gn
文件不是默认就存在的,而是在你运行以下命令时手动创建或编辑的 。
可以在命令行直接设置构建参数,而不写 args.gn
文件,这是 GN 官方支持的做法。语法:
gn gen out/目录 --args='参数1=值1 参数2=值2 ...'
例如:
gn gen out/Win --args='is_debug=true target_os="win" target_cpu="x64" is_clang=false'
核心常用构建参数(通用)
参数 | 含义 |
---|---|
is_debug | 是否构建为 Debug 模式(默认 true ) |
target_os | 目标操作系统,如 "win" , "android" , "ios" , "linux" , "mac" |
target_cpu | 目标 CPU 架构,如 "x64" , "x86" , "arm" , "arm64" |
is_clang | 是否使用 Clang 编译器(Windows 默认 true ,可设为 false 用 MSVC) |
use_lld | 是否使用 LLVM 的 LLD 链接器(适用于 Clang) |
symbol_level | 符号信息级别(0 = 无调试符号,1 = 减少信息,2 = 完整) |
use_rtti | 是否启用 C++ RTTI(Run-Time Type Info),默认 false |
use_custom_libcxx | 是否使用自定义 libc++,默认 true (如你用系统 libc++ 可设为 false ) |
WebRTC 项目专有参数
参数 | 含义 |
---|---|
rtc_include_tests | 是否编译测试代码(如 unit tests),默认 true |
rtc_build_tools | 是否构建 WebRTC 工具程序(如 peerconnection_server ) |
rtc_use_h264 | 是否启用 H.264 支持(通常用于 Android/iOS) |
rtc_build_examples | 是否构建官方示例程序(如 peerconnection_client ) |
rtc_enable_protobuf | 启用 protobuf 支持(部分功能依赖) |
rtc_enable_android_aar | 构建为 Android AAR 包(仅 Android) |
rtc_include_ilbc | 是否包含 iLBC 编解码器 |
rtc_include_opus | 是否包含 Opus 编解码器 |
rtc_include_internal_audio_device | 是否使用内置音频采集模块 |
rtc_use_x11 | 是否启用 X11(Linux) |
rtc_enable_sctp | 启用数据通道用的 SCTP 支持 |
rtc_enable_peer_connection | 启用 PeerConnection 模块(大部分人都要设为 true ) |
rtc_enable_video | 启用视频模块 |
rtc_enable_audio | 启用音频模块 |
iOS/Android 专用参数
iOS:
参数 | 含义 |
---|---|
ios_enable_code_signing | 是否启用代码签名(默认 true ,CI 构建时应设为 false ) |
enable_ios_bitcode | 启用 Bitcode |
ios_deployment_target | 最低支持版本(如 "12.0" ) |
Android:
参数 | 含义 |
---|---|
android_ndk_root | 指定 Android NDK 路径 |
android_sdk_root | 指定 Android SDK 路径 |
android_deploy_target | 最低 Android API 版本 |
rtc_enable_android_aar | 构建成 .aar 文件 |
use_jdk_jar | 使用本地 JDK 的 jar 工具 |
查看所有可用参数
如果你想列出当前项目支持的全部 GN 参数,可以在 src
目录下运行:
gn args out/Default --list
你会看到所有参数及默认值、注释说明。
✅ 四、用 Visual Studio 2019 打开项目
运行完 gn gen
后,会生成 all.sln
解决方案文件:
out\Default\all.sln
你可以直接用 VS2019 打开它,进行源码浏览、修改和调试。
✅ 五、构建和运行
WebRTC 使用 Ninja 构建系统。你不能直接用 Visual Studio 编译,需要用命令行构建:
ninja -C out/Default
但你可以:
-
用 VS2019 编辑代码
-
设置断点,调试
test
或你自己的main()
程序 -
用
ninja
编译后,用 VS2019 调试编译好的.exe
多平台构建流程(多构建目录)
你可以针对不同平台建立多个构建输出目录:
📦 Windows 编译目录:
gn gen out/Win --args='target_os="win" target_cpu="x64" is_clang=false'
📦 Android 编译目录:
gn gen out/Android --args='target_os="android" target_cpu="arm64" is_debug=false'
(前提是你已经安装 Android NDK,并设置环境变量)
📦 iOS 编译目录(macOS 上):
gn gen out/iOS --args='target_os="ios" target_cpu="arm64" ios_enable_code_signing=false'
编译命令示例
ninja -C out/Win ninja -C out/Android ninja -C out/iOS
注意事项
平台 | 额外要求 |
---|---|
Android | 需要安装 Android NDK、配置 JAVA_HOME、ANDROID_HOME |
iOS | 只能在 macOS 上编译,需安装 Xcode 和 iOS SDK |
Windows | 可用 MSVC 或 Clang 编译,但 MSVC 支持更好 |
✅ 六、修改源码的建议
WebRTC 的源码结构很复杂,修改前建议你:
-
找入口:如
api/peer_connection/
,modules/video_coding/
,p2p/
,media/
-
查找调用路径:可用
CTRL+T
或右键 -> 查找所有引用
-
添加调试输出:推荐使用
RTC_LOG(LS_INFO) << "Log message";
例如:
#include "rtc_base/logging.h"
RTC_LOG(LS_INFO) << "My custom log";
日志默认输出到标准输出,也可以配置到文件。
✅ 七、参考工具
-
Ninja 官网
-
GN 官网
-
WebRTC Git 仓库
-
WebRTC 编译 Wiki:https://webrtc.googlesource.com/src/+/refs/heads/main/docs/native-code/development/
✅修改与更新合并
推荐方式 —— Git 分支管理
-
在 WebRTC 主仓库目录(通常是
src/
)中切换到新分支:cd src/ git checkout -b my_feature_branch
-
修改你想改的文件,比如:
vim modules/audio_processing/echo_cancellation.cc
-
提交你的修改:
git add . git commit -m "My custom changes"
-
当官方更新发布后,更新 remote 并合并:
git fetch origin git rebase origin/main
或者如果你不想用 rebase,可以:
git merge origin/main
-
如果有冲突,Git 会提示你解决冲突。解决后继续 rebase 或 commit。
这样你可以保持你本地的修改,并轻松合并上游更新。