搜索
 找回密码
 立即注册

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

音视频开发进阶 2022-11-17 20:14:08 86

本帖最后由 音视频开发进阶 于 2022-11-17 20:32 编辑

上一篇博客,“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源码目录结构

编辑切换为居中

添加图片注释,不超过 140 字(可选)

2.1 WebRTC源码目录概要

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

主体目录大致如下:

添加图片注释,不超过 140 字(可选)

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

首先是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这个目录里面。

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

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

<pre class="public-DraftStyleDefault-pre" data-offset-key="euqlc-0-0"><pre class="Editable-styled" data-block="true" data-editor="3us0v" data-offset-key="euqlc-0-0"><div data-offset-key="euqlc-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="euqlc-0-0"><span data-text="true">├── ./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 //音频引擎代码,音频处理流程

</span></span></div></pre></pre>

2.2 WebRTC源码目录功能介绍

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

2.2.1 WebRTC源码根目录

添加图片注释,不超过 140 字(可选)

2.2.1.1 api 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.2 call 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.3 video 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.4 audio 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.5 common_audio 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.6 common_video 目录

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

添加图片注释,不超过 140 字(可选)

2.2.1.7 media 目录

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

添加图片注释,不超过 140 字(可选)

  • media/base 目录

添加图片注释,不超过 140 字(可选)

  • media/engine 目录

添加图片注释,不超过 140 字(可选)

  • media/sctp目录

添加图片注释,不超过 140 字(可选)

2.2.1.8 logging 目录

日志相关

添加图片注释,不超过 140 字(可选)

2.2.1.9 modules 目录

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

添加图片注释,不超过 140 字(可选)

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

添加图片注释,不超过 140 字(可选)

  • modules/audio_coding 目录

添加图片注释,不超过 140 字(可选)

  • modules/audio_device 目录

添加图片注释,不超过 140 字(可选)

  • modules/audio_mixer 目录

添加图片注释,不超过 140 字(可选)

  • modules/audio_processing 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/bitrate_controller 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/congestion_controller 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/desktop_capture 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/include 目录

添加图片注释,不超过 140 字(可选)

  • modules/pacing 目录

添加图片注释,不超过 140 字(可选)

  • modules/remote_bitrate_estimator 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/rtp_rtcp 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/third_party 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/utility 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/video_capture 目录

编辑切换为居中

添加图片注释,不超过 140 字(可选)

  • modules/video_coding 目录

添加图片注释,不超过 140 字(可选)

  • modules/video_processing 目录

添加图片注释,不超过 140 字(可选)

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源码中最重要的一个目录

使用道具 举报

随机推荐

0 回复

游客
返回顶部