#簡單剖析webrtc,並結合easyrtc與coturn(stun,turn)服務實現音視頻聊天html
webRTC全稱爲Web Real-Time Communications,即web實時通信前端
音視頻聊天實現前提,跟直播不同哦~api類型繁多,有的也過期了,見到有不一樣的就翻翻MDN,換個方案吧,谷歌須要https或者localhost才能開啓媒體權限,火狐則不須要,但作兼容很費工夫。localhost下就本身開兩個網頁測吧,後面會講easyrtcnode
簡化文章內容介紹,webrtc流程,如下在內網中能夠運行git
navigator.mediaDevices.getUserMedia({
audio: true,
video: true,
}).then((stream) => {
let video = document.querySelector('#video')
video.srcObject = stream // mediaDevices.getUserMedia獲取到的音視頻流捆綁在video標籤上
video.onloadedmetadata = () => video.play() // 讀取數據時進行播放
})
複製代碼
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
easyRTCweb
通過屢次測試,本身的RTCdemo兼容性差,目前測試階段就不手寫了。採用了easyRTC,除了safari和古董ie不行,其餘方面仍是ok的。github.com/priologic/e…json