热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Webrtc源码分析起步

本文是从Webrtc实际应用的方面介绍如何快速理解Webrtc的源码。Webrtc是用于web的实时通信框架,也可以直接使用Google开源的Webrtc实现来开发非

本文是从Webrtc实际应用的方面介绍如何快速理解Webrtc的源码。Webrtc是用于web的实时通信框架,也可以直接使用Google开源的Webrtc实现来开发非Web的APP。要理解如何使用webrtc的源码,最好是先懂得Webrtc通信的流程,请查看 用Webrtc实现免费的1对1高清实时视音频会议系统 就可以了解Webrtc的接口使用流程,了解这个流程后就可以快速理解Google开源的那部分Webrtc源码了,并为自己使用。

需要掌握Webrtc的js部分的 PeerConnection,js部分的接口及方法如RTCPeerConnection,setLocalDescription、setRemoteDescription、createOffer、createAnswer 等,这些是理解源码的关键。


一、Webrtc源码概述

WebRTC 源码作为 Chromium 的一部分,更新速度非常快,这得益于 Google 对音视频通信的大力推广。WebRTC 源码的结构也变化很快,主要体现在以下几方面:

  • 比较源码版本 m50 和 m66,在编译工具上发生了变化。老版本是通过 GYP 来生成 ninja 文件,新版本是通过 gn 生成 ninja 文件。
  • 在目录结构上发生了变化,老版本中支持的一些功能在新版本中删除了。
  • 随着 c++11,c++14,c++17 新标准的推出,WebRTC 在新版本中逐渐支持了新标准中的语法功能,使得代码变得更简洁、易维护。

目前手上有一份而 windows 版本的 m66 版本代码和一份 linux 版本的 m73 代码,这两个版本在目录结构上差异不大,在实现上有一些差异。比如,m73 版本为 BaseChannel 类抽象了一个 ChannelInterface 接口类。由于 WebRTC 代码下载不是很方便,所以本文后续会交替用 m66 和 m73 版本。

作为技术人员的我们,一是要理解 WebRTC 实现的原理,这样可以应对不断地变化。二是要跟踪最新的实现,将最新技术不断的引入到我们的产品中。


二、Webrtc源码的层级图

因为Webrtc源码比较庞大,以下列出了比较关键的模块:

 

如果按照通常层次化的思维来组织,从下到上,大概分以下几个层次:

  • OS 跨平台适配、硬件设备访问、第三方库 Wrapper 层
    包括网络层、操作系统 API 的跨平台封装,音频设备、视频设备封装,音频、视频 codec,DTLS 的第三方实现等。
  • 网络传输层
    这里包括 candidate 收集,stun/turn 协议的实现,dtls、rtp 网络连接的建立,sctp 连接的建立等。
  • 通道层
    主要包含传输通道也就是 BaseChannel 层 和 媒体通道 也就是 MediaChannel 层。BaseChannel 是和 PeerConnection、Transport 层对接。MediaChannel 实现其实在音视频引擎里面,是 BaseChannel 和引擎的桥梁。
  • RTP_RTCP 主要是流控
  • Audio Engine、Video Engine 是音视频引擎层,音视频处理。
  • 音视频编解码器,这也是 WebRTC 自己的一个抽象,真正的编解码库还是依赖第三方库。
  • PeerConnection、MediaStream 主要是对 jsep 协议的实现。
  • PeerConnectionInterface 是一个对外抽象接口类设计。

三、WEBRTC源码目录结构简要说明

 Webrtc代码的目录结构说明:

api提供了对外的接口,音视频引擎层和 Module 直接的接口。
audio音频流的一部分抽象,属于引擎的一部分逻辑。
base属于 Chromium 项目的一部分,貌似 WebRTC 中用的并不多。
build编译脚本。这里需要注意的是,不同平台的代码在下载的时候,获取的工具集是不一样的。
build_overrides编译工具
buildtools编译工具链
call主要是媒体流的接口抽象。为媒体引擎和 codec 层提供桥接。这里说的媒体流是 RTP 流。pc 层也抽象了媒体流,那是编码前、或者解码后。
common_audio音频算法实现,比如 fft。
common_video视频算法实现,比如 h264 协议格式。
data测试数据
examplesWebRTC 使用的例子。提供了 peerconnection_client、peerconnection_server、stun、turn 的 demo。
infra
loggingWebRTC 的 log 库。
media媒体引擎层,包括音频、视频引擎实现。
modulesWebRTC 把一些逻辑比较独立的抽象为 Module,利于扩展维护。
ortc媒体描述协议,类似 sdp 协议。
outbuild 输出目录,这是 webrtc 官方编译指导中示范目录。
p2p主要是实现 candidate 收集,NAT 穿越。
pc实现 jsep 协议。
resources测试数据
rtc_base包括 Socket、线程、锁等 OS 基础功能实现。
rtc_tools网络监测工具、音视频分析工具。很多工具都是脚本实现。
sdk主要是移动端相关实现。
statsWebRTC 统计模块实现。
style-guide编码规范说明
system_wrappersOS 相关功能的封装,比如 cpu、clock 等。
test单元测试代码实现,用 gmock
testinggmock、gtest等源码,属于整个 Chromium 项目。
third_party第三方库依赖。比如,boringssl,abseil-cpp,libvpx等
tools公共工具集,整个 Chromium 项目依赖的。
tools_webrtcWebRTC 用到的工具集。比如代码检查 valgrind 的使用。
video视频 RTP 流的抽象接口,属于视频引擎的一部分。
help

 上面我们队源码中的目录做了一个概要介绍,每一个目录又包含了很多功能。如果要是把每个目录都展开讲,那么 WebRTC 的完整架构介绍也就完成了,这显然是不可能的,后续章节会一一展开,详细探讨。本节,我们重点介绍一下 pc 和 module 目录。


PeerConnection

PeerConnection 的主要实现逻辑就是在 WebRTC 源码的 pc 目录下。

一切都从 PeerConnectionFactory 和 PeerConnection 开始,对外提供 PeerConnectionFactoryInterface 和 PeerConnectionInterface 两个接口类。Factory 类,顾名思义就是创建 PeerConnection 的,下来我们只讨论 PeerConnection。

也许你已经非常熟悉 WebRTC 的 Javascript 接口。比如,RTCPeerConnection,setLocalDescription、setRemoteDescription、createOffer、createAnswer 等,没错这些。Javascript 接口的 Native 实现就是在 PeerConnection 中完成的,它也有对应的一套接口。Javascript 这套接口实现规范是JSEP。 可以说是把这套规范的模型都给实现了。

WebRTC 终端之间的通信协议是 ICE 协议,书包格式采用 SDP 协议。PeerConnection 实现了 SessionDescription 的逻辑。

PeerConnection 抽象了 RtpTransceiver,RtpSender、RtpReceiver 模型,对应了 sdp 中描述的媒体的实现。

Module

WebRTC 将逻辑功能独立、内聚性、复用性强的部分单独抽象为模块。模块在 WebRTC 源码的 modules 目录下,主要是音视频设备、codec、流控等,这里不一一列举了。

Module 抽象了一个接口,源码实现在 modules/include/module.h 中,代码如下:

namespace webrtc{
class Module {public:virtual int64_t TimeUntilNextProcess() = 0; virtual void Process() = 0; virtual void ProcessThreadAttached(ProcessThread* process_thread) {}protected:virtual ~Module() {}
};
} // namespace webrtc

一共三个函数,相对简单,主要是为那些需要定时处理一些任务的模块提供一个统一的抽象。对于集成了 webrtc::Module 类的模块,使用的时候,需要调用 ProcessThread 的 RegisterModule 和 DeRegisterModule 方法向模块执行线程注册和反注册模块。我相信大家都知道,控制、调度逻辑是最复杂易错的,实现起来也是最枯燥乏味,设计不好,很容易重复实现很多代码。所以 WebRTC 索性都封装起来,实现者只需要被动的实现功能逻辑即可。

关于函数的具体功能,头文件的注释写的非常详细,可以参考。

后记

本文,作者根据自己的理解,总结了 WebRTC 重点逻辑的基本框架,并且做了简要的说明。紧接着,对 WebRTC m66 版本的源码目录做了一个简要说明,并且针对 pc 目录 和 modules 目录做了进一步说明。因为源码非常庞大,一篇或者几篇是没法分析彻底,需要一点一点的学习。


推荐阅读
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • XAMPP 遇到 404 错误:无法找到请求的对象
    在使用 XAMPP 时遇到 404 错误,表示请求的对象未找到。通过详细分析发现,该问题可能由以下原因引起:1. `httpd-vhosts.conf` 文件中的配置路径错误;2. `public` 目录下缺少 `.htaccess` 文件。建议检查并修正这些配置,以确保服务器能够正确识别和访问所需的文件路径。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
author-avatar
Kira玄玄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有