webRTC PC端API使用

webRTC通信过程:

webRTC PC端API使用_第1张图片
步骤:
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进行点对点通信

其他补充:
1:webRTC通信使用tcp协议
2:点对点通信路由查找相关:ice、iceServers
3:NAT传透参考博客:https://www.jianshu.com/p/373...
4:sdp:通用的会话描述协议,主要用来描述多媒体会话,用途包括会话声明、会话邀请、会话初始化

三个主要API:

1:RTCPeerConnection:构建两个终端连接的api
2:getUserMedia:访问设备的摄像头及麦克风,获取音频,视频流
3:RTCDataChannel:传输任意数据,此处用的少

RTCPeerConnection相关API:
通信过程使用api及参数:

createOffer():带有特定的配置信息寻找远端匹配机器(peer)的请求
createAnswer():在协调一条连接中的两端offer/answers时,根据从远端发来的offer生成一个answer
addStream():添加媒体流到远端
removeStream():删除媒体流
onaddstream():监听远端传来的媒体流

通话质量检测api及参数:

getSenders()->getStats():获取发送出去的通话质量数据
type:发送方向(主要检测inBound-rtp)
bytesSent:发送的字节数(累计)
meidaType:媒体类型
packageSent:发送的包数
retransmittedPacketsSent:重传包数
retransmittedPacketsSent:重传字节数

getReceivers()->getStats():获取接收的通话质量数据
type:发送方向(主要检测inBound-rtp)
bytesReceived:接收的字节数(累计)
meidaType:媒体类型
packetsReceived :接收的包数(累计)
packetsLost:丢包数
jitter:抖动值

getUserMedia相关API:
获取媒体流:

navigator.mediaDevices.getUserMedia({
audio:true || {},
video:true || {}
}).then((stream)=>{})
getUserMedia传递的参数为媒体流的配置:如麦克风,摄像头的配置

获取屏幕共享媒体流:

navigator.mediaDevices.getDisplayMedia({
audio:true || {},
video:true || {}
}).then((stream)=>{})
获取终端设备信息:
navigator.mediaDevices.enumerateDevices().then(arr=>{})
获取摄像头,麦克风型号等,常用户摄像头前后切换前获取摄像头数据

媒体流的设置:

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/false

视频通话过程中切换前后摄像头

1:根据摄像头id重新获取媒体流
2: 切换原媒体流(replaceTrack),切换代码示例如下:

onsuccess: function(stream){

 let videoTracks = stream.getVideoTracks();
 self.localStream.addTrack(videoTracks[0]);
 if (!RTCRtpTransceiver.prototype.setDirection) {
      pc.getSenders()[1].replaceTrack(videoTracks[0]);
      pc.getTransceivers()[1].direction = 'sendrecv';
 } else {
      if (pc.getTransceivers().length >= 3) {
             p1.getTransceivers()[2].stop();
      } 
      pc.getTransceivers()[1].setDirection('sendrecv');     }

},

你可能感兴趣的:(webrtc,javascript)