You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
3.0 KiB

class ImWebRtc {
constructor() {
this.configuration = {}
this.stream = null;
}
}
ImWebRtc.prototype.isEnable = function() {
window.RTCPeerConnection = window.RTCPeerConnection || window.webkitRTCPeerConnection || window
.mozRTCPeerConnection;
window.RTCSessionDescription = window.RTCSessionDescription || window.webkitRTCSessionDescription || window
.mozRTCSessionDescription;
window.RTCIceCandidate = window.RTCIceCandidate || window.webkitRTCIceCandidate || window
.mozRTCIceCandidate;
return !!window.RTCPeerConnection;
}
ImWebRtc.prototype.init = function(configuration) {
this.configuration = configuration;
}
ImWebRtc.prototype.setupPeerConnection = function(callback) {
this.peerConnection = new RTCPeerConnection(this.configuration);
this.peerConnection.ontrack = (e) => {
// 对方的视频流
callback(e.streams[0]);
};
}
ImWebRtc.prototype.setStream = function(stream) {
if(this.stream){
this.peerConnection.removeStream(this.stream)
}
stream.getTracks().forEach((track) => {
this.peerConnection.addTrack(track, stream);
});
this.stream = stream;
}
ImWebRtc.prototype.onIcecandidate = function(callback) {
this.peerConnection.onicecandidate = (event) => {
// 追踪到候选信息
if (event.candidate) {
callback(event.candidate)
}
}
}
ImWebRtc.prototype.onStateChange = function(callback) {
// 监听连接状态
this.peerConnection.oniceconnectionstatechange = (event) => {
let state = event.target.iceConnectionState;
console.log("ICE连接状态变化: : " + state)
callback(state)
};
}
ImWebRtc.prototype.createOffer = function() {
return new Promise((resolve, reject) => {
const offerParam = {};
offerParam.offerToRecieveAudio = 1;
offerParam.offerToRecieveVideo = 1;
// 创建本地sdp信息
this.peerConnection.createOffer(offerParam).then((offer) => {
// 设置本地sdp信息
this.peerConnection.setLocalDescription(offer);
// 发起呼叫请求
resolve(offer)
}).catch((e) => {
reject(e)
})
});
}
ImWebRtc.prototype.createAnswer = function(offer) {
return new Promise((resolve, reject) => {
// 设置远端的sdp
this.setRemoteDescription(offer);
// 创建本地dsp
const offerParam = {};
offerParam.offerToRecieveAudio = 1;
offerParam.offerToRecieveVideo = 1;
this.peerConnection.createAnswer(offerParam).then((answer) => {
// 设置本地sdp信息
this.peerConnection.setLocalDescription(answer);
// 接受呼叫请求
resolve(answer)
}).catch((e) => {
reject(e)
})
});
}
ImWebRtc.prototype.setRemoteDescription = function(offer) {
// 设置对方的sdp信息
this.peerConnection.setRemoteDescription(new RTCSessionDescription(offer));
}
ImWebRtc.prototype.addIceCandidate = function(candidate) {
// 添加对方的候选人信息
this.peerConnection.addIceCandidate(new RTCIceCandidate(candidate));
}
ImWebRtc.prototype.close = function(uid) {
// 关闭RTC连接
if (this.peerConnection) {
this.peerConnection.close();
this.peerConnection.onicecandidate = null;
this.peerConnection.onaddstream = null;
}
}
export default ImWebRtc;