音視頻聊天實現前提,跟直播不同哦~api類型繁多,有的也過期了,見到有不一樣的就翻翻MDN,換個方案吧,谷歌須要https或者localhost才能開啓媒體權限,火狐則不須要,但作兼容很費工夫。localhost下就本身開兩個網頁測吧,後面會講easyrtchtml
理解webrtc的工做流程 https://juejin.im/post/5b3f50...前端
簡化文章內容介紹,webrtc流程,如下在內網中能夠運行node
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點對點鏈接,git
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進行穿透獲取音視頻雙方地址)github
STUN解析web
TURN解析json
NAT做用是啥api
easyRTC服務器