步骤:
1:clientA建立peer对象,打开本地媒体流,将媒体流添加到peer中。调用peer对象的createOffer方法建立一个用于offer的sdp
2:clientA将sdp传送到服务端
3:服务端将sdp发送给clientB
4:clientB建立peer对象,保存clientA的sdp并生成answer的sdp
5:clientB将sdp传送到服务端
6:服务端将sdp发送给clientA
7:clientA保存clientB的sdp到本地
8:clientA和clientB进行点对点通讯html
其余补充:
1:webRTC通讯使用tcp协议
2:点对点通讯路由查找相关:ice、iceServers
3:NAT传透参考博客:https://www.jianshu.com/p/373...
4:sdp:通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明、会话邀请、会话初始化web
1:RTCPeerConnection:构建两个终端链接的api
2:getUserMedia:访问设备的摄像头及麦克风,获取音频,视频流
3:RTCDataChannel:传输任意数据,此处用的少api
createOffer():带有特定的配置信息寻找远端匹配机器(peer)的请求
createAnswer():在协调一条链接中的两端offer/answers时,根据从远端发来的offer生成一个answer
addStream():添加媒体流到远端
removeStream():删除媒体流
onaddstream():监听远端传来的媒体流tcp
getSenders()->getStats():获取发送出去的通话质量数据
type:发送方向(主要检测inBound-rtp)
bytesSent:发送的字节数(累计)
meidaType:媒体类型
packageSent:发送的包数
retransmittedPacketsSent:重传包数
retransmittedPacketsSent:重传字节数ide
getReceivers()->getStats():获取接收的通话质量数据
type:发送方向(主要检测inBound-rtp)
bytesReceived:接收的字节数(累计)
meidaType:媒体类型
packetsReceived :接收的包数(累计)
packetsLost:丢包数
jitter:抖动值spa
navigator.mediaDevices.getUserMedia({
audio:true || {},
video:true || {}
}).then((stream)=>{})
getUserMedia传递的参数为媒体流的配置:如麦克风,摄像头的配置视频
navigator.mediaDevices.getDisplayMedia({
audio:true || {},
video:true || {}
}).then((stream)=>{})
获取终端设备信息:
navigator.mediaDevices.enumerateDevices().then(arr=>{})
获取摄像头,麦克风型号等,经常使用户摄像头先后切换前获取摄像头数据htm
stream中视频流和音频流是两个不一样的track
方法一:
stream.getVideoTracks():获取视频流
stream.getAudioTracks():获取音频流
stream. addTrack():添加某个流
stream.removeTrack(track):删除某个流
方法二:
stream.getTracks().forEach((track)=>{
track信息:track.kind(track类型)
设置api:track.stop(),track.replaceTrack()
})对象
stream表明媒体流
stream.getVideoTracks()[0].enabled=true/falseblog
更新媒体流,两个终端从新协商sdp。步骤:
1:offer方:删除旧的媒体流,添加新的媒体流。从新生成offer的sdp,发送到远端
2:answer方:删除旧的媒体流,添加新的媒体流。保存远端媒体流,从新生成answer的sdp,发送到远端
3:offer方:保存元媒体流
参考文档:https://www.webrtc-experiment.com/docs/how-to-switch-streams.html