NXP

Ubuntu 下编译 WebRTC

2019-07-12 11:40发布

-- Ubuntu 下编译 WebRTC

Ubuntu 下编译 WebRTC

一、Ubuntu 系统环境准备

1、安装双系统 Windows 10 / Ubuntu 16.04

最近几年一直在使用 ThinkPad 笔记本(自己之前自己买的 ThinkPad X230),现在公司给配的 ThinkPad X1,已经好久不安装双系统了(Windows & Ubuntu,一直以 VMware 虚拟机代替),目前根据公司任务,有时需要从事 Windows 开发,有时也要从事 Android 底层 native 的开发,同事们都是使用 MAC 进行 Android 进行开发,唯独我自己使用 Windows 系统,经常出现协同开发时遇到一些系统级的坑,如 Android.mk 文件中源码文件路径过长, 编译脚本下载到 Windows 下自动转换为 Windows 格式,导致脚本不能执行,git 过滤文件格式 .ignore 不生效等问题;让我慢慢下定决心转到 Ubuntu 下进行发开发 Android。最近公司决定基于 webrtc 进行二次开发,为了方便快速的将 webrtc 源码进行下载和编译,决定首先在 Ubuntu 下进行编译。
公司配的 X1 磁盘空间剩余不多,决定使用 X230 分配出200个 G 进行安装 Windows 10 / Ubuntu 双系统,安装过程中也遇到了一些新的问题(主要是由于 X230 双磁盘,固态硬盘 & 机械硬盘,安装成功后总是不能引导 Ubuntu 启动),最终搞了将近 3 个小时才搞明白,其实安装很简单,步骤如下: a、Windows 下使用 UltraISO 刻录 Ubuntu 系统镜像 ubuntu 建议下载 64bit 的,目前电脑内存都是大于 4G 的,如果装了 32 bit,那么大的内存就太浪费了; b、安装 Ubuntu 时 系统引导盘选择整个的 机械硬盘,即 Ubuntu 系统安装所在磁盘 本人 Windows 10 安装在了 SSD 固态硬盘上,而 Ubuntu 安装在了 500G 的机械硬盘上,如果需要启动 Ubuntu 系统,需要在电脑启动时,按 F12 选择系统引导磁盘,默认还是固态硬盘,如要启动 Ubuntu,就选择机械硬盘,既可(也可以在 bois 表中,配置 BOOT 启动项顺序,调整此次启动磁盘)。 c、准备 Ubuntu 的环境
  • 搞定 VPN,可翻墙快速访问 Google 服务器(搞不定,就结束吧)
  • 安装 gcc、g++
  • 安装 git
  • 安装完整版的 vim,Ubuntu 默认是阉割版的 VI ,安装完成后,执行 alias vi=vim
  • 安装 ssh (可选,方便远程连接,如果不想不断的操作两个电脑的话)
  • 安装 nethogs,可用于按照进行查看网络流量信息(可选)
  • 安装 iptraf,可用于按照 连接/端口查看网络流量信息(用起来相对 nethogs 复杂些,可选)
  • 最好安装中文输入法(系统使用 English,但如果打算长期使用 Ubuntu 开发的话,中文输入法还是必不可少的。
以上选项网上搜索均可搞定;

二、下载 WebRTC 源码及依赖工具

1、下载 depot_tools 并配置

Google 使用 depot_tools 工具(脚本组合)进行代码的同步、下载管理等,这个脚本包中包含了 gclient、gcl、git-cl,repo 等; 在 Linux 下需首先确认 git 和 Python 已经安装,并且 git version >= 2.2.1, Python version = 2.7(版本过高会报错);
选择一个目录,如 ~/OpenSource 通过 git 获取 depot_tools ,执行如下命令既可: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 最后将 depot_tools 目录添加到环境变量 PATH 中,建议添加到 ~/.bashrc 中,或者 /etc/profile 文件中,可以一劳永逸,打开以上中的任意一个文件,如 sudo vi ~/.bashrc 在最后添加一行: export PATH=~/OpenSource/depot_tools:"$PATH" 执行命令,使环境变量生效: source ~/.bashrc 可通过 echo $PATH 确认配置成功: /home/gobert/OpenSource/depot_tools:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin 执行以下命令,安装并配置 depot_tools 依赖: gclient sync 需要等待一段时间,具体看你的 VPN 网速如何了。

三、下载并编译 WebRTC

1、下载 WebRTC 源码

  • 选择一个下载目录,依次执行以下命令:
mkdir webrtc-checkout cd webrtc-checkout fetch --nohooks webrtc gclient sync 经过漫长的等待, webrtc 全部下载到本地的话,大约会占用 6.4 G 的磁盘空间;
  • 可选项:指定如何跟踪处理新的分支 git config branch.autosetupmerge always git config branch.autosetuprebase always git config branch.autosetupmerge always 表示 自动从远程分支合并提交到本地分支,如果不做此设置,你需要手动 merge; git config branch.autosetuprebase always 设置在执行 git pull 命令时做 rebase 而不是是 merge;可选的值还有 never:不自动 rebase, local 跟踪本地分支进行 rebase, remote 跟踪远程分支进行 rebase, always 所有跟踪的分支都自动进行 rebase; ​
  • 可选项:创建一个新的本地分支 cd src git checkout master git new-branch your-branch-name 建议创建下新的本地开发分支,如: git new-branch dev ​
  • 编译前更新下最新代码 git pull 注:如果在上一步中,没有创建新的分支,则使用 git fetch 命令代替,以获取最新代码。 ​
注:由于WebRTC 目前还在频繁的更新中,建议定期的去下载更新下编译工具链及其依赖,通过执行
gclient sync 既可!

2、编译

WebRTC 目前使用 GN 来生成构建脚本,Ninja 进行构建,所以系统平台均是。
  • 生成 Ninja 工程文件 Ninja 工程文件由 GN 生成,为其选择一个放置的目录中,如 out/Debug 或者 out/Release,这里官方建议选择 out/Default 这样可以放置 debug 和 release,在 src 目录下还行一下命令,默认生成 debug 版本的构建文件: gn gen out/Default 如果 提示 gn 命令 not found,需检查 depot_tools 环境变量设置是否生效。 执行以下命令生成 Ninja 工程文件 gn gen out/Default 如果需要生成 release 工程文件,需在后面加上关闭 debug 的参数 --args=is_debug= false 如果需要清理 Ninja 工程文件,但保持 GN 环境配置不变的话,可以执行以下命令: gn clean out/Default
  • Ninja 编译 ninja -C out/Default 总共有 3600 多个文件需要一一编译,编译成功后,会在 out/Default 目录下生成大量的可执行测试程序: activity_metric g722_test neteq_opus_quality_test rtc_event_log2rtp_dump toolchain.ninja args.gn gen neteq_pcmu_quality_test rtc_media_unittests tools_unittests audio_codec_speed_tests genmacro neteq_rtpplay rtc_pc_unittests transient_suppression_test audio_decoder_unittests genmodule neteq_speed_test rtc_stats_unittests turnserver audio_device_tests genperf nonlinear_beamformer_test rtc_unittests unpack_aecdump audioproc_f genstring obj rtp_analyze video_capture_tests build.ninja genversion ortc_unittests rtp_analyzer.py video_engine_tests build.ninja.d ilbc_test pb_parse.py rtp_analyzer.sh video_loopback bwe_simulations_tests insert_packet_with_timing peerconnection_client rtpcat voe_auto_test click_annotate isac_api_test peerconnection_server RTPchange voice_engine_unittests common_audio_unittests isac_fix_test peerconnection_unittests RTPencode webrtc_nonparallel_tests common_video_unittests isac_switch_samprate_test plot_videoprocessor_integrationtest RTPjitter webrtc_opus_fec_test conversational_speech_generator isac_test protoc RTPtimeshift webrtc_perf_tests delay_test low_bandwidth_audio_test psnr_ssim_analyzer screenshare_loopback webrtc_tests event_log_visualizer misc.py pyproto stun_prober yasm force_mic_volume_max modules_tests py_quality_assessment stunserver frame_analyzer modules_unittests re2c system_wrappers_unittests frame_editor neteq_ilbc_quality_test relayserver test_packet_masks_metrics g711_test neteq_isac_quality_test rgba_to_i420_converter test_support_unittests

四、问题记录

1、gn: command not found 或者 gclient command not found 是因为 depot_tools 环境变量配置有误,没有正确找到 depot_tools 目录下的 gn 或 gclient 工具,确认 ~/.bashrc 文件配置是否正确:

export PATH=~/OpenSource/depot_tools:"$PATH"

2、执行 gn gen out/Default 命令报错:

gn.py: Could not find gn executable at: XXX/gn 需要执行命令: gclient runhooks 需要耐心等待一段时间,由其自动下载安装一些工具包,完成后,再次执行 gn gen out/Default 命令,提示成功: Done. Made 467 targets from 126 files in 383ms