目录结构
<h1>- WebRTC 根目录结构</h1>
<table>
<thead>
<tr>
<th style="text-align: left;">目录</th>
<th style="text-align: left;">功能</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">api</td>
<td style="text-align: left;">WebRTC接口层,浏览器都是通过该接口调用WebRTC</td>
</tr>
<tr>
<td style="text-align: left;">call</td>
<td style="text-align: left;">数据流的管理层,Call代表同一个端点的所有数据的流入流出</td>
</tr>
<tr>
<td style="text-align: left;">video</td>
<td style="text-align: left;">与视频相关的逻辑</td>
</tr>
<tr>
<td style="text-align: left;">audio</td>
<td style="text-align: left;">与音频相关的逻辑</td>
</tr>
<tr>
<td style="text-align: left;">common_audio</td>
<td style="text-align: left;">音频算法相关</td>
</tr>
<tr>
<td style="text-align: left;">common_video</td>
<td style="text-align: left;">视频算法相关</td>
</tr>
<tr>
<td style="text-align: left;">media</td>
<td style="text-align: left;">与多媒体相关的逻辑处理,如编解码的逻辑处理</td>
</tr>
<tr>
<td style="text-align: left;">logging</td>
<td style="text-align: left;">日志相关</td>
</tr>
<tr>
<td style="text-align: left;">module</td>
<td style="text-align: left;">最重要的目录,子模块(下一小节独立介绍)</td>
</tr>
<tr>
<td style="text-align: left;">pc</td>
<td style="text-align: left;">Peer Connection,连接相关的逻辑层</td>
</tr>
<tr>
<td style="text-align: left;">p2p</td>
<td style="text-align: left;">端对端相关代码,stun,turn</td>
</tr>
<tr>
<td style="text-align: left;">rtc_base</td>
<td style="text-align: left;">基础代码,如线程、锁相关的统一接口代码</td>
</tr>
<tr>
<td style="text-align: left;">rtc_tool</td>
<td style="text-align: left;">音视频分析相关的工具代码</td>
</tr>
<tr>
<td style="text-align: left;">tool_webrtc</td>
<td style="text-align: left;">WebRTC测试相关的工具代码,如网络模拟器</td>
</tr>
<tr>
<td style="text-align: left;">system_wrappers</td>
<td style="text-align: left;">与具体操作系统相关的代码。如CPU特性,原子操作等</td>
</tr>
<tr>
<td style="text-align: left;">stats</td>
<td style="text-align: left;">存放各种数据统计相关的类</td>
</tr>
<tr>
<td style="text-align: left;">sdk</td>
<td style="text-align: left;">存放Android和IOS层代码。如视频的采集,渲染等</td>
</tr>
</tbody>
</table>
<h3>补充说明</h3>
<ul>
<li>
<p>call,一个端一个call,多个端多个call;</p>
</li>
<li>
<p>module目录很大,也特别重要,
里边有很多子模块,
每个子模块也都非常重要;</p>
</li>
<li>
<p>pc:【重要目录,上层的一个统一接口层】
Peer Connection,代表一个连接,
连接下边就要有很多相关API了,
如:
Stream 流;
chain 轨【音频轨、视频轨、桌面轨】
【轨 即 一系列永不相交的平行线(线程),
即音频与视频与桌面处理,都是各自处理,互不交叉的】;<br>
所以在Peer Connection中我们可以拿到流,
通过流我们可以拿到每一个多媒体,
还可以拿到所有媒体的统一信息、传输的统一信息等</p>
</li>
<li>
<p>p2p:
端对端的传输时,需要先检查p2p是否能打通;
相应的协议、工具、API等,放在这里;</p>
</li>
<li>
<p>rtc_base:
不同操作系统,如Window和Linux,之间的系统函数差别就特别大;
但是rtc_base都封装好了,
上层按照规范编写调用逻辑即可,
框架会判断是在哪个平台运行,并执行相应的代码;</p>
</li>
<li>
<p>rtc_tool是音视频相关的测试;
tool_webrtc是整个框架的测试;</p>
</li>
<li>system_wrappers,
存放操作系统等操作代码,
不同系统不同文件存放;</li>
</ul>
<hr />
<h1>- Modules 目录结构</h1>
<table>
<thead>
<tr>
<th style="text-align: left;">目录</th>
<th style="text-align: left;">功能</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">audio_coding</td>
<td style="text-align: left;">音频编解码相关代码</td>
</tr>
<tr>
<td style="text-align: left;">audio_device</td>
<td style="text-align: left;">音频采集与音频播放相关代码</td>
</tr>
<tr>
<td style="text-align: left;">audio_mixer</td>
<td style="text-align: left;">混音相关代码</td>
</tr>
<tr>
<td style="text-align: left;">audio_processing</td>
<td style="text-align: left;">音频前后处理的相关代码</td>
</tr>
<tr>
<td style="text-align: left;">bitrate_controller</td>
<td style="text-align: left;">码率控制相关代码</td>
</tr>
<tr>
<td style="text-align: left;">congestion_controller</td>
<td style="text-align: left;">流控相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">desktop_capture</td>
<td style="text-align: left;">桌面采集相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">pacing</td>
<td style="text-align: left;">码率探测及平滑处理相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">remote_bitrate_estimator</td>
<td style="text-align: left;">远端码率估算相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">rtp_rtcp</td>
<td style="text-align: left;">rtp/rtcp协议相关代码</td>
</tr>
<tr>
<td style="text-align: left;">video_capture</td>
<td style="text-align: left;">视频采集相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">video_coding</td>
<td style="text-align: left;">视频编解码相关的代码</td>
</tr>
<tr>
<td style="text-align: left;">video_processing</td>
<td style="text-align: left;">视频前后处理相关的代码</td>
</tr>
</tbody>
</table>
<h3>补充说明</h3>
<ul>
<li>
<p>audio_coding:
上面的WebRTC架构图中
提到的 ISAC/ILBC、VP8等编解码器逻辑,
都是放在这个目录下的;</p>
</li>
<li>
<p>audio_device:
现在的WebRTC文件中关于Android、IOS的部分都放在sdk目录下了,
而之前的话,
所有的设备类型包括Android、IOS、Window、Mac、Linux的逻辑都是在audio_device目录下的;
现在的话Android、IOS被提取出去,
这里放的是关于Window、Mac、Linux的文件;</p>
</li>
<li>
<p>audio_mixer:
混音的概念:
比如现在有几个用户同时在说话,
这样子会产生多个音频流,
WebRTC则会把这几个音频流混合在一起,
这样子在传输的时候就比较方便,
减少了音频流总数;
那这个混音相关的逻辑文件,就放在audio_mixer这里;</p>
</li>
<li>
<p>audio_processing:
音频前后处理:指回音消除、降噪、增益等处理操作;</p>
</li>
<li>
<p>bitrate_controller:码率、码流控制;</p>
</li>
<li>
<p>congestion_controller:
当我们检测到网络流量比较高的时候,
我们要做一些流量控制,
防止网络包把带宽打死;
相关处理逻辑 则 放在本文件夹下;
探测码率之后,对码率做一个均衡的平滑的处理,再发送交互;</p>
</li>
<li>deo_processing:
视频前后处理:指回音消除、降噪、增益等处理操作;
如增加人脸识别功能也可以放在这个目录下;</li>
</ul>
<hr />
<ul>
<li>备注:无</li>
</ul>