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通信原理