biaobro 2019-06-28
音视频聊天实现前提,跟直播不一样哦~api类型繁多,有的也过时了,见到有不同的就翻翻MDN,换个方案吧,谷歌需要https或者localhost才能开启媒体权限,火狐则不需要,但做兼容很费工夫。localhost下就自己开两个网页测吧,后面会讲easyrtc
理解webrtc的工作流程 https://juejin.im/post/5b3f50...
简化文章内容介绍,webrtc流程,以下在内网中可以运行
navigator.mediaDevices.getUserMedia({ audio: true, video: true, }).then((stream) => { let video = document.querySelector('#video') video.srcObject = stream // mediaDevices.getUserMedia获取到的音视频流捆绑在video标签上 video.onloadedmetadata = () => video.play() // 读取数据时进行播放 })
2.进行peertopeer点对点连接,
let peer = new RTCPeerConnection(servers) pc.createOffer(sendOffer, function (error) { console.log('发送 offer 失败') }) function sendOffer (desc) { console.log('sendOffer') pc.setLocalDescription(desc); socket.emit('offer', JSON.stringify({ data: {sdp: desc} }) ) }
pc.onicecandidate = function(event) { if (event.candidate !== null) { socket.emit("_ice_candidate",JSON.stringify({ type: '_candidate', data: { candidate: event.candidate } }) ) } };
socket.on('offer', function(e) { getUserMedia(function (stream) { let vid1 = document.getElementById('vid1') vid1.srcObject = stream vid1.onloadedmetadata = function(e) { vid1.play(); }; pc.addStream(stream) var json = JSON.parse(e) pc.setRemoteDescription(new RTCSessionDescription(json.data.sdp)); pc.createAnswer(sendAnswer, function (error) { console.log('创建answer失败') }) }, function (error) { console.log('摄像头获取失败', '接听视频失败'); }) }) function sendAnswer(desc) { pc.setLocalDescription(desc); socket.emit('answer', JSON.stringify({ type: '_answer', data: { sdp: desc } })) }
socket.on('answer', async function(e) { let data = e.message await peer.setRemoteDescription(data) })
外网实现点对点音视频聊天 ICE(结合stun,turn进行穿透获取音视频双方地址)
STUN解析
TURN解析
NAT作用是啥
easyRTC
部署WebRTC 或 SIP p2p 方案时经常会遇到p2p 无法穿透的环境,这时就是TunServer 的用武之地了。添加完成后,就可以在webrtc 里面使用stun 和tun server 了。