#简单剖析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