WebRTC系列文章
- WebRTC源码研究(1)WebRTC架构
- WebRTC源码研究(2)webrtc源码目录结构
- WebRTC源码研究(3)webrtc运行机制
- WebRTC源码研究(4)web服务器工作原理和常用协议基础
- 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源码目录结构
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。 -
第三个是
video
,video
就是与视频相关的逻辑,视频的处理,视频的编解码等等,一个总的入口点。 -
第四个是
audio
,audio
就是与音频的相关逻辑和处理。 -
下面的两个
common_audio
和commin_video
,它们的作用就是与算法相关的,那么拆出来就是与音频的算法相关就在common_audio
里面,视频的算法放在common_video
里面。如果你想解决算法相关的,那么就去这两个目录里面去找。 -
那么再接下来就是
media
,media
也很好理解,其实就是和多媒体相关的处理,像编解码的逻辑,什么时候进行编码什么时候进行解码,那么这些就是在media这个目录下,所以你要解决编解码以及解码后要做哪些处理,你需要从media这个目录进行查找。 -
再接下来是
logging
,就是日志相关了,一般改的很少,比较单一。 -
这里最重要的是
module
,module
这个模块就特别大,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这个目录里面。 -
下载的源码文件夹目录如下:
├── ./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相关的接口
2.2.1.2 call 目录
数据流的管理层,Call代表同一个点的所有数据的流入流出,存放的是 WebRTC “呼叫(Call)” 相关逻辑层的代码
2.2.1.3 video 目录
与视频相关的逻辑,视频逻辑层及视频引擎层的相关的代码。视频数据逻辑上的发送,接收等代码。
2.2.1.4 audio 目录
与音频相关的逻辑,音频数据逻辑上的发送,接收等代码。
2.2.1.5 common_audio 目录
音频算法相关,存放一些音频的基本算法。包括环形队列,博利叶算法,滤波器等。
2.2.1.6 common_video 目录
视频算法相关,存放了视频算法相关的常用工具,如libyuv, sps/pps分析器,I420缓冲器等。
2.2.1.7 media 目录
与多媒体相关的逻辑处理,如编解码的逻辑处理
- media/base 目录
- media/engine 目录
- media/sctp目录
2.2.1.8 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/audio_coding 目录
- modules/audio_device 目录
- modules/audio_mixer 目录
- modules/audio_processing 目录
- modules/bitrate_controller 目录
- modules/congestion_controller 目录
- modules/desktop_capture 目录
- modules/include 目录
- modules/pacing 目录
- modules/remote_bitrate_estimator 目录
- modules/rtp_rtcp 目录
- modules/third_party 目录
- modules/utility 目录
- modules/video_capture 目录
- modules/video_coding 目录
- 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 | 视频前后处理相关的代码 | ||