WebRTC 各端的互联互通

WebRTC 各端的互联互通

WebRTC Native 的核心

正如 WebRTC Web 端的核心是 RTCPeerConnection,WebRTC Native 的核心对象是 PeerConnectionFactory。可以通过它创建 Track、MediaStream、PeerConnection 等对象,还可以通过它指定音视频的编解码器、设置编解码器的参数、开启回声消除等功能,甚至为 WebRTC 指定工作线程、信号线程等。

但从功能上讲,PeerConnectionFactory 还是无法与 RTCPeerConnection 相比,它们最大的不同是,RTCPeerConnection 可以传输数据,而 PeerConnectionFactory 不行。RTCPeerConnection 所做的事情需要由 PeerConnectionFactory 和 PeerConnection 对象加在一起才能完成。

WebRTC Native 处理流程:

在这里插入图片描述

那么通过PeerConnection对象建立音视频通话,包括如下步骤:

  1. 创建PeerConnectionFactory,通过工厂方法webrtc::CreatePeerConnectionFactory。
  2. 创建PeerConnection,通过它的PeerConnectionFactory的CreatePeerConnection方法。
  3. 调用PeerConnectionFactory的CreateAudioTrack和CreateVideoTrack方法创建Track。
  4. 调用PeerConncetion的 AddTrack方法添加Track,track最终会反映到sdp中的m行中。协商成功的Track在随后会通过onAddTrack回调告知应用层,根据Track的类型来确定是回放视频还是音频。
  5. 如果是本地为发起端则需调用PeerConnection的CreateOffer方法,产生本地SDP信息(抽象为webrtc::SessionDescriptionInterface对象),触发CreateSessionDescriptionObserver中OnSuccess方法,在OnSuccess方法中调用PeerConnection的SetLocalDescription方法,获取sdp字符串后通过信令协议给到远端。
  6. 如果远端是发起,在收到信令服务传来的远端SDP消息,调用PeerConnection的SetRemoteDescription方法(需将sdp字符转换为webrtc::SessionDescriptionInterface对象)。然后调用PeerConnection的CreateAnswer方法(产生的local sdp应该还是会通过CreateSessionDescriptionObserver的OnSuccess回调给出,最终还是通过PeerConnection的SetLocalDescription方法设置)。

整个过程本质就是获取本地SDP信息和远端SDP信息,再进行协商,流程可以概括为如下图。

在这里插入图片描述

上述流程都是异步,所以会有状态回调来告知应用状态。主要的两个Observer就是CreateSessionDescriptionObserver和PeerConnectionObserver,前者是告知sdp创建,协商的状态。后者是PC对象的状态。

在这里插入图片描述

Conductor类在examples/peerconnection/client/conductor.h,是webrtc native的pc对象封装示例代码。实现一个pc client,可以参照它的实现,首先是要继承CreateSessionDescriptionObserver和PeerConnectionObserver,再是有PeerConnectionInterface(PC对象)和PeerConnectionFactoryInterface(用于创建PC对象)的成员变量。

一对一通信的时序图

发起通话

在这里插入图片描述

接收通话

在这里插入图片描述

关闭通话

在这里插入图片描述

Android 端的实现

在 Android 端,我们将按以下几个步骤实现 WebRTC 一对一通信:

  1. 申请权限
  2. 引入 WebRTC 库
  3. 构造 PeerConnectionFactory
  4. 创建音视频源
  5. 视频采集
  6. 视频渲染
  7. 创建 PeerConnection
  8. 建立信令系统

各个步骤的详细说明见于:WebRTC 在 Android 端实现一对一通信

iOS 端的实现

在 iOS 端,我们将按以下几个步骤实现 WebRTC 一对一通信:

  1. 申请权限
  2. 引入 WebRTC 库
  3. 构造 PeerConnectionFactory
  4. 创建音视频源
  5. 视频采集
  6. 本地视频预览
  7. 建立信令系统
  8. 创建 RTCPeerConnection
  9. 远端视频渲染

各个步骤的详细说明见于:WebRTC 在 iOS 端实现一对一通信

各开发方案的比较

  1. Native 方案:通过底层 API 实现。开发出的应用程序执行效率高,占用空间小,可做深度定制化开发。劣势是开发成本高,且需要针对 Windows 和 Mac 系统编写两天代码。
  2. Electron 方案:基于 Chrome 浏览器内核。开发语言是 JS,只需要编写一套代码就可以在各个终端上运行,且效果一致。
  3. Flutter 方案:由 Google 推出,适用于各类型终端,执行效率与 Native 类似。

参考

  1. https://blog.youkuaiyun.com/mo4776/article/details/136061794
  2. https://webrtc.github.io/webrtc-org/native-code/native-apis/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值