一.前言
- 使用Webrtc实现1对1的音视频通话,先从Web端进行学习要比直接从Android端进行学习要轻松许多(若没有JS和Html以及Node基础,查找相关基础教程,能梳理代码的逻辑即可)。
- 本文Android端接入Webrtc是通过引入官方的sdk来实现的。
- 本文涉及到的Demo代码包含三部分,服务器端、Web端、Android端。服务器端使用的是Node,Web使用的是Html和JS,Android端使用的是Kotlin。
- 单单通过一篇文章将"Webrtc实现1对1的音视频通话"全面进行讲解是不现实的,本文的目标 : 梳理端对端的基本流程以及Android端引入Webrtc后所涉及的核心类的讲解 。
二.效果演示
- 源码下载地址,包含服务器端,Web端,Android端,仅在本地环境才能测试。需要将项目的IP改成自己所处环境的IP地址,其它保持不变。服务器端运行需要使用node命令。
- Android端测试效果(Web端略)
三.Web端与Web端连接的基本流程
-
大体分为三部分,媒体协商,candidate交换,传输数据。如下图:
-
场景分析 :现在假设有用户A和用户B(对应上图),两者先后加入同一个房间,用户A先加入,B其次,结合代码来进行流程的梳理。
3.1.媒体协商过程
- A和B加入房间之后(加入之前已经连接websocket成功),由于A先加入,(根据代码可以知道)A 会收到 new-peer 信令,B 收到 resp-join 信令;
- A 会执行 createPeerConnection 函数( 内部创建 RTCPeerConnection 对象,设置多个回调RTCPeerConnection 的 onicecandidate、ontrack、onconnectionstatechange 和 oniceconnectionstatechange) & 调用 RTCPeerConnection 的 createOffer & RTCPeerConnection 的 setLocalDescription & send offer 信令 ;
- B 那边那边是设置了监听的,当有offer信令传递过来是,B会执行 createPeerConnection(& 设置多个回调-同A) & setRemoteDescription & setLocalDescription & 发送answer信令;
- A 收到 B 发送过来的 answer信令,会调用 RTCPeerConnection的 setRemoteDescription;
- 到此,媒体协商阶段结束;
3.2.candidate 的交互
- 经过媒体协商阶段,设置的 RTCPeerConnection 的 onicecandidate回调会被触发,A | B 会给彼此发送 candidate 信令,当收到彼此的 candidate 信令,会调用 RTCPeerConnection 的 addIceCandidate;
3.3.传输数据
- 通道打通了,开始传输数据。
四.Android端引入Webrtc所涉及的核心类
- Android引入Webrtc的sdk之后,Api调用方面相对web端要复杂些,涉及的类比较多,有:VideoCapturer、VideoTrack、AudioTrack、VideoSource、MediaStream、VideoSink,PeerConnectionFactory、PeerConnection、PeerConnection.Observer、SdpObserver,我们重点关注后面四个,其它的我们可以直接看项目代码注释来辅助理解。
- PeerConnectionFactory:创建PeerConnection、MediaStream、VideoSource、VideoTrack、AudioSource、AudioTrack等工作;
- PeerConnection:通过PeerConnectionFactory来创建,要注入PeerConnection.Observer观察者;
- PeerConnection.Observer:主要关注 onIceCandidate 和 onAddTrack回调。
- onIceCandidate :回调时机同web端,内部所指定的逻辑是,做信令服务器的转发;
- onAddTrack:执行远端显示的关联操作
- SdpObserver:可以用来用来观察 createOffer 和 createAnswer 是否操作成功,在回调中做设置本地 sdp,以及发送offfer或answer的信令;
五.总结
- 本文重点梳理了使用WebRTC实现1对1音视频通话端对端的基本流程,流程分为三部分:媒体协商(交换SDP信息)、candidate交换(建立网络连接)、数据传输。同时对Android端引入Webrtc,其核心类的讲解。
评论区