WebRTC需要通过长链接查找到通信双方,然后通过 peer to peer 的方式传输音频数据。
PeerConnection
PeerConnection是WebRTC中封装的对象。每一路的音视频会话都会有唯一的一个PeerConnection对象,WebRTC通过这个PeerConnection对象进行视频的发起、传输、接收和挂断等操作。
PeerConnection中包含的属性如下:
- localDescription:本地描述信息,类型:
RTCSessionDescription - remoteDescription:远端描述信息,类型:
RTCSessionDescription - onicecandidate:传入一个回调方法,该回调方法有一个返回参数,返回参数类型为:
RTCIceCandidateEvent, - onaddstream:传入一个回调方法,该回调方法有一个返回参数,返回参数类型为:“,如果检测到有远程媒体流传输到本地之后便会调用该方法。
- setLocalDescription:设置本地offer,将自己的描述信息加入到
PeerConnection中,参数类型:RTCSessionDescription - setRemoteDescription:设置远端的
answer,将对方的描述信息加入到PeerConnection中,参数类型:RTCSessionDescription - createOffer:创建一个offer,需要传入两个参数,第一个参数是创建offer成功的回调方法,会返回创建好的offer,可以在这里将这个offer发送出去。第二个参数是创建失败的回调方法,会返回错误信息。
- createAnswer:创建一个
answer,需要传入两个参数,第一个参数是创建answer成功的回调方法,会返回创建好的answer,可以在这里将这个answer发送出去。第二个参数是创建失败的回调方法,会返回错误信息。 - addIceCandidate:将打洞服务器加入到配置信息中,参数类型:
RTCIceCandidate - addStream:向
PeerConnection中加入需要发送的数据流,参数类型:MediaStream
RTCSessionDescription
RTCSessionDescription类型中包含了两个属性:
- sdp:这个包含了所有的音视频的配置信息。
- type:这个指明了是视频的接收方还是发起方,这个将在之后进行讨论。
通信过程
A向B发起通信请求
- A链接socket;
- A获取音频数据;
- A创建一个
Ice Candidate; - A通过创建好的
Ice Candidate创建一个PeerConnection; - A创建一个
offer,offer中包含了视频设置sdp,将创建好的offer设置为PeerConnection的localDescription; - A同时将创建的
offer和Ice Candidate通过socket发送给B; - 将A获取到的音频数据存入
PeerConnection; - 如果B先接收到A发过来的
offer,那么先将offer存起来,等到接收到A发过来的Ice Candidate后通过Ice Candidate创建一个PeerConnection,再将保存好的offer设置为PeerConnection的remoteDescription。
如果B先接收到A发过来的Ice Candidate,那么通过A发过来的Ice Candidate创建一个PeerConnection,然后等待接收到A发过来的offer,再将A发过来的offer设置为PeerConnection的remoteDescription; - B接收到A发过来的
offer后要创建一个answer,将answer设置为PeerConnection的localDescription。并且将创建的answer通过socket返回给A。 - B开始获取音频数据,将音频数据存入
PeerConnection中,WebRTC便会自动将音频数据发送给A。 - A接收到B返回的
answer,将B返回的answer设置为PeerConnection的remoteDescription。 - 这个时候WebRTC会将音频数据自动发送给B,A和B就建立起了实时音频通信。
本文链接地址: WebRTC通信原理