一、源码和编译

设置构建环境

WebRTC的构建使用GNNinja工具。可以通过gn来生成构建配置文件。

#在src目录中生成默认构建配置
gn gen out/Default

编译WebRTC

在生成了构建配置文件后,使用ninja进行编译。

# 开始编译,目标是所有项目
ninja -C out/Default

运行测试

编译完成后,你可以运行WebRTC的测试来验证构建是否成功:

ninja -C out/Default peerconnection_client

out/Default/rtc_unittests

ninja -C out/Default 2>&1 | grep -i error

如果想用vscode单步调试,可以用以下命令

gn gen out/Default --args='is_debug=true rtc_include_tests=false treat_warnings_as_errors=false use_rtti=true is_component_build=false enable_iterator_debugging=false is_clang=false use_sysroot=false  use_custom_libcxx=false use_custom_libcxx_for_host=false  target_os="linux" target_cpu="x64"'

二、peer_connection_client

peer_connection_client

  • 连接信令服务器,处理登录、状态管理。
  • 通过服务器与其他客户端交换信令消息(SDP、ICE 候选)。
  • 维持挂起连接,等待服务器的新消息。
  • 处理服务器断开通知,发送和接收挂断消息。

服务器

  • 管理客户端的连接、登录。
  • 转发客户端之间的信令消息。
  • 通知断开事件。

webrtc通信p2p架构.png

重要信令:signin signout wait message

三、SDP

SDP (Session Description Protocol, 会话描述协议) 是一种用于描述多媒体通信会话的格式化文本协议,通常用于 WebRTCSIP (Session Initiation Protocol) 等实时通信技术中。它的主要作用是描述如何设置和控制多媒体会话的参数,例如音视频编解码器、媒体流、网络地址等。

SDP 的主要用途

SDP 在建立实时通信(如音视频通话、数据传输)时用于传递会话的元数据信息,即告知双方通信中的关键细节。它不负责传输媒体数据,而是用于定义通信会话的细节,帮助两个设备了解如何发送和接收音频、视频等流媒体。

SDP 包含的关键信息

  1. 媒体类型:例如音频、视频、数据等。
  2. 编解码器:描述使用的音频和视频编解码器(例如 H.264、VP8、Opus 等)。
  3. 媒体格式:定义音频采样率、视频分辨率等参数。
  4. 网络信息:包括 IP 地址和端口,告诉对方如何连接和传输数据。
  5. 会话时间:描述会话的起止时间。
  6. 其他会话控制信息:包括密钥协商、带宽限制等。

SDP 格式

SDP 是纯文本格式,每行以一个特定的字母开头,表示不同的参数。以下是 SDP 中常见的字段:

  • v=:协议版本号(通常为 0)。
  • o=:会话的创建者和会话标识符。
  • s=:会话名称。
  • c=:连接信息(IP 地址)。
  • m=:媒体描述(媒体类型、传输端口、协议等)。
  • a=:属性(例如编解码器、媒体流的方向等)。
v=0
o=- 46117344 2 IN IP4 192.168.1.100
s=Session
c=IN IP4 192.168.1.100
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 51372 RTP/AVP 31
a=rtpmap:31 H261/90000

SDP 在 WebRTC 中的作用

WebRTC 中,SDP 被用来交换连接双方的媒体能力网络参数,它是信令过程的一部分,包含了:

  • 本地候选地址(ICE 候选):用于打洞 NAT/防火墙,建立 P2P 连接。
  • 音视频信息:比如使用的编解码器、采样率、帧率等。
  • 媒体流控制:媒体的发送和接收方向。

SDP 是用于描述多媒体会话的文本协议,定义了会话的细节参数,帮助通信双方了解如何进行多媒体数据的发送和接收。在 WebRTC 中,SDP 被用于交换信令信息,建立 P2P 连接。

四、ICE

ICE (Interactive Connectivity Establishment,交互式连接建立) 是一种用于帮助建立 P2P(点对点)连接 的技术,广泛应用于 WebRTC 和其他实时通信协议中。其主要功能是帮助两个位于不同网络环境中的设备找到最佳路径来直接连接,实现高效的数据传输。

ICE 的主要功能

由于现实中的网络环境复杂,设备通常位于不同的 NAT(网络地址转换)后面,直接连接比较困难。ICE 通过结合多种网络穿透技术,帮助设备找到能够建立直接连接的路径。

ICE 的工作流程

  1. 候选地址收集:每个设备收集多个可能的连接地址(称为 ICE 候选(ICE candidates)),包括:
    • 主机候选地址:设备的本地 IP 地址和端口。
    • 服务器反射候选地址:通过 STUN 服务器获取的公共 IP 地址。
    • 中继候选地址:通过 TURN 服务器获取的中继地址,当设备无法直接 P2P 连接时,数据会通过 TURN 服务器转发。
  2. 候选地址交换:通信双方通过信令(如 SDP)交换各自的候选地址列表。
  3. 连接测试:双方使用这些候选地址进行测试,尝试不同的连接路径,找出一个最优的传输路径。
  4. 建立连接:找到最佳的候选地址后,ICE 协议帮助双方建立直接的 P2P 连接,开始传输音视频或数据。

常用的组件

  • STUN(Session Traversal Utilities for NAT):帮助设备通过 NAT 获取其公共 IP 地址。
  • TURN(Traversal Using Relays around NAT):在无法直接连接时,提供中继服务,用于数据转发。

ICE 的优点

  • 适应复杂网络环境:ICE 通过多种方式寻找可行的连接路径,适用于 NAT、防火墙等复杂网络环境。
  • 提高连接成功率:通过收集多种候选地址,ICE 提高了建立 P2P 连接的成功率。
  • 动态路径优化:根据测试结果自动选择最佳的路径,保证通信的质量和效率。

ICE 是一种用于解决网络穿透问题的技术,通过收集、交换和测试多种候选连接路径,帮助两个设备建立直接的 P2P 连接,在 WebRTC 和其他实时通信中起着至关重要的作用。
webrtc-native-开发过程.png
媒体协商时序图.png