WebRTC源码研究(2)webrtc源码目录结构

6,157 阅读15分钟

WebRTC系列文章

  1. WebRTC源码研究(1)WebRTC架构
  2. WebRTC源码研究(2)webrtc源码目录结构
  3. WebRTC源码研究(3)webrtc运行机制
  4. WebRTC源码研究(4)web服务器工作原理和常用协议基础
  5. WebRTC源码研究(5)Nodejs搭建环境

WebRTC源码研究(2)webrtc源码目录结构

上一篇博客,“WebRTC架构”中主要粗略的讲解了WebRTC的主要模块,能做什么事情。我们知道WebRTC 是谷歌花费6000万美金收购了之后2010年开源的代码,在国内基本上是没有这么豪气牛逼的公司的,所以要要学习先进技术还是要看国外的文档,开源社区。

WebRTC 是一个音视频通信的百宝箱,给音视频处理和即时通讯提供了成熟的解决方案。关键是这个方案的源码是开源的,你可以深入研究这些源码,学习里面的解决疑难问题的算法,应用在你的项目中。 WebRTC是一个非常优秀的多媒体框架,具有跨平台的特性。

WebRTC是一项在浏览器内部进行实时视频和音频通信的技术,是谷歌2010年以6820万美元收购收购Global IT Solutions公司而获得一项技术。网址是:code.google.com/p/webrtc/We…WebRTC使用了iLBC iSAC,G711和G722语音协议以及VP8视频协议。实现了一种基于网页的视频会议,开发者可以通过浏览器提供简单的javascript就可以达到实时通讯(RTC)能力。开发人员也可以访问 sites.google.com/site/webrtc 页面获取WebRTC的源代码、规格说明和工具等。

1. WebRTC源码下载

WebRTC的源码是非常庞大的,目前的源码足足有10G了,如果没有好的网络,是很难下载的,这里我提供一份我保存在百度云的源码,有需要的点击这里下载:WebRTC 源码下载: 链接:pan.baidu.com/s/1BIJcRSzC… 密码:0l8u

2. WebRTC源码目录结构

WebRTC源码目录结构

2.1 WebRTC源码目录概要

由于WebRTC是一个非常庞大,复杂的音视频即时通讯技术的开源库,这里面的逻辑也是非常复杂的,如果不清楚目录结构,每个目录主要是做什么的,如果想查询一点东西是否非常吃力的。因此我们有必要来好好研究一下目录结构。

  • 主体目录大致如下:
目录 功能
api WebRTC接口层,浏览器都是通过该接口调用WebRTC
call 数据流的 管理层,Call代表同一个端点的所有数据的流入流出
video 与视频相关的逻辑
audio 与音频相关的逻辑
common_audio 音频算法相关
common_video 视频算法相关
media 与多媒体相关的逻辑处理,如编解码的逻辑处理
logging 日志相关
module 最重要的目录,子模块
pc Peer Connection,连接相关的逻辑层
p2p 端对端相关的代码,stun,turn
rtc_base 基础代码 ,如线程、锁相关的统一接口代码
rtc_tool 音视频分析相关的工具代码
tool_webrtc WebRTC测试相关的工具,如网络模拟器
system_wrappers 与具体操作系统相关的代码。如CPU特性,原子操作等
stats 存放各种数据统计相关的类
sdk 存放Android和IOS层代码。如视频的采集,渲染等

接下来对上面的目录逐个简要说明一下,具体的还是要去看源码:

  • 首先是api这个 目录,api这个顾名思义大家都能一下子猜出来,就是WebRTC的接口层,像浏览器也好,像我们自己写的应用程序也好,我们大多数情况下要调用的这些api是直接从WebRTC通过的这些API调用。但是如果我没想增加接口,或者是调整这个接口就要到api这个目录找相应的文件。

  • 第二个是call这个目录,call这个目录可能大家比较难以理解,其实也不是很困难,它主要就是对数据流的管理,音频流、视频流当我这一端进行连接之后,同一个端的这些流的管理就是通过call进行管理,所以呢,就建立了call这样一个目录,它代表的就是同一个端的流入和流出。但是如果我与多个端进行沟通,就有多个call。

  • 第三个是videovideo就是与视频相关的逻辑,视频的处理,视频的编解码等等,一个总的入口点。

  • 第四个是audio, audio就是与音频的相关逻辑和处理。

  • 下面的两个common_audiocommin_video,它们的作用就是与算法相关的,那么拆出来就是与音频的算法相关就在common_audio里面,视频的算法放在common_video里面。如果你想解决算法相关的,那么就去这两个目录里面去找。

  • 那么再接下来就是media,media也很好理解,其实就是和多媒体相关的处理,像编解码的逻辑,什么时候进行编码什么时候进行解码,那么这些就是在media这个目录下,所以你要解决编解码以及解码后要做哪些处理,你需要从media这个目录进行查找。

  • 再接下来是logging,就是日志相关了,一般改的很少,比较单一。

  • 这里最重要的是modulemodule这个模块就特别大,module里面有很多子模块,每个子模块都非常重要 ,我会给大家做详细的介绍。我们首先只需要知道module这个目录特别重要就好了。

  • 再接下来就是pc,pc的含义就是Peer Connection,在此之前已经给大家介绍了,Peer Connection就代表的是一个连接,如我与对端的一个连接,在整个上层有这个连接的概念。那在这个连接下面就有很多东西了,比如Stream流 ,Track轨,一个流里面可以包含很多轨,包括音频轨和视频轨已经桌面轨等等,那么轨道的概念大家应该也有所了解了,两个平行的线就是两个轨道,它们永远是不相交的,就是这样一个概念,音频与视频永远不会交叉的,它们都是单独存储的。那么通过Peer Connection你能拿到流,能拿到每一个多媒体,也就是音频、视频,你还可以拿到媒体流的统计信息,传输的统计信息等等,那么Peer Connection就是非常重要的一个目录。是上层相当于统一的一个接口层。

  • 再下面是p2p,端对端进行传输的时候要看p2p是不是能打通,p2p有很多类型 ,后面会介绍到。你是哪种类型,这种类型能不能打通,相应的侦测工具等都是放在p2p这个目录下,相应的stun协议、turn协议等也是放在p2p这个目录下的。

  • 在下来就是rtc_base,那么这个base大家也能一目了然的了解,一些基础的东西,比如 我们用到的锁用到的线程 ,这些实际在,因为他是跨平台的,在不同的平台下 ,尤其是window和Linux它使用的函数差别特别大。那么怎么办,写的时候对于我的上层的逻辑的话根据平台去做处理, 它统一去做一层目录。

  • 再下面是rtc_tool,rtc_tool包含一些工具,主要是音频视频的分析工具,比如我多H264进行分析,有这个i帧、P帧、B帧包括一些更细一些的NL头都可以再rtc_tool找到相应的工具。

  • 下面还有个工具叫做tool_webrtc,它就是测试相关的工具,一些单元测试,以及各种的网络测试,还有音频、视频的测试,都是在这个tool_webrtc里面,这里主要是整个webrtc的策略是在这个tool_webrtc里面。

  • 在接下来是system_wrappers,这个大家比较好理解了,就是根据具体的平台相关的,你的CPU、原子操作,具体的锁等等,那是放在system_wrappers里面。window形成 一个文件,linux形成一个文件。

  • 在接下来的是stats是各种统计数据相关的类,比如我的丢包率,抖动时常等功能,这是各种统计信息。

  • 在下面 是sdk主要是存放Android和IOS的代码层,包括音频的采集,音频的渲染,都是放在SDK这个目录里面。

  • 下载的源码文件夹目录如下:

WebRTC源码目录结构1

WebRTC源码目录结构2

├── ./base  //基础平台库,包括线程、锁、socket等
├── ./build //编译脚本,gyp
├── ./common_audio  //基础公共的音频处理
│   ├── ./common_audio/include  //就一个类型转换头文件
│   ├── ./common_audio/resampler    //音频重采样代码
│   ├── ./common_audio/signal_processing    //音频信号处理代码,和硬件平台有关,有汇编代码
│   └── ./common_audio/vad  //vad代码
├── ./common_video  //基础的公共视频处理,如I420桢处理、scaler、plane
├── ./examples //例子
├── ./libjingle //libjingle
├── ./modules
│   ├── ./modules/audio_coding
│   │   ├── ./modules/audio_coding/codecs //音频codec处理,统一封装公共接口和各类不同的codec的具体处理,cng,g711,g722等
│   │   ├── ./modules/audio_coding/main //音频codec处理模块代码
│   │   │   ├── ./modules/audio_coding/main/acm2    //音频处理模块的主要代码
│   │   └── ./modules/audio_coding/neteq    //neteq代码
│   │       ├── ./modules/audio_coding/neteq/interface
│   │       ├── ./modules/audio_coding/neteq/mock
│   │       ├── ./modules/audio_coding/neteq/test
│   │       └── ./modules/audio_coding/neteq/tools
│   ├── ./modules/audio_conference_mixer    //音频合成代码
│   │   ├── ./modules/audio_conference_mixer/interface
│   │   └── ./modules/audio_conference_mixer/source
│   ├── ./modules/audio_device  //audio设备处理代码,采集和放音,android,ios,linux,mac,win
│   │   ├── ./modules/audio_device/main //AudioDeviceModule处理代码
│   ├── ./modules/audio_processing //音频前后端处理,aec,aecm,agc,beamformer,ns,transient
│   ├── ./modules/bitrate_controller    //码率模块控制代码
│   ├── ./modules/desktop_capture //桌面抓拍处理代码和各平台处理代码,mac,win,x11
│   ├── ./modules/interface
│   ├── ./modules/media_file    //播放录制文件模块代码,支持avi
│   ├── ./modules/pacing    //码率探测代码
│   ├── ./modules/remote_bitrate_estimator  //远端码率计算
│   ├── ./modules/rtp_rtcp //rtp、rtcp的处理代码,封装解封装,各种codec的不同处理、fec
│   ├── ./modules/utility
│   ├── ./modules/video_capture //视频摄像头采集代码,android、ios、linux、mac、win
│   ├── ./modules/video_coding //视频codec处理代码,i420、vp8、vp9
│   │   ├── ./modules/video_coding/codecs
│   │   ├── ./modules/video_coding/main //VideoCodingModule处理代码
│   ├── ./modules/video_processing //视频前后处理,brighten,color enhancement,deflickering,spatial resampler等
│   │   └── ./modules/video_processing/main //VideoProcessingModule
│   └── ./modules/video_render  //视频渲染代码,android,ios、linux、mac、windows、opengles
├── ./p2p //nat穿越代码,turn/stun等,服务器和客户端
│   ├── ./p2p/base
│   └── ./p2p/client
├── ./sound //未知
├── ./system_wrappers //系统api封装
├── ./test
├── ./tools //音视频测试工具代码
├── ./video //未知
├── ./video_engine  //视频引擎代码,视频的处理流程
└── ./voice_engine  //音频引擎代码,音频处理流程



2.2 WebRTC源码目录功能介绍

上面对目录有了一个大致的解释,接下来我们通过命令行看看具体的源码文件目录信息

2.2.1 WebRTC源码根目录

目录 功能 路径 说明
api WebRTC接口层,浏览器都是通过该接口调用WebRTC,包括 DataChannel, MediaStream, SDP相关的接口
call 数据流的管理层,Call代表同一个点的所有数据的流入流出,存放的是 WebRTC “呼叫(Call)” 相关逻辑层的代码。
video 与视频相关的逻辑,视频逻辑层及视频引擎层的相关的代码。视频数据逻辑上的发送,接收等代码。
audio 与音频相关的逻辑,音频数据逻辑上的发送,接收等代码。
common_audio 音频算法相关,存放一些音频的基本算法。包括环形队列,博利叶算法,滤波器等。
common_video 视频算法相关,存放了视频算法相关的常用工具,如libyuv, sps/pps分析器,I420缓冲器等。
media 与多媒体相关的逻辑处理,如编解码的逻辑处理
logging 日志相关
modules 最重要的目录,子模块
pc Peer Connection连接相关的逻辑,存放一些业务逻辑层的代码。如 channel, session等
p2p 端对端相关代码,stun, turn
rtc_base 基础代码,如线程,锁相关的统一接口代码
rtc_tools 音视频分析相关的工具代码
tools_webrtc WebRTC测试相关的工具代码,如网络模拟器
system_wrappers 与具体操作系统相关的代码。如CPU特性,原子操作等
stats 存放各种数据统计相关的类
sdk 存放Android和IOS层代码。如视频的采集,渲染等
base
build
build_overrides
buildtools
crypto
data
examples
ios
media
out
resources
style-guide
test
testing
third_party
tools
2.2.1.1 api 目录

WebRTC接口层,浏览器都是通过该接口调用WebRTC,包括 DataChannel, MediaStream, SDP相关的接口

api 目录

2.2.1.2 call 目录

数据流的管理层,Call代表同一个点的所有数据的流入流出,存放的是 WebRTC “呼叫(Call)” 相关逻辑层的代码

call 目录

2.2.1.3 video 目录

与视频相关的逻辑,视频逻辑层及视频引擎层的相关的代码。视频数据逻辑上的发送,接收等代码。

video 目录

2.2.1.4 audio 目录

与音频相关的逻辑,音频数据逻辑上的发送,接收等代码。

audio 目录

2.2.1.5 common_audio 目录

音频算法相关,存放一些音频的基本算法。包括环形队列,博利叶算法,滤波器等。

common_audio 目录

2.2.1.6 common_video 目录

视频算法相关,存放了视频算法相关的常用工具,如libyuv, sps/pps分析器,I420缓冲器等。

common_video 目录

2.2.1.7 media 目录

与多媒体相关的逻辑处理,如编解码的逻辑处理

media 目录

  • media/base 目录
    media/base 目录
  • media/engine 目录

media/engine 目录

  • media/sctp目录

media/sctp目录

2.2.1.8 logging 目录

日志相关

logging 目录

2.2.1.9 modules 目录

modules最重要的目录,子模块,这里重点介绍一下:

目录 功能 备注
audio_coding 音频编解码相关代码 audio_coding,是和编解码逻辑相关的,会用编解码,这里的audio_coding它是编解码器,都是放在audio_coding这个目录下。
audio_device 视频采集与音频播放相关代码 audio_device它是和设备相关的,它做了一个区分,安卓和IOS放在sdk下面了,它相应的一些代码移到sdk里面了,在以前的webrtc版本 ,所有的设备都是 放在audio_device里面 ,包括我们的windows和MAC下的以及Linux下的,都是在audio_device这个目录下。
audio_mixer 混音相关代码 audio_mixer,就是混音相关的,混音就好比开会时多人实时互动,比如四个人同时在说话,就要给它混在一起,这样在传输的时候就比较方便,这个减少了音频流,所以这个混音相关的就放在audio_mixer里面。
audio_processing 音频前后处理相关代码 audio_processing就是音频的前处理后处理,音频的前处理后处理就好比回音消除、降噪、增益等,都是放在audio_processing里面。这个目录里面又分了很多子目录,在后面你就 大体的知道这个相关的在这个目录下。以及在这个目录下再找子目录
bitrate_controller 码率控制相关代码 bitrate_controller,这个是码流控制的,比如说控制这个码流,视频的码流是500k还是1M。这个码流的控制。如果想知道相关的码流他是怎么控制的 ,那么可以到这里去看。
congestion_controller 流控制相关代码 -congestion_controller,就是流量控制,当我能检测到网络流量比较高的时候,我们要做一些流量控制,防止这个网络包将带宽打死,具体怎么控制就是在这里做的相关的逻辑。所以如果我要 了解流量控制相关的,就到这个目录下面去找。
desktop_capture 桌面采集相关代码 --
pacing 码率探测及平滑处理相关代码 pacing的作用是码率的侦测和平滑处理,我首先要检测到音频视频的码率是怎样的,做到之后我们要做到一个平滑的处理,我们不能让他一下子就发送出去,应该对他做一下平滑,比如有时候是10k有时候是500k,我们让他平均一下。
remote_bitrate_estimator 远端码率估算相关的代码 emote_bitrate_estimator的作用是远程码率评估,我远端能接收的带宽是多少,一个是我本地的带宽,一个是远端的带宽,不光我能发多少还有对方能收多少,所以要有一个远端的码率的评估,这是放在remote_bitrate_estimator目录下
rtc_rtcp rtp/rtcp协议相关代码 --
video_capture 视频采集相关代码 video_capture我捕获视频的相关的代码,放在video_capture里面
video_coding 视频编解码相关代码 视频的编码,如H264,VP 8,VP 9,等,这个编码器都是放在video_coding里面。
video_processing 视频前后处理相关的代码 video_processing,就是视频的前处理和后处理,如视频帧的增强,检测,如果我们增加人脸识别可以放到video_processing这个目录下。

接下来我还是通过命令行来查看一下:

modules 目录

  • modules/audio_coding 目录
    modules/audio_coding 目录
  • modules/audio_device 目录
    modules/audio_device 目录
  • modules/audio_mixer 目录
    modules/audio_mixer 目录
  • modules/audio_processing 目录
    modules/audio_processing 目录
  • modules/bitrate_controller 目录
    modules/bitrate_controller 目录
  • modules/congestion_controller 目录
    modules/congestion_controller 目录
  • modules/desktop_capture 目录
    modules/desktop_capture 目录
  • modules/include 目录
    modules/include 目录
  • modules/pacing 目录
    modules/pacing 目录
  • modules/remote_bitrate_estimator 目录
    modules/remote_bitrate_estimator 目录
  • modules/rtp_rtcp 目录
    modules/rtp_rtcp 目录
  • modules/third_party 目录
    modules/third_party 目录
  • modules/utility 目录
    modules/utility 目录
  • modules/video_capture 目录
    modules/video_capture 目录
  • modules/video_coding 目录
    modules/video_coding 目录
  • modules/video_processing 目录
    modules/video_processing 目录
2.2.1.10 pc 目录

Peer Connection连接相关的逻辑,存放一些业务逻辑层的代码。如 channel, session等

2.2.1.11 p2p 目录

端对端相关代码,stun, turn

2.2.1.12 rtc_base 目录

基础代码,如线程,锁相关的统一接口代码

2.2.1.13 rtc_tools 目录

音视频分析相关的工具代码

2.2.1.14 tools_webrtc 目录

WebRTC测试相关的工具代码,如网络模拟器

2.2.1.15 system_wrappers 目录

与具体操作系统相关的代码。如CPU特性,原子操作等

2.2.1.16 system_wrappers 目录
2.2.1.17 stats 目录

存放各种数据统计相关的类

2.2.1.18 sdk 目录

存放Android和IOS层代码。如视频的采集,渲染等

2.2.1.19 base 目录
2.2.1.20 build 目录
2.2.1.21 build_overrides 目录
2.2.1.22 buildtools 目录
2.2.1.23 crypto 目录
2.2.1.24 data 目录
2.2.1.25 examples 目录
2.2.1.26 ios 目录
2.2.1.27 media 目录
2.2.1.28 out 目录
2.2.1.29 resources 目录
2.2.1.30 style-guide 目录
2.2.1.31 test 目录
2.2.1.32 testing 目录
2.2.1.33 third_party 目录
2.2.1.34 tools 目录

2.2.2 WebRTC Modules模块子目录

Modules模块是WebRTC源码中最重要的一个目录

目录 功能 路径 说明
audio_coding 音频编解码相关代码
audio_device 音频采集与音频播放相关代码
audio_mixer 混音相关代码
audio_processing 音频前后处理的相关代码
bitrate_controller 码率控制相关代码
congestion_controller 流控相关代码
desktop_capture 桌面采集相关代码
pacing 码率探测及平滑处理相关的代码
remote_bitrate_estimator 远端码率估算相关的代码
rtp_rtcp rtp/rtcp协议相关代码
video_capture 视频采集相关的代码
video_coding 视频编解码相关的代码
video_processing 视频前后处理相关的代码

3. WebRTC编译安装