WebRTC源码目录结构
WebRTC主目录:
可以将WebRTC目录归纳为几个大类:
接口层、业务处理层、音视频处理层、基础支持层
- 接口层:
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:
modules是WebRTC中特别重要的一个目录,包括音视频的采集、处理、各种编解码器等模块都存放在这个目录下。该目录存放的模块都是比较独立的,可以单独的抽取出来,例如:回音消除、降噪等模块。
modules目录下的子目录也分为几个大类,包括:
(1)音频处理类:
包括以下几个目录:
audio_coding/:存放音频编解码相关的代码;
audio_device/:存放PC端音频采集和音频播放相关的代码(注意WebRTC移动端的音频设备采集和播放的代码不在其中,而是在一级目录sdk/目录下);
audio_mixer/:存放混音相关的代码;
audio_processing/:存放音频前后处理相关的代码,例如回音消除、降噪的代码都在该目录下;
(2)视频处理类:
video_capture/:存放视频采集相关的代码;
video_coding/:存放视频编解码相关的代码;
video_processing/:存放视频前后处理相关的代码;
desktop_capture/:存放PC端桌面采集相关的代码;
(WebRTC中没有实现PC端的视频渲染,该功能只能由使用者自行实现)
(3)网络及流控类:
rtp_rtcp/:存放的是RTP/RTCP代码;
bitrate_controller/:存放的是Transport-CC算法中码率控制的相关代码;
congestion_controller/:存放的是用于判定是否有拥塞发生的相关代码;
remote_bitrate_estimator/:存放是的是Goog-REMB评估算法的相关代码(该算法实际已被淘汰,只是因为兼容的问题所以一直保留);
pacing/:存放的是用于平滑发送数据,防止网络的数据出现堆积的代码。