webrtc是一个实时通讯技术,很简单的应用在web浏览器中应用实时通讯技术,包括音视频通话。在使用webrtc技术时,浏览器端都已经基本封装好,只要调用相应的api,就可实现简单的通话,其中一个主要对象就是RTCPeerConnection 支持音频和视频媒体数据通信。本文我们就分享一下一套完整的对等通信是如何实现的。
webrtc::PeerConnectionObserver接口类中有三个虚函数OnSignalingChange()、OnIceGatheringChange()、OnIceConnectionChange()用于传递PeerConnection中的状态信息。
enum SignalingState {
kStable, // "stable"
kHaveLocalOffer, // "have-local-offer"
kHaveLocalPrAnswer, // "have-remote-offer"
kHaveRemoteOffer, // "have-local-pranswer"
kHaveRemotePrAnswer, // "have-remote-pranswer"
kClosed, // "closed"
};
“stable”:没有进行中的SDP交换。要么是刚刚创建,还没有开始SDP交换;要么是协商已经完成,连接成功建立。
“have-local-offer”:已经创建了本地提案,并成功的调用了SetLocalDescription()。
“have-remote-offer”:收到了对端的提案,并成功的调用了SetRemoteDescription()。
“have-local-pranswer”:已经创建了本地应答,并成功的调用了SetLocalDescription()。
“have-remote-pranswer”:收到了对端的提案,并成功的调用了SetRemoteDescription()。
“closed”:连接已关闭
C++音视频开发学习资料:点击领取→音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
enum IceGatheringState {
kIceGatheringNew = 0, // "new"
kIceGatheringGathering, // "gathering"
kIceGatheringComplete, // "complete"
};
“new”:刚刚创建,还没有开始收集ICE候选者信息。
“gathering”:正在收集ICE候选者信息
“complete”:完成了ICE候选者信息的收集,已经向对等端发送了ICE候选者结束标识。
enum IceConnectionState {
kIceConnectionNew, // "new"
kIceConnectionChecking, // "checking"
kIceConnectionConnected, // "connected"
kIceConnectionCompleted, // "completed"
kIceConnectionFailed, // "failed"
kIceConnectionDisconnected, // "disconnected"
kIceConnectionClosed, // "closed"
};
“new”:正在收集候选地址,或者正在等待对端返回ICE候选者地址。
“checking”:收到了对等端返回的ICE候选者地址,正在进行配对。
“connected”:找到了一条可用的网络连接。为了找到一条更优的网络路径,仍会继续进行ICE候选者地址收集和配对。
“completed”:结束了ICE候选者地址的收集,并从对端收到没有更多ICE候选者地址的指令,最终执行配对过程,成功找到了可用的网络连接。
“failed”:网络连接中断,这是一个可恢复的短暂状态,在弱网环境可能会频繁触发。
“disconnected”:完成了ICE候选者收集,但是因为没有成功连通的候选者对导致配置失败。除非ICE重启,否则该状态不会恢复,同时该状态不会导致DTLS传输层关闭。
“closed”:连接已关闭,不再响应STUN请求。
留言与评论(共有 0 条评论) “” |