源码地址:
目录结构主要分为:
1、接口层;
2、业务处理层;
3、音视频处理层;
4、基础支持层;
以webrtc120源码目录为例:
api:WebRTC对外提供的所有接口都存放在这个目录下,如果要为WebRTC增加新的接口,也需要将编写的接口文件放在该目录下;
pc:PeerConnection目录,PeerConnection可以做很多事情,包括:媒体协商、收集Candidate、传输音视频数据等;
call:Call目录里存放的是与“呼叫”相关的文件,表示的是用户之间建立的会话,call这个词是从程控电话交换系统衍生而来的,实际上与互联网中的Session是同一概念。一个WebRTC终端可以同时发起多个“呼叫”,即创建多个call实例,而在每个call实例中,又可以包含多个发送/接收流;
media:media目录用于存放与媒体引擎相关的代码,媒体引擎包括音频引擎和视频引擎,主要用于音视频的控制;
audio:用于存放与音频流相关的代码;
video:用于存放与视频流相关的代码;
common_audio:用于存放一些音频的基本算法,包括环形队列、傅里叶算法、滤波器等;
common_videosdk:存放与视频相关的算法及工具,如 libyuv、sps/pps分析器、I420缓冲器等;
sdk:存放移动端特定的代码,如:Android端的视频采集、iOS端的视频采集等;
p2p:存放端到端网络连接相关的代码,如:DTLS、STUN协议的实现等;
stats:存放各种数据统计相关的类,如:发送了多少包、丢失了多少包、带宽大小等;
rtc_base:存放一些基础代码,如:线程、事件、socket等;
rtc_tools:存放一些与服务质量相关的工具;
tools_webrtc:存放一些与WebRTC性能相关的工具;
system_wrapper:存放与操作系统相关的代码,如:CPU特性、原子操作、读写锁、时钟等;
modules:组件库
是WebRTC中特别重要的一个目录,包括音视频的采集、处理、各种编解码器等模块都存放在这个目录下。该目录存放的模块都是比较独立的,可以单独的抽取出来,例如:回音消除、降噪等模块。modules目录下的子目录也分为几个大类:
1、文件
include:module头文件;
third_party:第三方依赖,fft、g711等;
2、音频处理类
audio_coding:存放音频编解码相关的代码;
audio_device:存放PC端音频采集和音频播放相关的代码(注意WebRTC移动端的音频设备采集和播放的代码不在其中,而是在一级目录sdk/目录下);
audio_mixer:存放混音相关的代码;
audio_processing:存放音频前后处理相关的代码,例如回音消除、降噪的代码都在该目录下;
async_audio_processing:异步音频处理类;
3、视频处理类
video_capture:存放视频采集相关的代码;
video_coding:存放视频编解码相关的代码;
video_processing:存放视频前后处理相关的代码;
desktop_capture:存放PC端桌面采集相关的代码;
4、网络及流控类
rtp_rtcp:存放的是RTP/RTCP协议代码;
bitrate_controller:存放的是Transport-CC算法中码率控制的相关代码;
congestion_controller:存放的是用于判定是否有拥塞发生的相关代码;
remote_bitrate_estimator:存放是的是Goog-REMB评估算法的相关代码(该算法实际已被淘汰,只是因为兼容的问题所以一直保留);
pacing:存放的是用于平滑发送数据,防止网络的数据出现堆积的代码。
utility:线程相关工具;