上一篇博客,“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的源代码、规格说明和工具等。
WebRTC的源码是非常庞大的,目前的源码足足有10G了,如果没有好的网络,是很难下载的,这里我提供一份我保存在百度云的源码,有需要的点击这里下载:WebRTC 源码下载: 链接:pan.baidu.com/s/1BIJcRSzC… 密码:0l8u
由于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 //音频引擎代码,音频处理流程 复制代码
上面对目录有了一个大致的解释,接下来我们通过命令行看看具体的源码文件目录信息
目录 | 功能 | 路径 | 说明 |
---|---|---|---|
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 | |||
WebRTC接口层,浏览器都是通过该接口调用WebRTC,包括 DataChannel, MediaStream, SDP相关的接口
数据流的管理层,Call代表同一个点的所有数据的流入流出,存放的是 WebRTC “呼叫(Call)” 相关逻辑层的代码
与视频相关的逻辑,视频逻辑层及视频引擎层的相关的代码。视频数据逻辑上的发送,接收等代码。
与音频相关的逻辑,音频数据逻辑上的发送,接收等代码。
音频算法相关,存放一些音频的基本算法。包括环形队列,博利叶算法,滤波器等。
视频算法相关,存放了视频算法相关的常用工具,如libyuv, sps/pps分析器,I420缓冲器等。
与多媒体相关的逻辑处理,如编解码的逻辑处理
日志相关
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这个目录下。 |
接下来我还是通过命令行来查看一下:
Peer Connection连接相关的逻辑,存放一些业务逻辑层的代码。如 channel, session等
端对端相关代码,stun, turn
基础代码,如线程,锁相关的统一接口代码
音视频分析相关的工具代码
WebRTC测试相关的工具代码,如网络模拟器
与具体操作系统相关的代码。如CPU特性,原子操作等
存放各种数据统计相关的类
存放Android和IOS层代码。如视频的采集,渲染等
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 | 视频前后处理相关的代码 | ||