WebRTC 各端的互联互通
- WebRTC 各端的互联互通
- WebRTC Native 的核心
- 一对一通信的时序图
- 发起通话
- 接收通话
- 关闭通话
- Android 端的实现
- iOS 端的实现
- 各开发方案的比较
- 参考
WebRTC 各端的互联互通
WebRTC Native 的核心
正如 WebRTC Web 端的核心是 RTCPeerConnection,WebRTC Native 的核心对象是 PeerConnectionFactory。可以通过它创建 Track、MediaStream、PeerConnection 等对象,还可以通过它指定音视频的编解码器、设置编解码器的参数、开启回声消除等功能,甚至为 WebRTC 指定工作线程、信号线程等。
但从功能上讲,PeerConnectionFactory 还是无法与 RTCPeerConnection 相比,它们最大的不同是,RTCPeerConnection 可以传输数据,而 PeerConnectionFactory 不行。RTCPeerConnection 所做的事情需要由 PeerConnectionFactory 和 PeerConnection 对象加在一起才能完成。
WebRTC Native 处理流程:
那么通过PeerConnection对象建立音视频通话,包括如下步骤:
- 创建PeerConnectionFactory,通过工厂方法webrtc::CreatePeerConnectionFactory。
- 创建PeerConnection,通过它的PeerConnectionFactory的CreatePeerConnection方法。
- 调用PeerConnectionFactory的CreateAudioTrack和CreateVideoTrack方法创建Track。
- 调用PeerConncetion的 AddTrack方法添加Track,track最终会反映到sdp中的m行中。协商成功的Track在随后会通过onAddTrack回调告知应用层,根据Track的类型来确定是回放视频还是音频。
- 如果是本地为发起端则需调用PeerConnection的CreateOffer方法,产生本地SDP信息(抽象为webrtc::SessionDescriptionInterface对象),触发CreateSessionDescriptionObserver中OnSuccess方法,在OnSuccess方法中调用PeerConnection的SetLocalDescription方法,获取sdp字符串后通过信令协议给到远端。
- 如果远端是发起,在收到信令服务传来的远端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 一对一通信:
- 申请权限
- 引入 WebRTC 库
- 构造 PeerConnectionFactory
- 创建音视频源
- 视频采集
- 视频渲染
- 创建 PeerConnection
- 建立信令系统
各个步骤的详细说明见于:WebRTC 在 Android 端实现一对一通信。
iOS 端的实现
在 iOS 端,我们将按以下几个步骤实现 WebRTC 一对一通信:
- 申请权限
- 引入 WebRTC 库
- 构造 PeerConnectionFactory
- 创建音视频源
- 视频采集
- 本地视频预览
- 建立信令系统
- 创建 RTCPeerConnection
- 远端视频渲染
各个步骤的详细说明见于:WebRTC 在 iOS 端实现一对一通信。
各开发方案的比较
- Native 方案:通过底层 API 实现。开发出的应用程序执行效率高,占用空间小,可做深度定制化开发。劣势是开发成本高,且需要针对 Windows 和 Mac 系统编写两天代码。
- Electron 方案:基于 Chrome 浏览器内核。开发语言是 JS,只需要编写一套代码就可以在各个终端上运行,且效果一致。
- Flutter 方案:由 Google 推出,适用于各类型终端,执行效率与 Native 类似。
参考
- https://blog.csdn.net/mo4776/article/details/136061794
- https://webrtc.github.io/webrtc-org/native-code/native-apis/